一起學Android之Animation

来源:https://www.cnblogs.com/hsiang/archive/2019/05/22/10903160.html
-Advertisement-
Play Games

本文以一個簡單的小例子,簡述在Android開發中,動畫的簡單應用,僅供學習分享使用。 ...


本文以一個簡單的小例子,簡述在Android開發中,動畫的簡單應用,僅供學習分享使用。

概述

android提供了各種強大的apis,用於將動畫應用到ui元素中,來豐富應用程式的功能和應用。

動畫分類

在Android框架中,動畫主要分為三類【這三種動畫系統都是可行的選擇,但一般來說,屬性動畫系統是首選的使用方法,因為它更靈活,提供了更多的功能】,具體如下:

  • 幀動畫:將圖像資源按順序一幀一幀的播放出來,形成動畫()。
  • 補間動畫:又叫視圖動畫,是比較舊的系統,只能用於視圖組件,相對比較容易設置和提供能力滿足程式的需要。
  • 屬性動畫:在android 3.0(api等級11)中引入的屬性動畫系統,允許您對任何對象的屬性進行動畫處理,包括未呈現到屏幕上的屬性。該系統是可擴展的,並允許自定義動畫類型的屬性。

幀動畫

將動畫資源文件作為圖片控制項(ImageView)的背景圖(background)。

幀動畫涉及知識點如下:

  • AnimationDrawable: 用於創建逐幀動畫的對象,由一系列可拖動對象,可用作視圖對象的背景
  • isRunning() 是否正在運行
  • stop() 停止動畫
  • start() 開始運行

幀動畫核心代碼

 在drawable目錄下,新增一個動畫資源配置文件【animation-list節點下包含item子節點,item有兩個屬性,android:drawable=圖像資源id,android:duration=周期】,如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
 3     <item android:drawable="@drawable/n0" android:duration="300"></item>
 4     <item android:drawable="@drawable/n1" android:duration="300"></item>
 5     <item android:drawable="@drawable/n2" android:duration="300"></item>
 6     <item android:drawable="@drawable/n3" android:duration="300"></item>
 7     <item android:drawable="@drawable/n4" android:duration="300"></item>
 8     <item android:drawable="@drawable/n5" android:duration="300"></item>
 9     <item android:drawable="@drawable/n6" android:duration="300"></item>
10     <item android:drawable="@drawable/n7" android:duration="300"></item>
11     <item android:drawable="@drawable/n8" android:duration="300"></item>
12     <item android:drawable="@drawable/n9" android:duration="300"></item>
13 </animation-list>

java設置代碼如下:

 1 private AnimationDrawable drawable;
 2 
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_drawable);
 7         ImageView imageView= (ImageView) this.findViewById(R.id.ivLetter);
 8         drawable= (AnimationDrawable) imageView.getBackground();
 9         drawable.start();
10     }
11 
12     @Override
13     public boolean onTouchEvent(MotionEvent event) {
14         if(event.getAction()==MotionEvent.ACTION_DOWN){
15             if(drawable.isRunning()) {
16                 drawable.stop();
17             }else{
18                 drawable.start();
19             }
20         }
21         return super.onTouchEvent(event);
22     }

補間動畫

補間動畫,又稱漸變動畫是指定義起始狀態,結束狀態,中間狀態等,然後其他部分由程式自動生成,從而形成動畫。

補間動畫涉及知識點如下:

  • TranslateAnimation 平移動畫 控制對象位置的動畫。
  • RotateAnimation 旋轉動畫 控制對象旋轉的動畫。這個旋轉需要放置在xy平面上。您可以指定中心要使用的點,其中(0,0)是左上角。如果未指定,則(0,0)為預設旋轉點。
  • ScaleAnimation 縮放動畫 控制對象的比例尺的動畫。您可以指定點用於縮放中心。
  • AlphaAnimation 透明度動畫 控制對象的alpha級的動畫,通過更改透明度屬性,對於對象的淡入淡出,這是一個很有用的方法。
  • AnimationSet 動畫集合 上述動畫可以組合使用。
  • setFillAfter(true); 設置動畫結束後的填充
  • setDuration(2000); 動畫周期
  • setRepeatCount(2); 重覆次數
  • setRepeatMode(Animation.REVERSE); 重覆模式

