android 幀動畫,補間動畫,屬性動畫的簡單總結

来源:http://www.cnblogs.com/r-decade/archive/2016/09/21/5894230.html
-Advertisement-
Play Games

幀動畫——FrameAnimation 將一系列圖片有序播放,形成動畫的效果。其本質是一個Drawable,是一系列圖片的集合,本身可以當做一個圖片一樣使用 在Drawable文件夾下,創建animation-list為根節點的資源文件 <animation-list android:oneshot ...


  幀動畫——FrameAnimation   將一系列圖片有序播放,形成動畫的效果。其本質是一個Drawable,是一系列圖片的集合,本身可以當做一個圖片一樣使用   在Drawable文件夾下,創建animation-list為根節點的資源文件
<animation-list android:oneshot="false">
    <item android:drawable="@drawable/img1" android:duration="100"/>
    <item android:drawable="@drawable/img2" android:duration="100"/>
    <item android:drawable="@drawable/img3" android:duration="100"/>
    <item android:drawable="@drawable/img4" android:duration="100"/>
</animation-list>

  oneshot:是否只播放一次      

  drawable:一幀引用的圖片   duration:一幀播放的時間 播放動畫   將動畫作為控制項的背景   ((AnimationDrawable)view.getBackground()).start();   Animation常用屬性   duration:動畫時間                      repeatCount:重覆次數 infinite無限次   fillAfter:是否停止在最後一幀   repeatMode:重覆模式     值:restart重新開始,reserve反覆   startOffset:開始延遲時間   補間動畫 Tween Animation   只能應用於View對象,只支持部分屬性,View animation值改變了View繪製的位置,並沒有改變對象本身的真實位置   可以使用XML定義也可以使用代碼定義     XML定義的動畫放在/res/anim/文件夾內     開始動畫 通過view的startAnimation(Animation a)  參數定義的動畫   四種補間動畫通過XML定義   AlphaAnimation:透明度動畫
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0"
    android:toAlpha="1"
    android:duration="2000">
    <!--
    fromAlpha 起始透明度 0為完全透明 1為不透明 0~1之間的浮點值
    toAlpha 結束透明度
    duration 動畫運行時間 單位毫秒
    -->
</alpha>
        AlphaAnimation alphaAnimation=null;
        //載入XML中的動畫XML文件
        alphaAnimation= (AlphaAnimation) AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_alpha);
        //常用屬性設置  各種動畫通用
        alphaAnimation.setRepeatCount(3);//執行動畫效果結束後重覆執行3次  一共4次
        alphaAnimation.setRepeatMode(Animation.REVERSE);//重覆模式
        //動畫結束是否停止在最後一幀
        alphaAnimation.setFillAfter(true);
        //動畫結束是否停止在第一幀
        alphaAnimation.setFillBefore(false);
        //設置插值器 動畫執行速度  變速 加減速。。
        //AccelerateInterpolator減速
        //DecelerateInterpolator加速
        alphaAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
  ScaleAnimation:縮放動畫     代碼載入的方式和方法的使用與AlphaAnimation一樣
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:toXScale="1"
    android:toYScale="1"
    android:fromXScale="0.1"
    android:fromYScale="0.1"
    android:pivotY="0%"
    android:pivotX="0%"
    android:duration="2000">
    <!--
            浮點值 表示倍數 自身幾倍
            fromXScale 動畫在X軸以自身幾倍伸縮開始
            toXScale   動畫在X軸以自身幾倍伸縮結束

            fromYScale 動畫在Y軸以自身幾倍伸縮開始
            toYScale   動畫在Y軸以自身幾倍伸縮結束

            pivotX  動畫相對於控制項自身的X坐標的開始位置
            pivotY  動畫相對於控制項自身的Y坐標的開始位置
            0% 0%  表示控制項左上角 為0,0原點坐標
    -->
</scale>
  TranslateAnimation:平移動畫
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="-100%p"
    android:fromYDelta="0"
    android:toXDelta="100%p"
    android:toYDelta="0"
    android:duration="2000">
    <!--
            fromXDelta x軸起始位置
            toXDelta   X軸結束位置
            fromYDelta y軸起始位置
            toYDelta   y軸結束位置
            100%p 表示相對於父級
            100%相對於自身
