Android基礎夯實--重溫動畫(二)之Frame Animation

来源:https://www.cnblogs.com/ryanleee/archive/2018/01/05/8204642.html
-Advertisement-
Play Games

心靈雞湯:天下事有難易乎,為之,則難者亦易矣;不為,則易者亦難矣。 摘要 當你已經掌握了Tween Animation之後,再來看Frame Animation,你就會頓悟,喔,原來Frame Animation簡單多了,那麼恭喜你,你已經在Animation這條路上走得越來越遠了,當你花十來分鐘認 ...


心靈雞湯:天下事有難易乎,為之,則難者亦易矣;不為,則易者亦難矣。

摘要

當你已經掌握了Tween Animation之後,再來看Frame Animation,你就會頓悟,喔,原來Frame Animation簡單多了,那麼恭喜你,你已經在Animation這條路上走得越來越遠了,當你花十來分鐘認真看完這篇文章,你就已經走完了動畫這條小路的2/3。

概述

我們都知道,在Android系統中,官方給我們提供了兩種類型的動畫:屬性動畫(Property Animation)視圖動畫(View Animation),而視圖動畫又包含了兩種類型:補間動畫(Tween animation) 和 幀動畫(Frame animation)。

Android基礎夯實--重溫動畫(一)之Tween Animation我們已經對Tween Animation進行了詳細講解,這一片,我會給大家介紹視圖動畫的另一種 Frame Animation。

在開發中,除了常用的Tween Animation以外,我們還會用到Frame Animation,就是我們所說的幀動畫,之所以要實現幀動畫是因為它可以實現類似電影的動態效果,因為我們平時所拍的視頻也是通過一張張照片插入每一幀,串聯起來,從而實現連續播放的視覺效果,而這Tween Animation是無法實現,只能通過Frame Animation來實現。例如我們常見的App動態引導頁,很多都是通過Frame Animation來實現的。

引導頁

總體來說,Frame Animation實現起來也是比較簡單,本文也是主要做一個拋磚引玉,只做基本介紹,更多進階知識需要大家日後摸索,更權威解釋可以看官方文檔:Frame Animation。以下先通過Demo給大家更直觀地展示Frame Animation。

本文主要對View Animation的Frame Animation做介紹,如果大家有興趣,可以繼續閱讀本動畫系列其他相關文章,作者也在不斷更新完善相關內容,希望大家可以指出有誤之處。

Android基礎夯實--重溫動畫(一)之Tween Animation

Android基礎夯實--重溫動畫(三)之初識Property Animation

Android基礎夯實--重溫動畫(四)之屬性動畫 ValueAnimator詳解

Demo

這個Demo主要是使用Frame Animation來實現ImageView播放gif圖效果。

效果圖

效果圖

代碼實現

  1. 首先在res/drawable/目錄下,增添一個frame.xml文件,裡面主要寫每一幀播放哪一張照片。最外層標簽必須是animation-list,子標簽item對應每一幀,每一個item裡面的drawable屬性對應圖片位置、duration對應一幀的時長。
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item
        android:drawable="@drawable/g1"
        android:duration="200" />
    <item
        android:drawable="@drawable/g2"
        android:duration="200" />
    <item
        android:drawable="@drawable/g3"
        android:duration="200" />
    <item
        android:drawable="@drawable/g4"
        android:duration="200" />
    <item
        android:drawable="@drawable/g5"
        android:duration="200" />
    <item
        android:drawable="@drawable/g6"
        android:duration="200" />
</animation-list>
  1. 在Activity中,實現如下代碼:
//將控制項背景設置為我們的AnimationDrawable資源文件
image.setBackgroundResource(R.drawable.frame);
mBinding.play.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //拿到要編譯成AnimationDrawable的背景
        AnimationDrawable imageAnimation = (AnimationDrawable)image.getBackground();
        //開始動畫
        imageAnimation.start();
    }
});

Frame Animation

在Android的官方文檔中,Google對Frame Animation的講解只是用了比較小的篇幅,可能是因為過於簡單,當然,大家通過我上面所說的例子也可以看得出Frame Animation的使用也是非常的簡單,下麵主要介紹Frame Animation的要點。

文件位置

在資源文件夾下:res/drawable/filename.xml

編譯

在上面的例子我們可以瞭解到,在Activity中,我們是通過image.getBackground()獲取到的對象轉為了AnimationDrawable,這是因為在我們的xml文件被編譯器編譯之後就變成了 AnimationDrawable類。

語法

<?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="@[package:]drawable/drawable_resource_name"
        android:duration="integer" />
</animation-list>

標簽

** < animation-list > ** :外層必須要的標簽,裡面包含一個以上的

  • 屬性:
    1. android:oneshot:true則只運行一次,false則重覆動畫。