補間動畫核心代碼如下:

 1   /**
 2      * 平移
 3      * @param v
 4      */
 5     protected  void transfer_click(View v){
 6 
 7         //參數是平移的起始坐標和結束坐標(起始X軸位置,結束X軸位置,起始Y軸位置,結束Y軸位置)的改變數。
 8         //TranslateAnimation trans=new TranslateAnimation(0.0f,300f,0.0f,300f);
 9         //fromXType 動畫平移改變數的類型
10         //Animation.RELATIVE_TO_SELF,0 表示控制項現在的坐標+0*控制項本身的寬度或高度
11         //Animation.RELATIVE_TO_SELF,0.5f 表示控制項現在的坐標+0.5*控制項本身的寬度或高度
12         //Animation.RELATIVE_TO_PARENT 相對於父控制項,計算方式和Animation.RELATIVE_TO_SELF一樣
13         //fromXValue 起始坐標值的改變數,如果類型是ABSOLUTE,則此值為絕對數字,否則則表示百分比(0-1)之間。
14         TranslateAnimation trans=new TranslateAnimation(Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1,Animation.RELATIVE_TO_SELF,0,Animation.RELATIVE_TO_SELF,1);
15         trans.setDuration(2000);//設置周期
16         trans.setFillAfter(true);//當結束時保持結束位置
17         trans.setRepeatCount(2);//設置重覆次數
18         trans.setRepeatMode(Animation.REVERSE);//重覆模式
19         ivTaichi.startAnimation(trans);//啟動
20     }
21 
22     /**
23      * 旋轉
24      * @param v
25      */
26     protected void rotate_click(View v){
27         //參數是旋轉的起始偏移量(度數),結束度數,旋轉中心點(相對x軸 位置和y軸位置)。
28         //RotateAnimation rotate=new RotateAnimation(0.0f,90.f,100.0f,100.0f);
29         RotateAnimation rotate =new RotateAnimation(0.0f,360.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
30         rotate.setFillAfter(true);
31         rotate.setDuration(2000);
32         rotate.setRepeatCount(2);
33         rotate.setRepeatMode(Animation.REVERSE);
34         ivTaichi.startAnimation(rotate);//啟動
35     }
36 
37     /**
38      * 縮放
39      * @param v
40      */
41     protected void scale_click(View v){
42         //fromX toX 動畫起始和結束時的X軸水平縮放因數
43         //fromY toY 動畫起始和結束時的Y軸水平縮放因數
44         ScaleAnimation scale=new ScaleAnimation(0.5f,1.5f,0.5f,1.5f);
45         scale.setFillAfter(true);
46         scale.setDuration(2000);
47         scale.setRepeatCount(2);
48         scale.setRepeatMode(Animation.REVERSE);
49         ivTaichi.startAnimation(scale);//啟動
50     }
51 
52     /**
53      * 透明度動畫
54      * @param v
55      */
56     protected void alpha_click(View v){
57         //fromAlpha toAlpha 動畫起始和結束時的透明度。範圍(0,1)
58         AlphaAnimation alpha=new AlphaAnimation(0,1);
59         alpha.setFillAfter(true);
60         alpha.setDuration(2000);
61         alpha.setRepeatCount(2);
62         alpha.setRepeatMode(Animation.REVERSE);
63         ivTaichi.startAnimation(alpha);//啟動
64     }
65 
66     /**
67      * 集合動畫
68      * @param v
69      */
70     protected  void set_click(View v){
71         AnimationSet set=new AnimationSet(true);
72         //TranslateAnimation animation1=new TranslateAnimation(0.0f,300.0f,0.0f,300.0f);
73         RotateAnimation animation2 =new RotateAnimation(0.0f,360.0f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
74         ScaleAnimation animation3=new ScaleAnimation(0.0f,1.0f,0.0f,1.0f);
75         AlphaAnimation animation4=new AlphaAnimation(0,1);
76         //set.addAnimation(animation1);
77         set.addAnimation(animation2);
78         set.addAnimation(animation3);
79         set.addAnimation(animation4);
80         set.setFillAfter(true);
81         set.setDuration(2000);
82         set.setRepeatCount(2);
83         set.setRepeatMode(Animation.REVERSE);
84         ivTaichi.startAnimation(set);//啟動
85     }

屬性動畫

屬性動畫主要通過改變對象的屬性,來實現動畫,可以進行擴展,且功能豐富。

屬性動畫涉及知識點如下:

  • ObjectAnimator 該ValueAnimator的子類提供了對目標對象上的動畫屬性的支持。該類的構造函數使用參數來定義將被動畫化的目標對象以及將被動畫化的屬性的名稱。
  • setDuration(2000); 動畫周期
  • setRepeatCount(2); 重覆次數
  • setRepeatMode(Animation.REVERSE); 重覆方式
  • start(); 啟動

屬性動畫核心代碼如下:

 1 /**
 2      * 平移
 3      * @param v
 4      */
 5     protected  void transfer_click(View v){
 6         //target 屬性動畫的目標控制項
 7         //propertyName 產生動畫的屬性,所有的屬性必須擁有set,get方法
 8         //values 屬性動畫的範圍集合
 9         ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"translationX",0,200,-200,0);
10         objectAnimator.setDuration(2000);
11         objectAnimator.setRepeatCount(2);
12         objectAnimator.setRepeatMode(Animation.REVERSE);
13         objectAnimator.start();
14     }
15 
16     /**
17      * 旋轉
18      * @param v
19      */
20     protected void rotate_click(View v){
21         ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"rotationX",0,180);
22         objectAnimator.setDuration(2000);
23         objectAnimator.setRepeatCount(2);
24         objectAnimator.setRepeatMode(Animation.REVERSE);
25         objectAnimator.start();
26     }
27 
28     /**
29      * 縮放
30      * @param v
31      */
32     protected void scale_click(View v){
33         ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"scaleX",0,1,0);
34         objectAnimator.setDuration(2000);
35         objectAnimator.setRepeatCount(2);
36         objectAnimator.setRepeatMode(Animation.REVERSE);
37         objectAnimator.start();
38     }
39 
40     /**
41      * 透明度
42      * @param v
43      */
44     protected void alpha_click(View v){
45         ObjectAnimator objectAnimator =ObjectAnimator.ofFloat(ivTaichi,"alpha",0,1);
46         objectAnimator.setDuration(2000);
47         objectAnimator.setRepeatCount(2);
48         objectAnimator.setRepeatMode(Animation.REVERSE);
49         objectAnimator.start();
50     }
51 
52     /**
53      * 集合動畫
54      * @param v
55      */
56     protected  void set_click(View v){
57         AnimatorSet set=new AnimatorSet();
58         List<Animator> list=new ArrayList<Animator>() ;
59         ObjectAnimator objectAnimator1 =ObjectAnimator.ofFloat(ivTaichi,"translationX",0,200);
60         ObjectAnimator objectAnimator2 =ObjectAnimator.ofFloat(ivTaichi,"rotationX",0,180);
61         ObjectAnimator objectAnimator3 =ObjectAnimator.ofFloat(ivTaichi,"scaleX",0,1);
62         ObjectAnimator objectAnimator4 =ObjectAnimator.ofFloat(ivTaichi,"alpha",0,1);
63         list.add(objectAnimator1);
64         list.add(objectAnimator2);
65         list.add(objectAnimator3);
66         list.add(objectAnimator4);
67         //播放一序列的動畫對象
68         set.playSequentially(list);
69         //
70         set.start();
71      }

 

 

