在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Android/ 自定義動(dòng)畫(huà)
檢測(cè)常用的手勢(shì)
優(yōu)化layout的層級(jí)
用戶輸入
管理應(yīng)用的內(nèi)存
聯(lián)系人信息
開(kāi)發(fā)輔助程序
Android多媒體
添加語(yǔ)音功能
顯示位置地址
提供向下與橫向?qū)Ш?/span>
支持游戲控制器
訪問(wèn)可穿戴數(shù)據(jù)層
處理多點(diǎn)觸控手勢(shì)
全屏沉浸式應(yīng)用
為多線程創(chuàng)建管理器
數(shù)據(jù)保存
Intent的發(fā)送
更新Notification
優(yōu)化下載以高效地訪問(wèn)網(wǎng)絡(luò)
打印
打包可穿戴應(yīng)用
接收從其他App傳送來(lái)的數(shù)據(jù)
發(fā)送與接收消息
建立靈活動(dòng)態(tài)的UI
處理鍵盤(pán)輸入
Building a Work Policy Controller
建立測(cè)試環(huán)境
創(chuàng)建表盤(pán)
分享文件
顯示Notification進(jìn)度
實(shí)現(xiàn)自適應(yīng)UI流(Flows)
使用設(shè)備管理策略增強(qiáng)安全性
使用能感知版本的組件
執(zhí)行網(wǎng)絡(luò)操作
建立文件分享
添加移動(dòng)
更新你的Security Provider來(lái)對(duì)抗SSL漏洞利用
支持鍵盤(pán)導(dǎo)航
創(chuàng)建和監(jiān)視地理圍欄
發(fā)送并同步數(shù)據(jù)
使用BigView樣式
無(wú)線連接設(shè)備
提供向上導(dǎo)航與歷史導(dǎo)航
最小化定期更新造成的影響
實(shí)現(xiàn)向下的導(dǎo)航
支持不同的屏幕大小
Android 可穿戴應(yīng)用
添加動(dòng)畫(huà)
顯示聯(lián)系人頭像
使用OpenGL ES顯示圖像
處理輸入法可見(jiàn)性
分享文件
保持設(shè)備喚醒
淡化系統(tǒng)Bar
使用NFC分享文件
保存到Preference
Android聯(lián)系人信息與位置信息
創(chuàng)建標(biāo)準(zhǔn)的網(wǎng)絡(luò)請(qǐng)求
使用Drawables
管理Bitmap的內(nèi)存使用
管理Activity的生命周期
按需加載視圖
傳輸資源
為可穿戴設(shè)備創(chuàng)建自定義UI
在一個(gè)線程中執(zhí)行一段特定的代碼
性能優(yōu)化
隱藏導(dǎo)航欄
創(chuàng)建目錄瀏覽器
為多種大小的屏幕進(jìn)行規(guī)劃
View間漸變
使用觸摸手勢(shì)
高效加載大圖
使用CursorLoader在后臺(tái)加載數(shù)據(jù)
創(chuàng)建抽屜式導(dǎo)航(navigation drawer)
管理音頻焦點(diǎn)
創(chuàng)建后臺(tái)服務(wù)
創(chuàng)建功能測(cè)試
創(chuàng)建使用Material Design的應(yīng)用
停止與重啟Activity
添加一個(gè)簡(jiǎn)便的分享功能
啟動(dòng)Activity時(shí)保留導(dǎo)航
TV應(yīng)用清單
創(chuàng)建向后兼容的UI
?# 優(yōu)化自定義View
創(chuàng)建單元測(cè)試
在UI上顯示Bitmap
建立OpenGL ES的環(huán)境
構(gòu)建表盤(pán)服務(wù)
JNI Tips
建立搜索界面
實(shí)現(xiàn)自定義View的繪制
使用HTTPS與SSL
按需操控BroadcastReceiver
分享簡(jiǎn)單的數(shù)據(jù)
繪制形狀
Android位置信息
創(chuàng)建并運(yùn)行可穿戴應(yīng)用
執(zhí)行 Sync Adpater
獲取最后可知位置
創(chuàng)建 Android 項(xiàng)目
實(shí)現(xiàn)高效的導(dǎo)航
退出全屏的Activity
創(chuàng)建Card
兼容音頻輸出設(shè)備
同步數(shù)據(jù)單元
傳輸數(shù)據(jù)時(shí)避免消耗大量電量
保存到文件
緩存Bitmap
提供配置 Activity
調(diào)度重復(fù)的鬧鐘
實(shí)現(xiàn)輔助功能
重復(fù)的下載是冗余的
隱藏狀態(tài)欄
實(shí)現(xiàn)自定義的網(wǎng)絡(luò)請(qǐng)求
規(guī)劃界面和他們之間的關(guān)系
使用Sync Adapter傳輸數(shù)據(jù)
TV應(yīng)用內(nèi)搜索
響應(yīng)觸摸事件
使用Google Cloud Messaging(已廢棄)
控制相機(jī)
Android網(wǎng)絡(luò)連接與云服務(wù)
請(qǐng)求分享一個(gè)文件
處理TV硬件
響應(yīng)UI可見(jiàn)性的變化
使用網(wǎng)絡(luò)服務(wù)發(fā)現(xiàn)
指定輸入法類型
優(yōu)化電池壽命
創(chuàng)建TV應(yīng)用
獲取聯(lián)系人列表
拖拽與縮放
啟動(dòng)與停止線程池中的線程
創(chuàng)建 Sync Adpater
使用 WiFi P2P 服務(wù)發(fā)現(xiàn)
開(kāi)始使用Material Design
代理至新的APIs
使用include標(biāo)簽重用layouts
使得View可交互
高效顯示Bitmap
創(chuàng)建企業(yè)級(jí)應(yīng)用
Fragments之間的交互
創(chuàng)建與執(zhí)行測(cè)試用例
綜合:設(shè)計(jì)我們的樣例 App
繪制表盤(pán)
建立簡(jiǎn)單的用戶界面
自定義動(dòng)畫(huà)
開(kāi)發(fā)輔助服務(wù)
避免出現(xiàn)程序無(wú)響應(yīng)ANR(Keeping Your App Responsive)
使用ViewPager實(shí)現(xiàn)屏幕滑動(dòng)
設(shè)計(jì)高效的導(dǎo)航
Android分享操作(Building Apps with Content Sharing)
提供向后的導(dǎo)航
保持向下兼容
創(chuàng)建TV播放應(yīng)用
縮放View
使用 WiFi 建立 P2P 連接
Android后臺(tái)任務(wù)
連接到網(wǎng)絡(luò)
為 Notification 添加頁(yè)面
使TV應(yīng)用是可被搜索的
添加Action Bar
使用Material的主題
啟動(dòng)另一個(gè)Activity
顯示正在播放卡片
適配不同的系統(tǒng)版本
輕松錄制視頻
創(chuàng)建可穿戴的應(yīng)用
創(chuàng)建自定義的布局
重新創(chuàng)建Activity
使用CursorLoader執(zhí)行查詢?nèi)蝿?wù)
使用舊的APIs實(shí)現(xiàn)新API的效果
使用備份API
安全要點(diǎn)
Android入門(mén)基礎(chǔ):從這里開(kāi)始
保存并搜索數(shù)據(jù)
根據(jù)網(wǎng)絡(luò)連接類型來(lái)調(diào)整下載模式
使用Tabs創(chuàng)建Swipe視圖
SMP(Symmetric Multi-Processor) Primer for Android
解析 XML 數(shù)據(jù)
使用 Volley 傳輸網(wǎng)絡(luò)數(shù)據(jù)
建立ActionBar
Android交互設(shè)計(jì)
使用Intent修改聯(lián)系人信息
增加搜索功能
輕松拍攝照片
定義形狀
測(cè)試你的Activity
在 Notifcation 中接收語(yǔ)音輸入
與其他應(yīng)用的交互
管理系統(tǒng)UI
追蹤手勢(shì)移動(dòng)
Android界面設(shè)計(jì)
執(zhí)行 Android 程序
顯示確認(rèn)界面
創(chuàng)建Lists與Cards
打印HTML文檔
創(chuàng)建TV應(yīng)用
為多屏幕設(shè)計(jì)
定義Shadows與Clipping視圖
使用Fragment建立動(dòng)態(tài)UI
接收Activity返回的結(jié)果
布局變更動(dòng)畫(huà)
定位常見(jiàn)的問(wèn)題
自定義ActionBar的風(fēng)格
定義Layouts
發(fā)送簡(jiǎn)單的網(wǎng)絡(luò)請(qǐng)求
啟動(dòng)與銷(xiāo)毀Activity
與UI線程通信
非UI線程處理Bitmap
創(chuàng)建TV布局
提升Layout的性能
報(bào)告任務(wù)執(zhí)行狀態(tài)
判斷并監(jiān)測(cè)網(wǎng)絡(luò)連接狀態(tài)
兼容不同的設(shè)備
處理按鍵動(dòng)作
優(yōu)化性能和電池使用時(shí)間
給其他App發(fā)送簡(jiǎn)單的數(shù)據(jù)
Implementing App Restrictions
向后臺(tái)服務(wù)發(fā)送任務(wù)請(qǐng)求
展示Card翻轉(zhuǎn)動(dòng)畫(huà)
管理ViewGroup中的觸摸事件
兼容不同的屏幕密度
通過(guò)藍(lán)牙進(jìn)行調(diào)試
為可穿戴設(shè)備創(chuàng)建Notification
控制音量與音頻播放
獲取聯(lián)系人詳情
在表盤(pán)上顯示信息
提供向上的導(dǎo)航
滾動(dòng)手勢(shì)動(dòng)畫(huà)
幫助用戶在TV上找到內(nèi)容
創(chuàng)建TV導(dǎo)航
為索引指定App內(nèi)容
ActionBar的覆蓋疊加
Android Wear 上的位置檢測(cè)
保護(hù)安全與隱私的最佳策略
Ensuring Compatibility with Managed Profiles
解決云同步的保存沖突
獲取位置更新
創(chuàng)建List
測(cè)試程序
管理網(wǎng)絡(luò)的使用情況
為App內(nèi)容開(kāi)啟深度鏈接
推薦TV內(nèi)容
建立一個(gè)Notification
管理音頻播放
設(shè)計(jì)表盤(pán)
拍照
處理控制器輸入動(dòng)作
判斷并監(jiān)測(cè)設(shè)備的底座狀態(tài)與類型
處理查詢的結(jié)果
保存到數(shù)據(jù)庫(kù)
支持多個(gè)游戲控制器
創(chuàng)建 Stub Content Provider
使得ListView滑動(dòng)順暢
處理數(shù)據(jù)層的事件
創(chuàng)建TV應(yīng)用的第一步
使得你的App內(nèi)容可被Google搜索
將 Notification 放成一疊
創(chuàng)建 Stub 授權(quán)器
暫停與恢復(fù)Activity
管理設(shè)備的喚醒狀態(tài)
Android圖像與動(dòng)畫(huà)
打印照片
云同步
創(chuàng)建TV直播應(yīng)用
為Notification賦加可穿戴特性
提供一個(gè)Card視圖
建立請(qǐng)求隊(duì)列(RequestQueue)
適配不同的語(yǔ)言
創(chuàng)建詳情頁(yè)
測(cè)試UI組件
接收其他設(shè)備的文件
創(chuàng)建自定義View
建立第一個(gè)App
創(chuàng)建2D Picker
監(jiān)測(cè)電池的電量與充電狀態(tài)
打印自定義文檔
抽象出新的APIs
通知提示用戶
獲取文件信息
運(yùn)用投影與相機(jī)視角
在IntentService中執(zhí)行后臺(tái)任務(wù)
多線程操作
創(chuàng)建一個(gè)Fragment
添加Action按鈕
在不同的 Android 系統(tǒng)版本支持控制器
維護(hù)兼容性
發(fā)送文件給其他設(shè)備
創(chuàng)建TV游戲應(yīng)用
創(chuàng)建自定義的View類
代碼性能優(yōu)化建議
Intent過(guò)濾
適配不同的屏幕

