1. 程式人生 > >Android DrawableAnimation逐幀動畫載入多圖(OOM的解決)

Android DrawableAnimation逐幀動畫載入多圖(OOM的解決)

想做一個逐幀動畫,用了一百來張圖片,結果記憶體溢位了,找了半天最後算是解決了。

本來是在drawable裡面寫一個animation-list,設定ImageView的backgroud,

然後在Activity裡面

animationDrawable = (AnimationDrawable)mImageView.getBackground();
animationDrawable.start();
但是圖片多了就會記憶體溢位了。

最後採用的解決辦法是這個http://www.kankanews.com/ICkengine/archives/86482.shtml

稍微改動了一下。

裡面有三個構造方法,和兩個播放的方法,直接構造就可以播放動畫了

package com.example.animationoom;

import android.os.Handler;
import android.widget.ImageView;

public class SceneAnimation  {
	private ImageView mImageView;
	private int[] mFrameRess;// 圖片
	private int[] mDurations;
	private int mDuration;
	
	private Handler handler = new Handler();
	Runnable mRunnable;

	private int mLastFrameNo;
	private long mBreakDelay;
	
	//引數包括pDurations陣列,執行播放play(1);
	public SceneAnimation(ImageView pImageView, int[] pFrameRess, int[] pDurations) {
		mImageView = pImageView;
		mFrameRess = pFrameRess;
		mDurations = pDurations;
		mLastFrameNo = pFrameRess.length - 1;

		mImageView.setBackgroundResource(mFrameRess[0]);
		play(1);
	}
	
	//引數包括一個int 的執行時間 pDuration, 執行迴圈播放playConstant(1);
	public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration) {
		mImageView = pImageView;
		mFrameRess = pFrameRess;
		mDuration = pDuration;
		mLastFrameNo = pFrameRess.length - 1;

		mImageView.setBackgroundResource(mFrameRess[0]);
		playConstant(1);
	}
	
	//引數包括一個int的pDuration,一個long的pBreakDelay,表示每次播放的間隔,執行迴圈播放playConstant(1);
	public SceneAnimation(ImageView pImageView, int[] pFrameRess,int pDuration, long pBreakDelay) {
		mImageView = pImageView;
		mFrameRess = pFrameRess;
		mDuration = pDuration;
		mLastFrameNo = pFrameRess.length - 1;
		mBreakDelay = pBreakDelay;

		mImageView.setBackgroundResource(mFrameRess[0]);
		playConstant(1);
	}

	private void play(final int pFrameNo) {
		
		mRunnable = new Runnable() {
			public void run() {
				mImageView.setBackgroundResource(mFrameRess[pFrameNo]);
				if (pFrameNo == mLastFrameNo)
					play(0);
				else
					play(pFrameNo + 1);
			}
		};
		handler.postDelayed( mRunnable, mDurations[pFrameNo]);
	}

	private void playConstant(final int pFrameNo) {
		Handler handler = new Handler();
		handler.postDelayed(new Runnable() {
			public void run() {
				mImageView.setBackgroundResource(mFrameRess[pFrameNo]);

				if (pFrameNo == mLastFrameNo)
					playConstant(0);
				else
					playConstant(pFrameNo + 1);
			}
		}, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay : mDuration);
	}
	

};

但是這樣的方法還是有問題,在載入圖片的時候,會有卡頓的現象。

而且目前是不能實現單詞播放的,還需要做些改動。

相關推薦

Android DrawableAnimation動畫載入OOM解決

