Android開發藝術探索學習筆記(七)

来源:http://www.cnblogs.com/shiwei-bai/archive/2016/01/07/5109984.html
-Advertisement-
Play Games

第七章 Android動畫深入分析 Android的動畫分為三種:View動畫,幀動畫,屬性動畫。幀動畫屬於View動畫。 7.1 View動畫 View動畫的作用對象是View,共有四種動畫效果:平移(Translate),縮放(Scale),旋轉(Rotate),透明度(Al...


第七章 Android動畫深入分析

     Android的動畫分為三種:View動畫,幀動畫,屬性動畫。幀動畫屬於View動畫。

    7.1 View動畫

    View動畫的作用對象是View,共有四種動畫效果:平移(Translate),縮放(Scale),旋轉(Rotate),透明度(Alpha)。

      7.1.1 View動畫的種類

      

名稱 標簽 子類 效果
平移 <translate> TranslateAnimation 移動View
縮放 <scale> ScaleAnimation 放大或縮小View
旋轉 <rotate> RotateAnimation 旋轉View
透明度 <alpha> AlphaAnimation 改變View的透明度

      View動畫的保存路徑:res/anim/filename.xml。XML格式語法如下:

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@anim/interpolator_resource"
    android:shareInterpolator="true|false">
    <alpha
        android:fromAlpha="float"<!-- 透明度起始值-->
        android:toAlpha="float"/><!-- 透明度結束值-->
    <scale
        android:fromXScale="float"<!--水平方向縮放起始值 -->
        android:toXScale="float"<!--水平方向縮放結束值 -->
        android:fromYScale="float"<!--垂直方向縮放起始值 -->
        android:toYScale="float"<!--垂直方向縮放結束值 -->
        android:pivotX="float"<!--縮放軸點x坐標 -->
        android:pivotY="float"/><!--縮放軸點y坐標 -->
    <translate
        android:fromXDelta="float"<!--x的起始位置-->
        android:fromYDelta="float"<!--y的起始位置-->
        android:toXDelta="float"<!--x的結束位置-->
        android:toYDelta="float"/><!--y的結束位置-->
    <rotate
        android:fromDegrees="float"<!--起始角度 -->
        android:toDegrees="float"<!-- 結束角度-->
        android:pivotX="float"<!-- 旋轉軸點x坐標 -->
        android:pivotY="float"/><!-- 旋轉軸點y坐標-->
    <set>
        ...
    </set>

</set>

 

 

 

 

       <set>標簽表示動畫集合,對應AnimationSet類,內部還可以嵌套其他動畫集合。

      android:interpolator 插值器規定動畫已怎樣的速度運行,預設為加速減速插值器。

      android:shareInterpolator 集合中的動畫是否和集合共用同一個插值器。

      android:duration 動畫持續時間

      android:fillAfter 動畫結束後View是否停留在結束位置。

      <scale>、<rotate>中軸點預設情況下是View的中心點(有待驗證貌似是左上角)。

      在代碼中載入xml中定義的動畫:

  Animation animation = AnimationUtils.loadAnimation(this, R.anim.view1);
  button.startAnimation(animation);

        使用Animation的setAnimationListener方法可以給View動畫添加監聽。

      7.1.2 自定義View動畫

      原理:繼承Animation這個抽象類,然後重寫它的initialize和applyTransformation方法,在initialize中做初始化,在applyTransformation中進行相應的矩陣變換即可。通常採用camera來簡化矩陣變換的過程。自定義View動畫的過程主要就是矩陣變換的過程。例子可參考APIDEMO中的Rotate3dAnimation效果。

      7.1.3 幀動畫

      幀動畫其實就是順序播放一組預先定義好的圖片。通過AnimationDrawable來使用幀動畫。XML格式語法如下:

<?xml version="1.0" encoding="utf-8" ?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true|false">
    <item android:drawable="@mipmap/ic_launcher" android:duration="500"/>
    <item android:drawable="@mipmap/ic_launcher" android:duration="500"/>
    <item android:drawable="@mipmap/ic_launcher" android:duration="500"/>
</animation-list>

 

      使用時直接作為View的背景並通過Drawable來播放即可。

button.setBackgroundResource(R.drawable.view2);
AnimationDrawable drawable=(AnimationDrawable)button.getBackground();
drawable.start();

 

    7.2 View動畫的特殊使用場景

      7.2.1 LayoutAnimation

      作用於ViewGroup,為ViewGroup指定一個動畫,這樣當它的子元素出場時都會具有這種動畫效果。

      步驟:

      (1)定義LayoutAnimation

<?xml version="1.0" encoding="utf-8" ?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:delay="0.5"
    android:animationOrder="normal"
    android:animation="@anim/anim_item"/>

 

      android:delay 子元素開始動畫的時間延遲,例如子元素設置duration為200ms,則0.5表示每個子元素都需要延遲100ms開能開始播放動畫,即第一個經過100ms開始播放,第二個就得經過200ms開始播放,第三個就得經過300ms開始播放,以此類推。

      android:animationOrder 子元素動畫順序,normal(順序顯示),reverse(逆向顯示),random(隨機)。

      (2)為子元素指定動畫

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:shareInterpolator="true">
    <alpha
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />
    <translate
        android:fromXDelta="500"
        android:toYDelta="0" />
</set>

 

      (3)為ViewGroup指定android:layoutAnimation屬性

android:layoutAnimation="@anim/anim_layout"

      

      或者通過LayoutAnimationController來為ViewGroup指定動畫。

     Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_item);
        LayoutAnimationController controller=new LayoutAnimationController(animation);
        controller.setDelay(0.5f);
        controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
        linearlayout.setLayoutAnimation(controller);

 

      7.2.2 Activity的切換效果

      使用overridePendingTransition(int enterAnim, int exitAnim)方法,註意這個方法必須在startActivity或者finish之後被調用才能生效。

      enterAnim——Activity被打開時的動畫

      exitAnim——Activity退出時的動畫

      啟動Activity:

        Intent intent =new Intent(this,TestActivity.class);
        startActivity(intent);
        overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);

 

      退出Activity:

@Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
    }

 

    7.3 屬性動畫

      API等級必須大於等於11,存放路徑為res/animator/目錄下,屬性動畫可以對任何對象做動畫,常見的有ValueAnimator、ObjectAnimator。

      7.3.1 使用屬性動畫

      屬性動畫預設時間間隔為300ms,預設幀率為10ms/幀,可以達到在一個時間間隔內完成對象從一個屬性值到另一個屬性值的改變。如果想要屬性動畫相容低版本系統,需要使用NineOldAndroids這個開源動畫庫。

      舉例說明如何使用屬性動畫:

      (1)改變一個對象的translationY屬性,讓其沿著Y軸向上平移一段距離:它的高度。

ObjectAnimator.ofFloat(myObject,"translationY",-myObject.getHeight());

 

      (2)改變一個View的背景色,讓其背景色在3秒內實現用0xFFFF8080到0xFF8080FF的漸變,動畫無限迴圈並加反轉效果。

     ValueAnimator colorAnim=ObjectAnimator.ofInt(this,"backgroundColor",0xFFFF8080,0xFF8080FF);
        colorAnim.setDuration(3000);
        colorAnim.setEvaluator(new ArgbEvaluator());
        colorAnim.setRepeatCount(ValueAnimator.INFINITE);
        colorAnim.setRepeatMode(ValueAnimator.REVERSE);
        colorAnim.start();

 

      屬性動畫的XML格式語法如下:

<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially|together"><!--together:子動畫同時播放。sequentially:自動化按照先後順序依次播放-->
    <objectAnimator
        android:duration="int"<!--動畫時長-->
        android:propertyName="string"<!--屬性名稱-->
        android:repeatCount="int"<!--重覆次數-->
        android:repeatMode="restart|reverse"<!--重覆模式-->
        android:startOffset="int"<!--延遲時間-->
        android:valueFrom="float|int|color"<!--屬性起始值-->
        android:valueTo="float|int|color"<!--屬性結束值-->
        android:valueType="colorType|intType|floatType|pathType" /><!--屬性類型-->
    <animator
        android:duration="int"
        android:repeatCount="int"
        android:repeatMode="restart|reverse"
        android:startOffset="int"
        android:valueFrom="float|int|color"
        android:valueTo="float|int|color"
        android:valueType="colorType|intType|floatType|pathType" />
</set>

 

 

 

      android:repeatCount 動畫的迴圈次數,預設為0,-1為無限迴圈;

      android:repeatMode repeat:連續重覆;reverse:逆向重覆(第一次播放完後,第二次倒著播放,第三次在重頭開始播如此反覆)。

      在XML中定義好屬性動畫後在java代碼中就可以使用了