-->
</translate>

 

  RotateAnimation:旋轉動畫
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="360"
    android:duration="2000"
    android:pivotX="50%"
    android:pivotY="50%"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator">
    <!--
      interpolator 指定動畫的插值器
      accelerate_decelerate_interpolator   加速-減速
      accelerate_interpolator               加速
      decelerate_interpolator               減速

      fromDegrees 動畫起始角度
      toDegrees   動畫結束旋轉的角度 可以大於360度
      負數表示逆時針旋轉  正數表示順時針旋轉

      pivotX相對於view的X坐標的開始位置
      pivotY相對於view的Y坐標的開始位置
      100 絕對尺寸 100px
      50% 相對尺寸 相對於自身的50%
      50%p 相對尺寸 相對於父容器的50%
      50%為物件的X或Y方向坐標上的中點位置
     duration  動畫播放時間 單位毫秒
-->
</rotate>

通過構造方法創建  

  構造參數詳解  此段內容選自 http://www.cnblogs.com/aimeng/archive/2011/10/10/2206710.html  

//在代碼中定義 動畫實例對象
private Animation myAnimation_Alpha;
private Animation myAnimation_Scale;
private Animation myAnimation_Translate;
private Animation myAnimation_Rotate;
     
    //根據各自的構造方法來初始化一個實例對象
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
 
myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
             Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 
myAnimation_Translate=new TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f);
 
myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
               Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
AlphaAnimation

 AnimationAlphaAnimation(float fromAlpha, float toAlpha)
//第一個參數fromAlpha為 動畫開始時候透明度
//第二個參數toAlpha為 動畫結束時候透明度
myAnimation_Alpha=new AlphaAnimation(0.1f, 1.0f);
//說明:
//                0.0表示完全透明
//                1.0表示完全不透明

myAnimation_Alpha.setDuration(5000); //設置時間持續時間為 5000毫秒

 

ScaleAnimation
        ScaleAnimation(float fromX, float toX, float fromY, float toY,
                   int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) 
        //第一個參數fromX為動畫起始時 X坐標上的伸縮尺寸    
        //第二個參數toX為動畫結束時 X坐標上的伸縮尺寸     
        //第三個參數fromY為動畫起始時Y坐標上的伸縮尺寸    
        //第四個參數toY為動畫結束時Y坐標上的伸縮尺寸  
        /*說明:
                            以上四種屬性值    
                            0.0表示收縮到沒有 
                            1.0表示正常無伸縮     
                            值小於1.0表示收縮  
                            值大於1.0表示放大
        */
        //第五個參數pivotXType為動畫在X軸相對於物件位置類型  
        //第六個參數pivotXValue為動畫相對於物件的X坐標的開始位置
        //第七個參數pivotXType為動畫在Y軸相對於物件位置類型   
        //第八個參數pivotYValue為動畫相對於物件的Y坐標的開始位置
        myAnimation_Scale =new ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f,
                     Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

        myAnimation_Scale.setDuration(700);
        //設置時間持續時間為 700毫秒

 TranslateAnimation

        TranslateAnimation(float fromXDelta, float toXDelta,
                               float fromYDelta, float toYDelta) 
        //第一個參數fromXDelta為動畫起始時 X坐標上的移動位置    
        //第二個參數toXDelta為動畫結束時 X坐標上的移動位置      
        //第三個參數fromYDelta為動畫起始時Y坐標上的移動位置     
        //第四個參數toYDelta為動畫結束時Y坐標上的移動位置 

