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
  • 移動開發(一):使用.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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...