AnimatorSet set=(AnimatorSet) AnimatorInflater.loadAnimator(context,R.anim.property_animator);
set.setTarget(button);
set.start();

 

      實際開發中建議使用代碼來實現屬性動畫,不要使用xml的方式。

      7.3.2 理解插值器和估值器

      插值器:根據時間流逝的百分比來計算出當前屬性值改變的百分比;

      估值器:根據當前屬性的百分比來計算改變後的屬性值。

      7.3.3 屬性動畫監聽器

      AnimatorListener監聽動畫的開始、結束、取消、重覆播放;

      AnimatorUpdateListener 監聽整個動畫過程。

      7.3.4 對任意屬性做動畫

      對object的屬性abc做動畫,如果想讓動畫生效需要滿足一下兩個條件:

      (1)object必須要提供setAbc方法,如果動畫的時候沒有傳遞初始值,那麼還得提供getAbc方法,否則程式直接crash;

      (2)object的setAbc對屬性abc所做的改變必須能夠通過某種方法反映出來,比如帶來UI的改變。

      如何給一個原始對象添加動畫可參見p285頁的方法2;

      7.3.5 屬性動畫的工作原理

       屬性動畫要求動畫作用的對象提供該屬性的set方法,屬性動畫根據你傳遞的該屬性的初始值和最終值,以及動畫的效果多次去掉用set方法。每次 傳遞給set方法的值都是不一樣的,確切來說是隨著時間的推移,所傳遞的值越來越接近最終值。如果動畫的時候沒有傳遞初始值,那麼還要提供get方法,因 為系統要去獲取屬性的初始值。

    7.4 使用動畫的註意事項

      註 意View動畫是對View的影像做動畫,並不是真正改變View的狀態,因此有時候會出現動畫完成後View無法隱藏的現象,即 setVisibility(View.GONE)失效了,這個時候只要調用view.clearAnimation()清除View動畫即可解決此問 題。

       將View移動(平移)後,在Android3.0以前的系統上,不管是View動畫還是屬性動畫,新位置均無法觸發單擊事件,同時,老位置仍 然可以觸發單擊事件。儘管View已經在視覺上不存在了,將View移回原位置以後,原位置的單擊事件繼續生效。從3.0開始,屬性動畫的單擊事件觸發位 置為移動後的位置,但是View動畫仍然在原位置。

 


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

-Advertisement-
Play Games
更多相關文章
  • 普通GUID 會發生很大的頁分裂情況,這在一個表反覆修改的情況下,可能會明顯影響查詢速度。
  • 步驟:1,選擇要插入的資料庫--右鍵--任務--導入數據2,點擊下一步,選擇數據源,excel文件路徑,和版本信息(註:使用2010及以上版本的office,請先將格式轉換為03 或07格式的以便識別)3,選擇目標資料庫4,執行成功5,查看導入數據,可以重命名以上就是資料庫導入excel文件的步驟,...
  • ImageView的講解一、src和background的區別background我們通常理解是背景,而src是內容,當使用src填入圖片的時候是以圖片的大小直接填充,並不會進行拉伸,而background填入圖片會根據指定的大小對圖片進行縮放拉伸。 當我們設置寬和高都...
  • 原網址 : http://www.cnblogs.com/zdz8207/archive/2012/11/30/eclipse android adt update.html網上解決方法主要有這幾種 :1.有時候eclipse不自動編譯,把project clean一下,讓R.java重新生成 2....
  • 需要用到的lib包 :解析json gson包,從網路地址解析json數據成String字元串的非同步網路解析工具AsyncHttpClient等下載地址:點擊下載Xlistview 下拉上拉第三方框架 點擊下載側滑菜單的lib 點擊下載 1 package com.lixu.testjsonall;...
  • 支付寶相關資源下載地址:支付寶開放平臺 在移動支付功能處下載。一、使用官方的Demo需要配置基本信息:打開“APViewController.m”文件,對以下三個參數進行編輯。二、集成支付寶到自己的工程1、啟動Xcode,為了方便快速開發,將解壓包裡面的AlipaySDK.bundle和Alipay...
  • 解決思路: 不用計算Toast的時間之類的,就是定義一個全局的成員變數Toast, 這個Toast不為null的時候才去make,否則直接setText.為了按返回鍵後立即使Toast不再顯示,重寫父類Activity的onBackPressed()方法裡面去cancel你的Toast即可.代碼:p...
  • /** * 驗證手機格式 */ public static boolean isMobileNO(String mobiles) { /* 移動:134、135、136、137、138、139、150、151、157(TD)、158、159、187、188 聯通:13...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...