自定義動(dòng)畫(huà)

編寫(xiě): allenlsy - 原文: https://developer.android.com/training/material/animations.html

Material Design中的動(dòng)畫(huà)對(duì)用戶的動(dòng)作進(jìn)行反饋,并提供在整個(gè)交互過(guò)程中的視覺(jué)連續(xù)性。Material 主題為按鈕和Activity切換提供一些默認(rèn)的動(dòng)畫(huà),Android 5.0 (API level 21) 及以上版本支持自定義這些動(dòng)畫(huà)并創(chuàng)建新動(dòng)畫(huà):

  • 觸摸反饋
  • 圓形填充
  • Activity 切換動(dòng)畫(huà)
  • 曲線形動(dòng)作
  • 視圖狀態(tài)變換

自定義觸摸反饋

Material Design中的觸摸反饋,是在用戶與UI元素交互時(shí),提供視覺(jué)上的即時(shí)確認(rèn)。按鈕的默認(rèn)觸摸反饋動(dòng)畫(huà)使用了新的RippleDrawable類,它在按鈕狀態(tài)變換時(shí)產(chǎn)生波紋效果。

大多數(shù)情況下,你需要在你的 XML 文件中設(shè)定視圖的背景來(lái)實(shí)現(xiàn)這個(gè)功能:

  • ?android:attr/selectableItemBackground 用于有界Ripple動(dòng)畫(huà)
  • ?android:attr/selectableItemBackgroundBorderless 用于越出視圖邊界的動(dòng)畫(huà)。它會(huì)被繪制在最近的且不是全屏的父視圖上。

