1. 程式人生 > >android 幀動畫的替代方案

android 幀動畫的替代方案

在android 裡有豐富的動畫實現過程,其中幀動畫的使用也是非常廣泛,比如在網路載入資料的時候我們希望介面中間顯示一頭老牛努力跑動的效果.
此時我們大多都會選擇讓美工做好一系列老牛跑動的圖片,少則5張,多則10張,圖片越多,動畫將會越平滑細膩,於是我們興奮的要求美工,給我來20張!
然後 我們急匆匆的做好幀動畫的xml檔案,拿到20張漂亮的圖片,再然後興沖沖的去執行看效果,我們悲劇的發現,程式並沒有跑起來,而是莫名其妙的閃退了.如果能看到日誌,你發覺的閃退的原因其實很簡單, OOM!
OMG! 我們最不願遇到的記憶體問題.是我們的圖片太大嗎?還是我們動畫間隔太短.我們想盡一切辦法想要處理掉這個BUG!
可是我要告訴你,拋棄幀動畫吧!因為你不確定在你解決了一臺測試機的OOM,就一定能保證在另一臺測試機上(可能記憶體更小)不會重現.
那不使用幀動畫我們該如何實現想要的效果呢?

今天我們要使用的技能GET為屬性動畫.顧名思意,屬性動畫就是通過不間斷改變物件的屬性來達到變化的動態效果,什麼是屬性呢,控制元件的x,y座標,控制元件的旋轉角度,控制元件的縮放大小等等.
當然,屬性動畫最低版本要求為3.0.因此我們需要捨棄那些已經過時的低版本系統.很幸運的是,目前3.0以下的手機目前整個地球只剩下不到5%的使用者,而這5%的使用者更不會很幸運的使用你的APP.所以捨棄他們,你將獲得新生!

有關低版本相容問題,想要在這裡bi bi 一下,每當一個新的API出現的時候,我們很興奮它帶給我們的新特性,比如透明狀態列,沉浸式等等,但我們不能使用!為的就是這該死的低版本相容,因為新API出現的時候,整個星球還充斥著低版本的手機,你必須要照顧他們的情緒.什麼時候等到這些低版本手機即將被淘汰的時候,我們才敢稍微放肆一點,去沾染這些新的API.太奇怪的這個狀態.

好了,言歸正傳.如何用屬性動畫實現幀動畫的效果呢?這裡我們講一下圖片控制元件(ImageView)的一個特性Level. 我們可以使用level資源為圖片設定不同level下的圖片.典型的使用就是電量level. 當電量低於0時顯示一張空電量的圖片,小於10%的時候顯示1/10的電量圖片….

暫時沒有明白level為什麼沒有出現在imageview的屬性列表中,我們只能通過setImageLevel來設定圖片的level卻無法getImageLevel來獲取圖片的level.

沒關係,我們先來實現我們的level資源吧.

<level-list><item android:drawable="@drawable/animation1"
android:maxLevel="1"/><item android:drawable="@drawable/animation2" android:maxLevel="2"/><item android:drawable="@drawable/animation3" android:maxLevel="3"/><item android:drawable="@drawable/animation4" android:maxLevel="4"/><item android:drawable="@drawable/animation5" android:maxLevel="5"/><item android:drawable="@drawable/animation6" android:maxLevel="6"/><item android:drawable="@drawable/animation7" android:maxLevel="7"/><item android:drawable="@drawable/animation8" android:maxLevel="8"/><item android:drawable="@drawable/animation9" android:maxLevel="9"/><item android:drawable="@drawable/animation10" android:maxLevel="10"/><item android:drawable="@drawable/animation_stop" android:maxLevel="10"/></level-list>

很高興,我們再也不害怕過多的圖片導致OOM問題,因為level資源並不會將所有的level圖片一次性全部載入.
這裡我們甚至可以實現電影般流暢的動畫效果而不用但心OOM.