RotateAnimation

        RotateAnimation(float fromDegrees, float toDegrees, 
                    int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
        //第一個參數fromDegrees為動畫起始時的旋轉角度    
        //第二個參數toDegrees為動畫旋轉到的角度   
        //第三個參數pivotXType為動畫在X軸相對於物件位置類型  
        //第四個參數pivotXValue為動畫相對於物件的X坐標的開始位置
        //第五個參數pivotXType為動畫在Y軸相對於物件位置類型   
        //第六個參數pivotYValue為動畫相對於物件的Y坐標的開始位置
        myAnimation_Rotate=new RotateAnimation(0.0f, +350.0f,
               Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

 

屬性動畫   相對補間動畫  屬性動畫會真正的使目標對象的屬性值發生改變,不像補間動畫只是影像的改變    只能修改具有get/set方法的屬性值   因為可以修改對象的屬性,屬性動畫可以做到更多的效果,改變文本大小,背景顏色等等   屬性動畫創建在 res/animator    ValueAnimator

包含屬性動畫的所有核心功能,動畫時間,開始、結束屬性值,屬性值計算方法等。

ValuAnimiator設置開始結束值 實現ValueAnimator.onUpdateListener介面,

這個介面只有一個函數onAnimationUpdate(),在這個函數中會傳入ValueAnimator對象做為參數,通過這個ValueAnimator對象的getAnimatedValue()函數可以得到當前的屬性值

把屬性值設置給某個控制項的某個屬性

  使用xml
<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:valueFrom="0"
    android:valueTo="300"
    android:valueType="intType"
    android:interpolator="@android:interpolator/overshoot">
    <!--
        valueFrom  起始值
        valueTo    結束值
        valueType  值的類型
        intType整數值、floatType浮點值、colorType顏色值
        interpolator插值器
    -->
</animator>
        ValueAnimator valueAnimator=null;
        //通過AnimatorInflater.loadAnimator()載入xml 創建ValueAnimator
        valueAnimator= (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_value);
        //動畫執行時間
        valueAnimator.setDuration(3000);
        //值改變監聽
        valueAnimator.addUpdateListener(listener);
        //開始動畫
        valueAnimator.start();
   private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
       //獲取值
            int value= (int) animation.getAnimatedValue();
       //btnValueAnimator為測試控制項
        //設置控制項X軸平移
        btnValueAnimator.setTranslationX(value);
        }
    };

  使用代碼

        /**
         * valueAnimator 單個值
         */
        //代碼創建  ValueAnimator類自身的方法
        //ofFloat值類型float
        ValueAnimator valueAnimator=ValueAnimator.ofFloat(0,1);
        //ofInt值類型int 從0~300
        valueAnimator=ValueAnimator.ofInt(0,300);
        //也可以用來設置顏色 在顏色改變過程中會將顏色變化情況顯示出來
        //紅色到藍色的改變過程 顯示N種顏色
        valueAnimator=ValueAnimator.ofInt(Color.RED,Color.BLUE);
        //ofArgb設置顏色 如果無法使用  是的sdk版本低了
        //這個方法改變顏色過程中只顯示紅色和藍色
        //valueAnimator=ValueAnimator.ofArgb(Color.RED,Color.BLUE);
        //設置插值器
        valueAnimator.setInterpolator(new CycleInterpolator());

/** * * ValueAnimator.ofPropertyValuesHolder 設置多個值 */ //設置動畫屬性 參數1:名字 參數2,3值的變化區間 PropertyValuesHolder alphaHolder=PropertyValuesHolder.ofFloat("alpha",0f,1f); PropertyValuesHolder widthHolder=PropertyValuesHolder.ofInt("width",0,300); //ValueAnimator.ofPropertyValuesHolder 添加holder 創建動畫 valueAnimator=ValueAnimator.ofPropertyValuesHolder(alphaHolder,widthHolder); //動畫執行時間 valueAnimator.setDuration(3000); //值改變監聽 valueAnimator.addUpdateListener(listener);
   private ValueAnimator.AnimatorUpdateListener listener=new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            /**
             * 單個值獲取 getAnimatedValue取出變化值 根據設置類型強轉
             * btnValueAnimator 測試用的button
             */
//            int value= (int) animation.getAnimatedValue();
//            btnValueAnimator.setTranslationX(value);橫坐標平移

//            float value= (float) valueAnimator.getAnimatedValue();
//            btnValueAnimator.setAlpha(value);透明度改變

//            int value= (int) animation.getAnimatedValue();
//            btnValueAnimator.setTextColor(value);文字顏色改變
            /**
             * PropertyValuesHolder存了多個值  通過名字獲取 強制轉換
             */
            float alpha= (float) valueAnimator.getAnimatedValue("alpha");
            int width= (int) valueAnimator.getAnimatedValue("width");
            btnValueAnimator.setAlpha(alpha);//改變透明度
            //圖像繪製 左邊不變從右邊慢慢增加
            //修改控制項的width height不能使用setWidth或setHeight
            btnValueAnimator.setRight(width);
            //btnValueAnimator.setBottom(width);

        }
    };