Note:selectableItemBackgroundBorderless 是 API level 21 新加入的屬性

另外,你可以使用ripple元素在XML資源文件中定義一個(gè) RippleDrawable。

你可以給RippleDrawable賦予一個(gè)顏色。要改變默認(rèn)的觸摸反饋顏色,使用主題的android:colorControlHighlight 屬性。

更多信息,參見(jiàn)RippleDrawable類的API文檔。

使用填充效果(Reveal Effect)

填充效果在UI元素出現(xiàn)或隱藏時(shí),為用戶提供視覺(jué)連續(xù)性。ViewAnimationUtils.createCircularReveal()方法可以使用一個(gè)附著在視圖上的圓形,顯示或隱藏這個(gè)視圖。

要用此效果顯示一個(gè)原本不可見(jiàn)的視圖:

// previously invisible view
View myView = findViewById(R.id.my_view);

// get the center for the clipping circle
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;

// get the final radius for the clipping circle
int finalRadius = myView.getWidth();

// create and start the animator for this view
// (the start radius is zero)
Animator anim =
    ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
anim.start();

要用此效果隱藏一個(gè)原本可見(jiàn)的視圖:

// previously visible view
final View myView = findViewById(R.id.my_view);

// get the center for the clipping circle
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;

// get the initial radius for the clipping circle
int initialRadius = myView.getWidth();