備註

學而不思則罔,思而不學則殆!!!


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

-Advertisement-
Play Games
更多相關文章
  • 常用的語法:select--from--where--group by--having--order by 1、分組子句group by +con 按什麼分組 2、having子句 對上面分組的數據進行再次條件過濾 3、排序子句 order by order by + con ASC 升序 orde ...
  • 為什麼需要Redis集群 需要提高更大的併發量 Redis官方提出擁有10萬QPS的請求量 如果業務需要Redis擁有100萬的QPS 可以通過集群來提升併發量。 需要存儲更大的數據量 一般伺服器的機器記憶體為16G-256G 如果業務需要500G的數據量 可以通過集群的分區技術來擴展數據量 需要提高 ...
  • 今天遇到一個奇怪的問題,項目突然要從mysql切換到sql server資料庫,包含order by 子句的嵌套子查詢報錯。 示例:select top 10 name,age,sex from ( select * from user order by id desc) temp; 在mysql數 ...
  • 在MongoDB副本集的測試中發現了一個丟數據的案例。 1. 概要描述 測試場景為:一主一從一驗證 測試案例 step1 :關閉從副本; step 2 ;向主副本中插入那條數據; step 3 :關閉主副本; step 4 :開啟輔助副本,此副本升級為主副本,這是後會看到新的主副本沒有剛纔插入的幾筆 ...
  • –decode(條件,值1,返回值1,值2,返回值2,…值n,返回值n,預設值) SELECT DECODE(TEMP.SCORE, ‘A’, ‘90-100’, ‘B’, ‘80-89’, ‘C’, ‘70-79’, ‘D’, ‘60-69’, ‘E’, ‘0-59’, ‘其他’) AS XXX ...
  • 1、連接池問題 解決com.mongodb.DBPortPool$SemaphoresOut: Out of semaphores to get db connection錯誤 Mongo reader = null;MongoOptions op = new MongoOptions();//處理 ...
  • 下麵這篇中,已經有準備一些數據: 《MS SQL server對象類型type》https://www.cnblogs.com/insus/p/10903916.html 為前端服務,直接在SQL把查詢結果轉換為JSON格式數據: 實現這樣的功能,可以使用SQL的FOR JSON PATH: SEL ...
  • 執行下麵代碼,將獲取ms sql server對象類型以及其說明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREATE TABLE #type ( [type] NVARCHAR(2), [desc] NVARCHA ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...