ObjectAnimator:

繼承自ValueAnimator,要指定一個對象及該對象的一個屬性,當屬性值計算完成時自動設置為該對象的相應屬性,不需要設置監聽,底層自動完成,一般會用ObjectAnimator來改變某一對象的某一屬性

        //用來測試的button
        Button btnObjectAnimator= (Button) findViewById(R.id.btn_object_animator);
        //載入動畫
        ObjectAnimator objectAnimator= (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_object);
        //綁定控制項
        objectAnimator.setTarget(btnObjectAnimator);

        //參數1 綁定控制項 參數2 設置 屬性 參數3 設置值
        objectAnimator=ObjectAnimator.ofInt(btnObjectAnimator,"textColor",Color.RED);
        //PropertyValuesHolder設置多個屬性
        PropertyValuesHolder translationXHolder=PropertyValuesHolder.ofFloat("translationX",0,300);
        PropertyValuesHolder translationYHolder=PropertyValuesHolder.ofFloat("translationY",0,200);
        objectAnimator=ObjectAnimator.ofPropertyValuesHolder(btnObjectAnimator,translationXHolder,translationYHolder);
        objectAnimator.setDuration(3000);
     //開始動畫
     objectAnimator.start();

 

轉載請註明出處:http://www.cnblogs.com/r-decade/ 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS 邊框即CSS border-border邊框樣式顏色、邊框樣式、邊框寬度的語法結構與應用案例教程篇 一、CSS 邊框基礎知識 CSS 邊框即CSS border是控制對象的邊框邊線寬度、顏色、虛線、實線等樣式CSS屬性。同時大家可以進入碼農教程提供CSS手冊查看border手冊:http:/ ...
  • 以前只用過JavaScript原生寫網站特效,今天還是第一次聽說typescript的,然後看了一下它的基本知識,感覺很像Java,真的太像了,但是又有不同點。很讓我驚奇看到的第一個知識點就和以前不同,很新鮮。 變數的聲明: 在typescript中我知道的變數的聲明有兩種(除了var),分別是le ...
  • 1、RegExp:Regular Expression,創建封裝正則表達式: ①正則直接量:var reg=/reg/ig;②var reg=new RegExp(“reg”,“ig”); 2、RegExp API: ①找每個關鍵詞,並獲得位置:var arr=reg.exec(str);預設從頭開 ...
  • 說明 跨域主要是由於瀏覽器的“同源策略”引起,分為多種類型,本文主要探討Ajax請求跨域問題 前言 參考來源 什麼是跨域 ajax跨域的表現 跨域的原理 如何解決跨域問題 JSONP方式解決跨域問題 CROS解決跨域問題 CROS請求原理 PHP後臺配置 JAVA後臺配置 .NET後臺配置 FAQ ...
  • 開本系列,討論一些有趣的 CSS 題目,拋開實用性而言,一些題目為了拓寬一下解決問題的思路,此外,涉及一些容易忽視的 CSS 細節。 解題不考慮相容性,題目天馬行空,想到什麼說什麼,如果解題中有你感覺到生僻的 CSS 屬性,趕緊去補習一下吧。 不斷更新,不斷更新,不斷更新,重要的事情說三遍。 彙總在 ...
  • × 目錄 [1]作用域安全 [2]惰性載入 [3]函數綁定 前面的話 函數對任何一門語言來說都是一個核心的概念,在javascript中更是如此。前面曾以深入理解函數系列的形式介紹了函數的相關內容,本文將再深入一步,介紹函數的3個高級技巧 技巧一:作用域安全的構造函數 構造函數其實就是一個使用new ...
  • 首先看演示: FrameLayout框架佈局是最簡單的佈局形式。所有添加到這個佈局中的視圖都以層疊的方式顯示。第一個添加的控制項被放在最底層,最後一個添加到框架佈局中的視圖顯示在最頂層,上一層的控制項會覆蓋下一層的控制項。這種顯示方式有些類似於堆棧。 當我們往裡面添加組件的時候,所有的組件都會放置於這塊區 ...
  • 這個類提供了對於音頻文件的描述An audio stream is a continuous series of data that represents a sound, such as a song.A channel is a discrete track of monophonic audi... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...