// create the animation (the final radius is zero)
Animator anim =
    ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0);

// make the view invisible when the animation is done
anim.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        myView.setVisibility(View.INVISIBLE);
    }
});

// start the animation
anim.start();

自定義Activity切換效果

http://wiki.jikexueyuan.com/project/android-training-geek/images/ContactsAnim.gif" alt="Figure 1 - A transition with shared elements." />

Material Design中的Activity切換,當(dāng)不同Activity之間擁有共有元素,則可以通過(guò)不同狀態(tài)之間的動(dòng)畫(huà)和形變提供視覺(jué)上的連續(xù)性。你可以為共有元素設(shè)定進(jìn)入和退出Activity時(shí)的自定義動(dòng)畫(huà)。

  • 入場(chǎng)變換決定視圖如何入場(chǎng)。比如,在爆炸式入場(chǎng)變換中,視圖從場(chǎng)外飛到屏幕中央。
  • 出場(chǎng)變換決定視圖如何退出。比如,在爆炸式出場(chǎng)變換中,視圖從屏幕中央飛出場(chǎng)外。
  • 共有元素的變換決定一個(gè)共有視圖在兩個(gè)Activity之間如何變換。比如,如果兩個(gè)activity有同一張圖片,但是放在不同位置,以及擁有不同大小,變更圖片 變換會(huì)流暢的把圖片移到相應(yīng)位置,同時(shí)縮放圖片大小。

Android 5.0 (API level 21) 支持這些入場(chǎng)和退出變換:

  • 爆炸 - 把視圖移入或移出場(chǎng)景的中間
  • 滑動(dòng) - 把視圖從場(chǎng)景邊緣移入或移出
  • 淡入淡出 - 通過(guò)改變透明度添加或移除元素

任何繼承于 Visibility 類的變換,都支持被用于入場(chǎng)或退出變換。更多信息,請(qǐng)參見(jiàn) Transition 類的API文檔。

