Glide — 用animate()定制動畫
原文:Custom Animations with animate()
作者:Norman Peitek
翻譯:Dexter0218
上篇文章,我們介紹了如何在顯示圖片之前變換圖片。這篇文章繼續學習在顯示圖片時的動畫選項。
Glide 系列概覽
- 入門簡介
- 高級加載
- 適配器(ListView, GridView)
- 占位圖& 淡入淡出動畫
- 圖片大小 & 縮放
- 播放GIF & 視頻
- 緩存基礎
- 請求優先級
- 縮略圖
- 回調:定制view中使用SimpleTarget和ViewTarget
- 通知欄和桌面小控件的圖片加載
- 異常: 調試和報錯處理
- 自定義變換
- 用animate()定制動畫
- 整合網絡協議棧
- 用Modules定制Glide
- Glide Module 案例: 接受自簽名HTTPS證書
- Glide Module 案例: 自定義緩存
- Glide Module 案例: 通過加載自定義大小圖片優化
- 動態使用 Model Loaders
- 如何旋轉圖片
- 系列綜述
動畫基礎
圖片之間的平滑切換是非常重要的。用戶希望app里沒有較突兀的跳變。Glide的動畫就是為了解決這個問題。Glide自帶了一個標準的動畫去減輕UI中的變化,就是之前的文章中用過的.crossFade()。
但在這篇文章中,我們會學習另外一個不同于.crossFade()的方案。Glide提供了兩個方案*去設置動畫。兩個版本都用.animate()
方法,但是需要傳入不一樣的參數。
在我們看代碼之前,應當認識到動畫只在當不能從緩存中提供時采用。如果圖片在緩存內,它應該直接被加載,動畫則是沒有必要顯示的。
* =我們忽略了第三個,廢棄的方案:animate(Animation animation)。
資源動畫
回到代碼:第一個方案是傳遞一個指向一個Android動畫資源id。Android系統提供的一個從左邊滑入的動畫:android.R.anim.slide_in_left
。這個代碼后面,就是一個XML描述的動畫:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-50%p" android:toXDelta="0"
android:duration="@android:integer/config_mediumAnimTime"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="@android:integer/config_mediumAnimTime" />
</set>
當然,你可以創建你自己的XML動畫,例如,一個小的縮放動畫,讓圖片從小變大到全尺寸:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">
<scale
android:duration="@android:integer/config_longAnimTime"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="1"
android:toYScale="1"/>
</set>
我們也可以將動畫設置到Glide的構造器里:
Glide
.with( context )
.load( eatFoodyImages[0] )
.animate( android.R.anim.slide_in_left ) // or R.anim.zoom_in
.into( imageView1 );
當圖片從網絡準備好加載的時候,從左邊滑入。
通過自定義類來滑動
正如之前文章中討論的,當圖片加載到常規的ImageView的時候很好實現。但如果目標是自定義的呢?另外一個方案將會非常有用,跟傳遞一個動畫資源的引用不同,需要通過實現ViewPropertyAnimation.Animator
接口的一個類。
接口非常簡單,你只要實現無返回類型的animate(View view)方法,其中View對象就是整個target view。如果它是自定義view,你可以找到你的view的子元素,做必要的動畫。
我們先看個簡單的例子。假設你想要實現一個漸變的動畫,你需要創建一個動畫類:
ViewPropertyAnimation.Animator animationObject = new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) {
// if it's a custom view class, cast it here
// then find subviews and do the animations
// here, we just use the entire view for the fade animation
view.setAlpha( 0f );
ObjectAnimator fadeAnim = ObjectAnimator.ofFloat( view, "alpha", 0f, 1f );
fadeAnim.setDuration( 2500 );
fadeAnim.start();
}
};
下一步,你需要在Glide的請求里設置動畫:
Glide
.with( context )
.load( eatFoodyImages[1] )
.animate( animationObject )
.into( imageView2 );
當然,在你的animate(View view)
對象方法中,你可以做任何你要做的。用動畫發揮你的創意。
如果你正使用自定義view,你就可以轉換view對象,然后調用自定義方法在你的自定義view上。
總結
在這篇文章中,你已經學會了如何創建并應用標準、自定義動畫到你的Glide請求中。這是我們常用的非常有用的技能之一。我們建議你花點時間測試一下我們的代碼,實現你自己的想法。在下面的評論里讓我們知道你的進展!
后面,我們將開始解決我們最后一個大的Glide話題:定制Glide!下篇文章將具體介紹如何整合各種網絡協議棧到Glide中。