揭露動畫—ViewAnimationUtils.createCircularReveal

海晨憶發表於2017-08-06
    ViewAnimationUtils是Android5.0出來的API。其作用就是可以使控制元件能夠呈現水波一樣展開。先上一張效果圖:

這裡寫圖片描述

    PS:圖是網上找的,不會做gif圖。
    具體的方法如下:
public static Animator createCircularReveal(View view,  
            int centerX,  int centerY, float startRadius, float endRadius) {  
        return new RevealAnimator(view, centerX, centerY, startRadius, endRadius);  
    }
    引數1:view是你需要這個效果的控制元件
    引數2:centerX動畫中心x軸座標
    引數3:centerY動畫中心y軸座標
    引數4:startRadius動畫開始的半徑
    引數5:endRadius動畫結束的半徑

    我的demo佈局如下,很簡單:
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btn1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="揭露動畫效果"/>
        <Button
            android:id="@+id/btn4"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="預設顯示"/>
    </LinearLayout>
    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@mipmap/uvurn"
        android:visibility="invisible"/>
    佈局就是兩個按鈕,一個是啟動動畫的按鈕,一個是普通的顯示、隱藏的按鈕,還有一個ImageView就是動畫的載體。
    java的動畫程式碼如下:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                    int measuredWidth = img.getMeasuredWidth();
                    int measuredHeight = img.getMeasuredHeight();
                    int maxRadius = Math.max(measuredWidth, measuredHeight);
                    Animator circularReveal = null;
                    if(img.getVisibility()==View.VISIBLE){  //如果已經顯示了
                        /*circularReveal = ViewAnimationUtils.createCircularReveal
                                (img, measuredWidth/2, measuredHeight/2, maxRadius, 0);*/
                        /*circularReveal = ViewAnimationUtils.createCircularReveal
                                (img, 0, 0, maxRadius, 0);*/
                        circularReveal = ViewAnimationUtils.createCircularReveal
                                (img, measuredWidth, measuredHeight, maxRadius, 0);
                        circularReveal.setDuration(1000);
                        circularReveal.setStartDelay(1000);
                        circularReveal.start();
                        circularReveal.addListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                super.onAnimationEnd(animation);
                                img.setVisibility(View.GONE);
                            }
                        });
                    }else{
                        circularReveal = ViewAnimationUtils.createCircularReveal
                                (img, measuredWidth/2, measuredHeight/2, 0, maxRadius);
                        circularReveal.setDuration(1000);
//                    circularReveal.setInterpolator(new LinearOutSlowInInterpolator());//out到in
                        img.setVisibility(View.VISIBLE);
                        circularReveal.start();
                    }

                }else{
                    img.setVisibility(img.isShown()?View.GONE:View.VISIBLE);
                }
    首先,你得是Android5.0及以上版本才有這個效果
    獲取控制元件的寬,高,取大的為半徑(按你自己的想法來就可以了)
    設定動畫的資料,也就是上面說到的5個引數
    設定動畫的持續時間,動畫監聽等

    這裡需要說明的是,如果你的佈局檔案裡面imageview設定的不佔位隱藏,也就是gone,你第一次獲取imageview的長寬的時候,獲取不到,會是0。
    這裡不一定非要按imageview的長寬來,後面的四個引數,都是你自己隨便設定的,設定其他的資料也是一樣的,會得到不一樣的效果。比方說設定動畫中心X軸座標,Y軸座標為(0,0),那麼動畫就是從左上角開始顯示,一直到全都顯示出來。
    然後就是半徑,如果你沒有設定圖片長寬中大的一個數,比方說設定小一點的,我設定100畫素,動畫結束後,顯示的圖片就是以你設定的圓心開始,半徑為100畫素的一個圓形圖片。
    再就是動畫的監聽,動畫結束的時候的監聽。動畫結束你要顯示圖片,還是隱藏圖片,在動畫結束的時候設定。

專案連結

相關文章