** < item > ** :每一幀的動畫,必須是

  • 屬性:
    1. android:drawable:對應資源文件。
    2. android:duration:每一幀時長。

AnimationDrawable

AnimationDrawable就是對應於我們自身定義的xml文件,在Java代碼中將xml對象轉為了AnimationDrawable之後,我們就可以通過它來獲取xml文件裡面的屬性。

父類

AnimationDrawable繼承於Object -> Drawable -> DrawableContainer。

介面

實現了Runnable, Animatable介面。

XML文件中的變數

  • android:drawable: 用於該幀的圖片。
  • android:duration: 每一幀的時長。
  • android:oneshot: true則只運行一次,false則重覆動畫。
  • android:variablePadding: 如果true,允許drawable文件的當前狀態改變。
  • android:visible: 是否可見。

方法

  • void addFrame (Drawable frame, int duration): 添加一幀動畫到動畫裡面。
  • int getDuration (int i): 獲取第i幀的時長。
  • Drawable getFrame (int index): 獲取第i幀的Drawbale。
  • int getNumberOfFrames (): 獲取共有多少幀。
  • void inflate (Resources r, XmlPullParser parser, AttributeSet attrs, Resources.Theme theme): 從XML資源裡面載入一個Drawable文件。
  • boolean isOneShot (): 判斷是否單次播放。
  • boolean isRunning (): 判斷動畫是否還在運行。
  • Drawable mutate (): 一個drawable如果使用了mutate()方法,那麼對這個drawable屬性(包括設置drawable的透明度)修改將不會共用。
  • void setOneShot (boolean oneShot): 設置動畫播放一次或者迴圈。
  • boolean setVisible (boolean visible, boolean restart): 設置該AnimationDrawable是否可見。
  • void start (): 播放。
  • void stop (): 停止。
  • void unscheduleSelf (Runnable what): 讓動畫重新回到-1幀。

總結

Frame Animation總體來說比較簡單,通過XML的劃分幀,在Java代碼中獲取到編譯的AnimationDrawable,然後進行播放,難點不多,卻是很多引導頁的常用實現方法。


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

-Advertisement-
Play Games
更多相關文章
  • h2資料庫是常用的開源資料庫,與HSQLDB類似,十分適合作為嵌入式資料庫使用,其他的資料庫大部分都需要安裝獨立的客戶端和伺服器端 h2的優勢: (1)h2採用純java編寫,因此不受平臺的限制 (2)h2只有一個jar文件,十分適合作為嵌入式資料庫使用 (3)h2提供了一個十分方便的web控制台用 ...
  • 1.1 MHA簡介 1.1.1 MHA軟體介紹 MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於Facebook公司)開發,是一套優秀的作為MySQL高可用性環境下故障切換和主從提升的高 ...
  • 工作中有個excel,其中一列是一組數字。數字的含義是商品的商品碼。商品的狀態有3種,1,2,3.需要連接到後臺的oracle資料庫,查詢商品的狀態,然後從這個excel表的商品碼中篩選出1或者2的。然後保存在另外一個excel里。 整個代碼是: #coding:utf-8import xlrdim ...
  • 大家好,今天給大家帶來一個最近很火的問題,就是英特爾漏洞問題。今年年初,英特爾被曝出其處理器存在一個底層設計缺陷,而要解決這一晶元級漏洞問題,必須得重新設計Windows、Linux內核系統。據瞭解,此次被曝出的英特爾晶元漏洞,無法通過微代碼更新進行彌補,需要與操作系統研發公司一起修補。而此次受到影 ...
  • iOS雙滑塊選擇器 《SDRangeSliderView》 https://github.com/qddnovo/SDRangeSliderView 你不知道我是一個憤怒的控制項 實現了通用性和便利性 假如生活欺騙了你 你就去嘲笑 賈乃亮 羽凡 綠 ...
  • 性能優化界面和業務邏輯之間事件交互小程式調用nativeNative回調小程式圖片源文件優化渲染優化----------------------------------------------------------------------------------------------------... ...
  • 在Android開發中,在儲存少量的數據時,個人感覺SharedPreferences是最好的選擇,SharedPreferences是以鍵值對的方式進行儲存,支持boolean,int,float,long,String 以及Set<String>,使用方法如下: 先在類中進行聲明: 在onCre ...
  • 小程式目前是越來越火爆了,我們公司我算是比較早研究小程式的,做了一個小程式二維碼生成器,希望能夠對大家有用. 支持小程式參數二維碼,場景二維碼,小程式美化,參數二維碼統計 https://weixin.hotapp.cn 如果還有什麼新的需求,可以可以留言給我,或者加QQ群。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...