我們將這個資源像普通背景一樣設定為圖片的src.
但是我們如何讓他動起來呢?
檢視屬性動畫的特性我們有如下結論:
- 支援對所有View能更新的屬性的動畫(需要屬性的setXxx()和getXxx())。
但是我們的ImageView並沒有level這樣一個屬性,怎麼辦呢,我們可以繼承ImageView,為它增加這樣一個屬性:

    // 提供一個用於屬性動畫操作的圖片類。imageLevel不屬於ImageView的屬性,因此只能自己定義此屬性。
    // 並通過屬性動畫進行修改。
    public static class LevelImageView extends ImageView {
        public LevelImageView(Context context) {
            super(context);
        }
        private int imageLevel = 0;
        public void setImageLevel(int level) {
            if (this.imageLevel == level)
                return;
            super.setImageLevel(level);
            this.imageLevel = level;
        }
        public int getImageLevel() {
            return imageLevel;
        }
        // 下一level介面。
        public void nextLevel() {
            setImageLevel(imageLevel++ % maxLevel);
        }
        private int maxLevel = 10;

        public void setMaxLevel(int maxLevel) {
            this.maxLevel = maxLevel;
        }
    }

如此我們就可以像普通的屬性一樣來操縱level屬性了.

我們粗暴一點上程式碼吧.

LevelImageView imageView = new LevelImageView(getContext());
//設定level資源.
imageView.setImageResource(R.drawable.drawable_refresh_image);        imageView.setScaleType(ScaleType.CENTER_INSIDE);
//新建動畫.屬性值從1-10的變化
headerAnimator = ObjectAnimator.ofInt(imageView, "imageLevel", 1, 10);
//設定動畫的播放數量為一直播放.
 headerAnimator.setRepeatCount(ObjectAnimator.INFINITE);
 //設定一個速度加速器.讓動畫看起來可以更貼近現實效果.
 headerAnimator.setInterpolator(new LinearInterpolator());
 headerAnimator.setRepeatMode(ObjectAnimator.RESTART);
 headerAnimator.setDuration(600);
 headerAnimator.start();

這樣動畫就開始了,他通過不停的改變imageLevel屬性達到顯示不同圖片的效果,
當然你也可以很隨意的控制這個動畫暫停,重播,停止等等.不像幀動畫 無法靈活控制.

以後就可以全面使用屬性動畫來替代補間動畫和幀動畫了.

相關推薦

android 動畫替代方案

在android 裡有豐富的動畫實現過程,其中幀動畫的使用也是非常廣泛,比如在網路載入資料的時候我們希望介面中間顯示一頭老牛努力跑動的效果. 此時我們大多都會選擇讓美工做好一系列老牛跑動的圖片,少則5張,多則10張,圖片越多,動畫將會越平滑細膩,於是我們興奮的

Lottie在手,動畫我有:ios/Android/Web三端複雜動畫解決方案

本文編輯於OS X系統,之前出現過windows下看不到部分圖片的情況,如有請大家告知 為什麼需要Lottie 在相對複雜的移動端應用中,我們可能會需要使用到複雜的幀動畫。例如: 剛進入APP時候可能會看到的入場小動畫,帶來愉悅的視覺享受 許多Icon的互動變化比較複雜多變的

Android 動畫 的實現

文章目錄 1、幀動畫 2、檔案結構 3、activity_main.xml 檔案 4、frameanimation.xml 檔案 自定義的 動態檔案 5、ManiActivity 檔案

Android 動畫,載入動畫

1、建立drawable檔案ring_animation.xml <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.co

Android動畫實現,防OOM,比原生動畫集節約超過十倍的資源

2015年專案接到一個需求,實現一個嚮導動畫,這個動畫一共六十張圖片,當時使用的是全志A33的開發(512的記憶體),通過使用Android的動畫集實現,效果特別卡頓,然後想到這種方式來實現,效果很流暢

Android 動畫(Frame Animation) 動畫停止在第一

專案中遇到的問題: 需求: 做一個聊天頁面,要求播放語音時,有一個類似於喇叭的動畫,從小到大不停迴圈,語音播放完,動畫停止在第一幀。當點選正在播放的語音時,語音停止,動畫回覆到第一幀(回覆到第一幀是難點) 實現:用Frame Animation   可以在Java程式碼中新

Android 動畫OOM問題優化

轉載請註明出處,謝謝 普通實現 實現一個幀動畫,最先想到的就是用animation-list將全部圖片按順序放入,並設定時間間隔和播放模式。然後將該drawable設定給ImageView或Progressbar就OK了。 首先建立幀動畫資原始檔dra

