日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Movie来播放GIF动画

發布時間:2024/1/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Movie来播放GIF动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘自

DroidKe

Just Another Android Blog

播放GIF出現的花屏問題

2010/06/10, 16:48

用Movie來播放gif動畫時,開始用android的SDK自帶的ApiDemos里的gif圖片是正常的,后來發現用上自己的gif圖片就出現了花屏的問題。

也許兩張gif圖片之間有什么設置差別造成的呢?于是我用Adobe ImageReady打開了能正常顯示的和出現花屏的gif圖片進行對比。
結果找到來解決問題的方法(也許還有別的更好的方法)。
如下圖:

右擊動畫幀,然后選擇“恢復為背景”。

標簽: gif
分類目錄: GUI??|? 評論

用Movie來播放GIF動畫

2010/06/10, 16:21

目前android.graphics.Movie類在SDK文檔中還沒有任何的說明。
Movie類是可以用來播放gif動畫,跟電影的原理一樣都是通過播放連續的幀,利用視覺暫留得到運動的效果。這倒使我想到了AnimationDrawable類,這兩者看起來差不多,于是嘗試用Movie類來播放AnimationDrawable定義的動畫,失敗了。

1,原理

通過不停的重新繪制來換幀。

2,方法說明

decodeByteArray(byte[] data, int offset, int length)
decodeFile(String pathName)
decodeStream(InputStream is)
三種不同的靜態方法來獲取Movie對象。三種方式的原理其實都一樣,都是讀入字節流來解碼創建Movie對象。decodeByteArray是從一個已經存在的字節數組中創建,decodeFile是從一個文件讀入字節流來創建。

draw(Canvas canvas, float x, float y)
draw(Canvas canvas, float x, float y, Paint paint)
繪制動畫幀。
它們其實還是調用Canvas的drawBitmap來繪制幀的。

duration()
動畫持續的時間,也就是完成一次動畫播放的時間。

isOpaque()
是不是不透明

setTime(int relativeMilliseconds)
設置相對本次播放第一幀時間,根據這個時間來決定顯示第幾幀。

例如:
int relTime=(int)((now – moviestart)%movie.duration());
now:系統當前時刻
moviestart:動畫開始的時間
movie.duration:動畫持續的時間,也就是完成一次動畫的時間
注意這是取余操作,這才能算出當前這次重復播放的第一幀的時間。

height() 高
width() 寬

3,實例

public class Main extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new SampleView(this));}private static class SampleView extends View {private Movie mMovie;private long mStart=0;private int relTime;public SampleView(Context context) {super(context);mMovie = Movie.decodeStream(context.getResources().openRawResource(R.drawable.pig));}@Override protected void onDraw(Canvas canvas) {long now=android.os.SystemClock.uptimeMillis();if(mStart==0) mStart = now;int dur=mMovie.duration();if(dur==0) dur=1000;relTime=(int)((now-mStart)%dur);mMovie.setTime(relTime);canvas.drawColor(Color.WHITE);mMovie.draw(canvas, 0,0);this.invalidate();}} } 標簽: gif, movie
分類目錄: GUI??|? 1 條評論

對Animation的理解

2010/06/08, 14:11

對android的Animation的初級理解,Moandroid的下面三篇文章已經講解的很清楚了。
http://www.moandroid.com/?p=790
http://www.moandroid.com/?p=808
http://www.moandroid.com/?p=812

1,android的動畫分為兩種:Tween Animation和Frame Animation。
這個兩種動畫的原理也是不相同的,他們的包在SDK中的位置也是不一樣。Tween動畫的包在android.view.animation下,Frame動畫的包在android.graphics.drawable下。

2,這兩種動畫的不同在于:
Frame動畫是對預先設置好的圖片進行依次顯示,以產生動畫效果,就象電影那樣。
Tween動畫則是要把它作用于某個對象上,如view組件,drawable。例如有個Button,想讓它產生轉換位置的動畫效果,那么就要創建一個TranslateAnimation對象,然后把它作用于這個Button上。

3,那么TranslateAnimation是如何才能作用與Button上呢?
View對象都有一個setAnimation方法就是來和動畫關聯起來產生動畫效果。那么如果才能讓drawable也產生動畫呢,drawable可沒有setAnimation方法來調用的。
android的View組件其實也是調用android.graphics.*包里的相關工具繪制出來的,也就是所View產生動畫的原理同樣可以讓drawable產生動畫。

4,Tween動畫的原理
View組件是由Canvas來繪制出來的。
Canvas類包含一個Martix,在繪制時會先進行一次矩陣運算,把運算的的結果顯示在Canvas上。這時圖片就產生了變動,圖形變換通過仿射矩陣實現。圖形變換是圖形學中的基本知識。簡單來說就是,每種變換都是一次矩陣運算。
Animation類有有個getTransformation(long currentTime, Transformation outTransformation)方法來獲取此動畫當前時刻的Transformation,它記錄了仿射矩陣 Matrix,動畫每觸發一次,會對原來的矩陣做一次運算。然后通過Transformation的getMatrix()方法把此Martix給提取出來。
然后讓Cavnas運行此Martix,通過Canvas的concat(Matrix matrix)方法來替換當前的martix。
到這里View按Animation的變換了一次,接下來就是要不停的從Animation中獲取Martix(如何變換的信息),Canvas不斷的改變,就產生的動畫效果。

5,讓drawable產生Tween動畫的例子

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 public class Main extends Activity {private Animation ani ;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new myView(this));}private class myView extends View{ private Drawable da;private ScaleAnimation sa;private int i=0;public myView(Context context) {super(context);// TODO Auto-generated constructor stub//創建drawableda =getResources().getDrawable(R.drawable.google);da.setBounds(0, 0,da.getIntrinsicWidth(), da.getIntrinsicHeight());//創建一個Animation,并設置。sa = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f);sa.setDuration(3000);sa.setRepeatCount(1);sa.setRepeatMode(2);sa.startNow();}@Overrideprotected void onDraw(Canvas canvas){ //獲取TransformationTransformation tf = new Transformation();sa.getTransformation(AnimationUtils.currentAnimationTimeMillis(), tf);canvas.drawColor(Color.BLACK);//獲取Matrix并設置到canvascanvas.concat(tf.getMatrix()); da.draw(canvas); //這個是來設置不停的獲取Martix來重繪invalidate();}} }
標簽: Animation, drawable
分類目錄: GUI??|? 評論

有關Intent的putExtra

2010/05/19, 12:25

我們可以通過putExtra方法向Intent中添加數據。

在Intent類中有很多重載的putExtra方法。在android中Intent是通過Bundle類型來傳遞數據的,這些重載的方法獲取到參數后也是轉換成Bundle類型后才傳輸的。

例如其中一個方法的實現:

public Intent putExtra(String name, byte value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putByte(name, value); return this; } 如果想傳多組值,可以多次調用putExtra方法: intent1.putExtra(“name”,”liu”); intent1.putExtra(“city”,”beijing”); 當然可以直接使用Bundle容器,然后調用?putExtras(Bundle ?extras) 標簽: putExtra
分類目錄: 基礎學習??|? 評論 ? Previous Entries

總結

以上是生活随笔為你收集整理的Movie来播放GIF动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。