<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 介紹 Android動畫分為兩大類:視圖動畫和屬性動畫,其中視圖動畫又分為補間動畫和逐幀動畫。 ![](https://img.kancloud.cn/8b/70/8b707aa7ed8495215466ef6903d1ec0a_1184x300.png) 視圖動畫作用于View本身,而屬性動畫作用于任意Java對象。 ## 補間動畫 補間動畫有四種動畫效果: ![](https://img.kancloud.cn/4d/7d/4d7d400679f46690ea4f4380545824c9_600x250.png) 補間動畫的原理是,我們來確定開始的視圖樣式和結束的視圖樣式,中間動畫的變化過程由系統補全,來確定一個動畫。 補間動畫使用簡單方便,可在xml文件中配置,也可在Java代碼中動態設置。 缺點: 1、僅能控制View的整體效果,不能控制屬性 2、只能實現移動、縮放、旋轉、淡入淡出四種操作 3、只是改變View的顯示效果,沒有真正改變View的屬性 ## 逐幀動畫 逐幀動畫的原理是,按順序播放一組預先定義好的圖片,每一張圖片即為一幀。 逐幀動畫使用簡單方便,可在xml文件配置,也可在Java代碼中動態設置。但因使用大量圖片資源以及大尺寸圖片,容易引起OOM。 ## 屬性動畫 ![](https://img.kancloud.cn/c2/f0/c2f027c228ff71e1ead8ea68a1a36680_720x330.png) 屬性動畫的原理是,不斷地對值進行操作,并將值賦值到指定對象的指定屬性上,可以是任意對象的任意屬性。 其中,ValueAnimator用于實現對一個值的動畫變化,ObjectAnimator用于實現對一個對象的動畫變化,AnimatorSet用于實現組合動畫。 1、ValueAnimator使用示例: ```java ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setDuration(300); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float currentValue = (float) animation.getAnimatedValue(); Log.d("TAG", "cuurent value is " + currentValue); } }); anim.start(); ``` ValueAnimator最常用ofFloat和ofInt兩個方法,還有一個ofObject方法,使用示例如下: ```java Point point1 = new Point(0, 0); Point point2 = new Point(300, 300); ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2); anim.setDuration(5000); anim.start(); public class PointEvaluator implements TypeEvaluator{ @Override public Object evaluate(float fraction, Object startValue, Object endValue) { Point startPoint = (Point) startValue; Point endPoint = (Point) endValue; float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX()); float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY()); Point point = new Point(x, y); return point; } ``` ofObject方法需要一個實現估值器TypeEvaluator接口的對象,來告訴動畫系統,Object需要如何從初始值過渡到結束值。 2、ObjectAnimator使用示例: ```java ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); animator.setDuration(5000); animator.start(); ``` ObjectAnimator的工作機制是去對象中尋找屬性名(也就是上面例子中的alpha)對應的get和set方法。 ObjectAnimator同樣擁有ofObject方法,在自定義View中,我們可以通過添加get和set方法,來實現動態修改View的對象類型的屬性。比如,在自定義View中新增getColor和setColor方法,并實現一個TypeEvaluator來告訴系統如何變更Color的值。示例如下: ```java ObjectAnimator anim = ObjectAnimator.ofObject(myAnimView, "color", new ColorEvaluator(), "#0000FF", "#FF0000"); anim.setDuration(5000); anim.start(); ``` 3、AnimatorSet的使用示例: ```java ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f); ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f); ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); AnimatorSet animSet = new AnimatorSet(); animSet.play(rotate).with(fadeInOut).after(moveIn); animSet.setDuration(5000); animSet.start(); ``` 4、Animator的監聽器使用示例: ```java anim.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } }); // 同時提供AnimatorListenerAdapter實現,可以選擇性重寫部分方法 anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { } }); ``` 5、插值器(補間器)Interpolator的使用 補間器Interpolator用來控制動畫從初始值過渡到結束值變化的速率,比如加速運動或者減速運動。補間器需要實現TimeInterpolator接口: ```java public interface TimeInterpolator { float getInterpolation(float input); } ``` getInterpolation方法接收一個input參數, input隨著動畫的運行從0到1進行變化。返回值float其實就是我們前面ofObject方法中,實現TypeEvaluator時的fraction參數的值。 ofObject方法需要一個實現TypeEvaluator接口的對象,來告訴動畫系統如何從初始值過渡到結束值。而補間器就是為了告訴TypeEvaluator fraction是如何變化的。 Animator有一個setInterpolator方法直接設置補間器: ```java anim.setInterpolator(new AccelerateInterpolator(2f)); ``` 6、ViewPropertyAnimator的使用 從Android3.1開始,View類新增了animate方法,該方法會返回一個ViewPropertyAnimator對象,我們拿到這個對象后可以操作它實現各種動畫效果了,示例如下: ```java textview.animate().x(500).y(500).setDuration(5000) .setInterpolator(new BounceInterpolator()); ``` # 總結 1、Android動畫分為兩大類:視圖動畫和屬性動畫,其中視圖動畫又分為補間動畫和逐幀動畫。 2、視圖動畫作用于View本身,屬性動畫作用于任意Java對象。 3、補間動畫的原理是,我們確定好開始的視圖樣式和結束的視圖樣式,中間過程變化由系統補全,來實現一個動畫。 4、逐幀動畫的原理是,按順序播放一組預先定義好的圖片,每一張圖片即為一幀。 5、屬性動畫的原理是,不斷的對值進行操作,并將值賦值到指定對象的指定屬性上,可以是任意對象的任意屬性。 6、補間動畫僅能控制整體效果以及顯示效果,不能真正改變View的屬性,且操作只有那幾種;逐幀動畫使用大量圖片,容易引起OOM;而屬性動畫可以真正改變View的任何屬性,可控制變化速率等。 7、ValueAnimator用于實現對一個值的動畫變化;ObjectAnimator用于實現對一個對象的動畫變化;AnimatorSet用于實現組合動畫。 8、ObjectAnimator的工作機制是尋找對象中屬性名對應的get方法和set方法,并調用。 9、估值器TypeEvaluator用來告訴動畫系統,Object需要如何從初始值過渡到結束值,也就是動畫變化時Object需要怎樣變化;插值器(補間器)Interpolator用來控制動畫從初始值過渡到結束值變化的速率。 10、Android3.1開始,View類新增animate方法,返回一個ViewPropertyAnimator對象,我們可以操作這個對象來實現各種動畫效果。 節選自: [Android屬性動畫完全解析(上),初識屬性動畫的基本用法](https://blog.csdn.net/guolin_blog/article/details/43536355) [Android屬性動畫完全解析(中),ValueAnimator和ObjectAnimator的高級用法](https://blog.csdn.net/guolin_blog/article/details/43816093) [Android屬性動畫完全解析(下),Interpolator和ViewPropertyAnimator的用法](https://blog.csdn.net/guolin_blog/article/details/44171115)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看