想做一個逐幀動畫,用了一百來張圖片,結果記憶體溢位了,找了半天最後算是解決了。 本來是在drawable裡面寫一個animation-list,設定ImageView的backgroud, 然後在Activity裡面animationDrawable = (Animatio

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

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

Android 自定義 HorizontalScrollView 打造再圖片控制元件也不怕 OOM 的橫向滑動效果

自從Gallery被谷歌廢棄以後,Google推薦使用ViewPager和HorizontalScrollView來實現Gallery的效果。的確HorizontalScrollView可以實現Gallery的效果,但是HorizontalScrollView存在一個很大的問

Android中Scrollview、ViewPager衝突問題彙總解決

顯示問題: 1、設定ScrollView的fillViewPort為true 2、設定ViewPager的layout_height為一個固定高度,比如:100dip 衝突問題: 不過ViewPager顯示出來以後,還有另外一個衝突:ViewPager左右不能滑動了!是的

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 動畫動畫小述

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

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

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

Android動畫基礎【1】——動畫

動畫的意義: 1. 增強視覺效果   2. 更好的引導使用者 整個課程目標:  1. 瞭解定義逐幀動畫的方法 2. 瞭解定義視覺動畫的方法 3. 瞭解定義屬性動畫的方法 整個課程的學習內容: 1. 逐幀動畫 2. 視覺動畫系統 3. 屬

Android 用Animation-list實現動畫

第一步:先上圖片素材,以下素材放到res/drawable目錄下: 圖片素材: 檔名稱: icon1.png icon2.png icon3.png icon4.png icon5.png icon6.p

android動畫 通過AnimationDrawable控制動畫

效果圖: 當我們點選按鈕時,該圖片會不停的旋轉,當再次點選按鈕時,會停止在當前的狀態。 activity程式碼: [java] view plain copy print?package cn.com.chenzheng_java.animation;  import android.app.Acti

Android中的動畫詳解系列【1】——動畫

逐幀動畫其實很簡單,下面我們來看一個例子:<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:andro

Android動畫之animation-list實現動畫

簡介 幀動畫(Frame Animation又稱Drawable Animation)是最簡單的Android動畫效果,其與電影多重連續幀播放原理相似,通過視覺殘留來讓人感知到動畫效果。其實現方式是將

Android自定義控制元件:動畫類---動畫AnimationDrawable

1:概述             Android動畫包括View Animation(檢視動畫)和Property Animator(屬性動畫),而View Animation包括Tween An

Android動畫解析-----動畫和補間動畫

今天專案又用到了動畫,發現之前掌握的那些又遺忘了不少,趁著有時間,再重新捋順一邊。 Android中的動畫分為 逐幀動畫,補間動畫,屬性動畫 三種. 逐幀動畫(Frame Animation) 逐幀動畫:就像GIF圖片一樣,通過一系列的Drawab

Android仿微信開啟紅包動畫動畫

Frame Animation(逐幀動畫):        逐幀動畫(Frame-by-frame Animations)從字面上理解就是一幀挨著一幀的播放圖片,就像放電影一樣。和補間動畫一樣可以通過xml實現也可以通過java程式碼實現。接下來藉助目前專案中的一個開

android中使用動畫實現自定義progressbar元件

一 自定義progressbar   <1>素材:逐幀圖片若干張(根據自己loading元件的特點製作)   <2>定義每張圖片的顯示的順序及時間(定義幀動畫列表)       在res/drawable目錄下,  建立一根標籤為“animation

android,補間動畫詳解。

在android的世界中有三種動畫,它們就是逐幀動畫,補間動畫,屬性 動畫。接下來我就分別演示下三種動畫的簡單用法。 各動畫的定義: 逐幀動畫:就是短時間切換圖片,讓人們肉眼看起來是連續的,其實就是播放一組圖片。就相當於gif圖片的生成、還有我們小時候

Android動畫-動畫

介紹:“逐幀動畫”,就是將多張圖按照播放動畫片那樣,從第一張圖片播放到最後一張。 animation.xml <?xml version="1.0" encoding="utf-8

Android開發之動畫優化

Android上如果使用逐幀動畫的話,可以很方便地使用AnimationDrawable,無論是先宣告xml還是直接程式碼裡設定,都是幾分鐘的事,但使用AnimationDrawable有一個致命的弱點,那就是需要一次性載入所有圖片到記憶體,萬一幀數多了或者每張圖片都比較大