Android 5.0 (API level 21) 還支持這些共有元素變換效果:

  • changeBounds - 對(duì)目標(biāo)視圖的外邊界進(jìn)行動(dòng)畫(huà)
  • chagneClipBounds - 對(duì)目標(biāo)視圖的附著物的外邊界進(jìn)行動(dòng)畫(huà)
  • changeTransform - 對(duì)目標(biāo)視圖進(jìn)行縮放和旋轉(zhuǎn)
  • changeImageTransform - 對(duì)目標(biāo)圖片進(jìn)行縮放

當(dāng)你在應(yīng)用中進(jìn)行activity 變換時(shí),默認(rèn)的淡入淡出效果會(huì)被用在進(jìn)入和退出activity的過(guò)程中。

http://wiki.jikexueyuan.com/project/android-training-geek/images/SceneTransition.png" alt="" />

自定義切換

首先,當(dāng)你繼承Material主題的style時(shí),要通過(guò)android:windowContentTransitions屬性來(lái)開(kāi)啟窗口內(nèi)容變換功能。你也可以在style定義中聲明進(jìn)入、退出和共有元素切換:

<style name="BaseAppTheme" parent="android:Theme.Material">
  <!-- enable window content transitions -->
  <item name="android:windowContentTransitions">true</item>

  <!-- specify enter and exit transitions -->
  <item name="android:windowEnterTransition">@transition/explode</item>
  <item name="android:windowExitTransition">@transition/explode</item>

  <!-- specify shared element transitions -->
  <item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
  <item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>
</style>

例子中的change_image_transform 切換定義如下:

<!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
  <changeImageTransform/>
</transitionSet>

changeImageTransform 元素對(duì)應(yīng) ChangeImageTransform 類。更多信息,請(qǐng)參見(jiàn) Transition類的API文檔。

要在代碼中啟用窗口內(nèi)容切換,調(diào)用Window.requestFeature()函數(shù):

// inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

// set an exit transition
getWindow().setExitTransition(new Explode());

要聲明變換類型,就要在Transition對(duì)象上調(diào)用以下函數(shù):

  • Window.setEnterTransition()
  • Window.setExitTransition()
  • Window.setSharedElementEnterTransition()
  • Window.setSharedElementExitTransition()

setExitTransition()setSharedElementExitTransition() 函數(shù)為activity定義了退出變換效果。setEnterTransition()setSharedElementEnterTransition() 函數(shù)定義了進(jìn)入activity的變換效果。

要獲得切換的全部效果,你必須在出入的兩個(gè)activity中都開(kāi)啟窗口內(nèi)容切換。否則,調(diào)用的activity會(huì)使用退出效果,但是接著你會(huì)看到一個(gè)傳統(tǒng)的窗口切換(比如縮放或淡入淡出)。

要盡早開(kāi)始入場(chǎng)切換,可以在被調(diào)用的Activity上使用Window.setAllowEnterTransitionOverlap() 。它可以使你擁有更戲劇性的入場(chǎng)切換。

使用切換啟動(dòng)一個(gè)Activity

如果你開(kāi)啟Activity入場(chǎng)和退出效果,那么當(dāng)你在用如下方法開(kāi)始Activity時(shí),切換效果會(huì)被應(yīng)用:

startActivity(intent,
              ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

如果你為第二個(gè)Activity設(shè)定了入場(chǎng)變換,變換也會(huì)在activity開(kāi)始時(shí)被啟用。要在開(kāi)始另一個(gè)acitivity時(shí)禁用變換,可以給bundle的選項(xiàng)提供一個(gè)null對(duì)象:

啟動(dòng)一個(gè)擁有共用元素的Activity

要在兩個(gè)擁有共用元素的activity間進(jìn)行切換動(dòng)畫(huà):

  1. 在主題中開(kāi)啟窗口內(nèi)容切換
  2. 在style中定義共有元素切換
  3. 將切換定義為一個(gè)XML 資源文件
  4. 使用android:transitionName屬性在兩個(gè)layout文件中給共有元素賦予同一個(gè)名字
  5. 使用ActivityOptions.makeSceneTransitionAnimation()方法
// get the element that receives the click event
final View imgContainerView = findViewById(R.id.img_container);

// get the common element for the transition in this activity
final View androidRobotView = findViewById(R.id.image_small);

// define a click listener
imgContainerView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, Activity2.class);
        // create the transition animation - the images in the layouts
        // of both activities are defined with android:transitionName="robot"
        ActivityOptions options = ActivityOptions
            .makeSceneTransitionAnimation(this, androidRobotView, "robot");
        // start the new activity
        startActivity(intent, options.toBundle());
    }
});

