Glide入門教程——14.用animate()定制動畫

Glide — 用animate()定制動畫

原文:Custom Animations with animate()
作者:Norman Peitek
翻譯:Dexter0218

上篇文章,我們介紹了如何在顯示圖片之前變換圖片。這篇文章繼續學習在顯示圖片時的動畫選項。

Glide 系列概覽

  1. 入門簡介
  2. 高級加載
  3. 適配器(ListView, GridView)
  4. 占位圖& 淡入淡出動畫
  5. 圖片大小 & 縮放
  6. 播放GIF & 視頻
  7. 緩存基礎
  8. 請求優先級
  9. 縮略圖
  10. 回調:定制view中使用SimpleTarget和ViewTarget
  11. 通知欄和桌面小控件的圖片加載
  12. 異常: 調試和報錯處理
  13. 自定義變換
  14. 用animate()定制動畫
  15. 整合網絡協議棧
  16. 用Modules定制Glide
  17. Glide Module 案例: 接受自簽名HTTPS證書
  18. Glide Module 案例: 自定義緩存
  19. Glide Module 案例: 通過加載自定義大小圖片優化
  20. 動態使用 Model Loaders
  21. 如何旋轉圖片
  22. 系列綜述

動畫基礎

圖片之間的平滑切換是非常重要的。用戶希望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中。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容