Android動畫,逐動畫載入圖片過多時OOM異常的解決和替代方法

1.首先新增逐幀動畫 播放逐幀動畫,在工程中res目錄下建立一個anim資料夾,新增動畫anim_welcome.xml檔案如下: <?xml version="1.0" encoding="utf-8"?> <animation-li

Android 學習之逐動畫(Frame)

http sta ram override start pub fill creat 代碼 幀動畫就是將一些列圖片。依次播放。利用肉眼的“視覺暫留”的原理,給用戶的感覺是動畫的錯覺,逐幀動畫的原理和早期的電影原理是一樣的。 a:須要定義逐幀動畫,能夠通過代碼定義。也能夠

Android動畫效果之Frame Animation(逐動畫

想要 顯示 star 載體 rop 復雜 ide sources post 前言: 上一篇介紹了Android的Tween Animation(補間動畫) Android動畫效果之Tween Animation(補間動畫),今天來總結下Android的另外一種動

Android之使用枚舉利弊及替代方案

xxd result out idt image png eat find oid Android上不應該使用枚舉,占內存,應該使用@XXXDef註解來替代 使用 Enum 的缺點 每一個枚舉值都是一個對象,在使用它時會增加額外的內存消耗,所以枚舉相比與 Integer 和

移動端動畫抖動解決方案

也有 遇到 pri 其他人 fix mage 移動端 anim 其他 概述 今天在做移動端幀動畫的時候遇到了抖動的問題,自己查找了一下資料,並且總結出了3個比較好的解決方案,記錄下來,供以後開發時參考,相信對其他人也有用。 由於移動端用的是rem布局,所以計算下來總會有一些

Android核心技術-day03-04-動畫

package com.gaozewen.frameanimation; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.support.v7.

Android開發——動畫使用篇章(動畫,補間動畫)(一)

Android 動畫分為 view動畫,幀動畫,屬性動畫,本片文章是參考多篇動畫介紹部落格,總結動畫使用API,使用場景。適合日常開發 搬磚使用。 幀動畫 幀動畫是最容易實現的一種動畫,這種動畫更多的依賴於完善的UI資源,他的原理就是將一張張單獨的圖片連貫的進行播放,從而在視覺上

android 動畫--動畫--仿美團載入中小人

1 把資源圖片放到drawable中 2 在drawable中寫動畫的xml檔案animation01 Animation01.xml <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:a

Android 動畫之逐動畫小述

一、概述 本節主要介紹下逐幀動畫的基本使用,下面我們就從XML方式建立動畫和程式碼方式建立動畫來分別說下吧 二、逐幀動畫介紹 在開始介紹逐幀動畫之前,先來看一下在本例中我們要實現的逐幀動畫的效果 逐幀動畫,我的理解就是將一幀幀的靜態圖片進行有序的展示,利用人眼的視覺

Android - 動畫動畫,補間動畫,屬性動畫,以及插值器)

一: 動畫的分類 幀動畫 補間動畫 屬性動畫 二:解析 1. 幀動畫 (1)定義 這些圖片是將一些列的drawable組合在一起,進行連續的播放, 類似於以前電影源用膠捲進行動畫播放 (2)有圖有真相 (3)準備圖片 看著是不是還行,哈哈,

Android三種動畫之(一)動畫

幀動畫介紹:就是將原有的照片一幀一幀的排列好按照一定的順序播放而達到動畫的效果 技術實現:實現的方式有兩種,一種是在資原始檔中新增圖片,一種是直接在程式碼中新增圖片 第一種:在資原始檔中新增圖片 1.在drawable裡面新建檔案frame_animation.xml&nb

Android動畫基礎之補間動畫與逐動畫

Android動畫分類主要分三類: Tweened Animation補間動畫 Frame Animation幀動畫 Property Animation屬性動畫 現在我們來介紹一下補間動畫。Tweened Animation補間動畫,是通過配置動畫檔案

Android-日常遭遇-動畫oom處理篇

專案遭遇 實現幀動畫,我一開始想到的是直接通過animation-list將全部圖片按順序放入,並設定時間間隔和播放模式。然後將該drawable設定給ImageView,然後就可以了 <?xml version="1.0" encoding="utf-8"?>