對(duì)于用代碼編寫(xiě)的共有動(dòng)態(tài)視圖,使用View.setTransitionName()方法來(lái)在兩個(gè)activity中定義共有元素。

要在第二個(gè)activity結(jié)束時(shí)進(jìn)行逆向的場(chǎng)景切換動(dòng)畫(huà),調(diào)用Activity.finishAfterTransition()方法,而不是Activity.finish()。

開(kāi)始一個(gè)擁有多個(gè)共有元素的Activity

要在擁有多個(gè)共有元素的activity之間使用變換動(dòng)畫(huà),就要用android:transitionName屬性在兩個(gè)layout中定義這個(gè)共有元素(或在兩個(gè)Activity中使用View.setTransitionName()方法),再創(chuàng)建ActivityOptions對(duì)象:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
        Pair.create(view1, "agreedName1"),
        Pair.create(view2, "agreedName2"));

使用曲線動(dòng)畫(huà)

Material Design中的動(dòng)畫(huà)可以表示為基于時(shí)間插值和空間移動(dòng)模式的曲線。在Android 5.0 (API level 21)以上版本中,你可以為動(dòng)畫(huà)定義時(shí)間曲線和曲線動(dòng)畫(huà)模式。

PathInterpolator類是一個(gè)基于貝澤爾曲線或Path對(duì)象的新的插值方法。插值方法 是一個(gè)定義在 1x1 正方形中的曲線函數(shù)圖像,其始末兩點(diǎn)分別在(0,0)和(1,1),一個(gè)用構(gòu)造函數(shù)定義的控制點(diǎn)。你也可以使用XML資源文件定義一個(gè)插值方法:

<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
    android:controlX1="0.4"
    android:controlY1="0"
    android:controlX2="1"
    android:controlY2="1"/>

Material Design標(biāo)準(zhǔn)中,系統(tǒng)提供了三種基本的曲線:

  • @interpolator/fast_out_linear_in.xml
  • @interpolator/fast_out_slow_in.xml
  • @interpolator/linear_out_slow_in.xml

你可以將一個(gè)PathInterpolator對(duì)象傳給Animator.setInterpolator()方法。

ObjectAnimator類有一個(gè)新的構(gòu)造函數(shù),使你可以沿一條路徑使用多個(gè)屬性來(lái)在坐標(biāo)系中進(jìn)行變換。比如,以下animator(動(dòng)畫(huà)器,譯者注)使用一個(gè)Path對(duì)象來(lái)改變一個(gè)試圖的X和Y屬性:

ObjectAnimator mAnimator;
mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
...
mAnimator.start();

基于視圖狀態(tài)改變的動(dòng)畫(huà)

StateListAnimator 類是你可以定義在視圖狀態(tài)改變啟動(dòng)的Animator(動(dòng)畫(huà)器,譯者注)。以下例子展示如何在XML文件中定義StateListAnimator

<!-- animate the translationZ property of a view when pressed -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true">
    <set>
      <objectAnimator android:propertyName="translationZ"
        android:duration="@android:integer/config_shortAnimTime"
        android:valueTo="2dp"
        android:valueType="floatType"/>
        <!-- you could have other objectAnimator elements
             here for "x" and "y", or other properties -->
    </set>
  </item>
  <item android:state_enabled="true"
    android:state_pressed="false"
    android:state_focused="true">
    <set>
      <objectAnimator android:propertyName="translationZ"
        android:duration="100"
        android:valueTo="0"
        android:valueType="floatType"/>
    </set>
  </item>
</selector>

要把視圖改變Animator關(guān)聯(lián)到一個(gè)視圖,就要在XML資源文件的selector元素上定義一個(gè)Animator,并把此Animator賦值給視圖的 android:stateListAnimator 屬性。要想在Java代碼中將狀態(tài)列表Animator賦值給視圖,使用AnimationInflater.loadStateListAnimator() 函數(shù),并用View.setStateListAnimator()函數(shù)把Animator賦值給你的視圖。

當(dāng)你的主題繼承于Material Theme的時(shí)候,Button默認(rèn)會(huì)有一個(gè)Z值動(dòng)畫(huà)。為了避免Button的Z值動(dòng)畫(huà),設(shè)定它的android:stateListAnimator屬性為@null。

AnimatedStateListDrawable類使你可以創(chuàng)建一個(gè)在視圖狀態(tài)變化之間顯示動(dòng)畫(huà)的drawable。有一些Android 5.0系統(tǒng)組件默認(rèn)已經(jīng)使用了這些動(dòng)畫(huà)。下面的例展示如何在XML資源文件中定義AnimatedStateListDrawable:

<!-- res/drawable/myanimstatedrawable.xml -->
<animated-selector
    xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- provide a different drawable for each state-->
    <item android:id="@+id/pressed" android:drawable="@drawable/drawableP"
        android:state_pressed="true"/>
    <item android:id="@+id/focused" android:drawable="@drawable/drawableF"
        android:state_focused="true"/>
    <item android:id="@id/default"
        android:drawable="@drawable/drawableD"/>

    <!-- specify a transition -->
    <transition android:fromId="@+id/default" android:toId="@+id/pressed">
        <animation-list>
            <item android:duration="15" android:drawable="@drawable/dt1"/>
            <item android:duration="15" android:drawable="@drawable/dt2"/>
            ...
        </animation-list>
    </transition>
    ...
</animated-selector>

動(dòng)畫(huà)矢量 Drawables

矢量Drawable是可以無(wú)損縮放的。AnimatedVectorDrawable類是你可以操作矢量Drawable。

你通常在3個(gè)XML文件中定義動(dòng)畫(huà)矢量Drawable:

  • res/drawable/中用<vector>定義一個(gè)矢量drawable
  • res/drawable/中用<animated-vector>定義一個(gè)動(dòng)畫(huà)矢量drawable
  • 在`res/anim/'中定義一個(gè)或多個(gè)Animator

動(dòng)畫(huà)矢量drawable可以用在<group><path>元素的屬性上。<group>元素定義了一些path或者subgroup,<path>定義了一條被繪畫(huà)的路徑。

當(dāng)你想要定義一個(gè)動(dòng)畫(huà)的矢量drawable時(shí),使用android:name 屬性來(lái)為group和path賦值一個(gè)唯一的名字(name),這樣你可以通過(guò)animator的定義找到他們。比如:

<!-- res/drawable/vectordrawable.xml -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="64dp"
    android:width="64dp"
    android:viewportHeight="600"
    android:viewportWidth="600">
    <group
        android:name="rotationGroup"
        android:pivotX="300.0"
        android:pivotY="300.0"
        android:rotation="45.0" >
        <path
            android:name="v"
            android:fillColor="#000000"
            android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
    </group>
</vector>

動(dòng)畫(huà)矢量drawable的定義是通過(guò)name屬性來(lái)找到視圖組(group)和路徑(path)的:

<!-- res/drawable/animvectordrawable.xml -->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
  android:drawable="@drawable/vectordrawable" >
    <target
        android:name="rotationGroup"
        android:animation="@anim/rotation" />
    <target
        android:name="v"
        android:animation="@anim/path_morph" />
</animated-vector>

動(dòng)畫(huà)的定義代表ObjectAnimator或者AnimatorSet對(duì)象。例子中第一個(gè)animator將目標(biāo)組旋轉(zhuǎn)了360度。

<!-- res/anim/rotation.xml -->
<objectAnimator
    android:duration="6000"
    android:propertyName="rotation"
    android:valueFrom="0"
    android:valueTo="360" />

第二個(gè)animator將矢量drawable的路徑從一個(gè)形狀(morph)變形到另一個(gè)。兩個(gè)路徑都必須是可以形變的:他們必須有相同數(shù)量的命令,每個(gè)命令必須有相同數(shù)量的參數(shù)

<!-- res/anim/path_morph.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <objectAnimator
        android:duration="3000"
        android:propertyName="pathData"
        android:valueFrom="M300,70 l 0,-70 70,70 0,0   -70,70z"
        android:valueTo="M300,70 l 0,-70 70,0  0,140 -70,0 z"
        android:valueType="pathType" />
</set>

更多信息,請(qǐng)參考AnimatedVectorDrawable的API指南。