Android 支援Gif動態圖 的imagview,androidimagview
Android 實現支援gif的 組件,並可以控制帶下,位置。索羅的一下網上的方法,簡單的實現了下。
方法1、使用Movie解析gif 流
也是本文使用的方法。 有很多部落格介紹是想方法的,過程不難。 有幾個問題需要考慮:1如何控制新組件大小;2如何控制 gif 動圖大小;3如何控制gif在組件中的位置。
本文會一一介紹方法 這裡先貼出源碼:https://github.com/HandsomeL/android_gif_imageview
方法2、解析gif得到位元影像
使用單獨的線程管理切換,這種方法也實現過,感覺對於記憶體消耗還是比較大的,播放起來沒有想象中的那麼流暢。
一、首先,GifImageView 繼承自 ImageView,相容ImageView的所有方法及屬性。
使用Movie 讀取gif 的InputStream,在Ondraw() 裡面判斷是靜態圖片還是動態圖,調用不同的繪畫方。
如果是靜態圖,丟給super,否則調用動圖繪製方法 playMovie(canvas);
本文添加了控制機制,選中時才播放,非選中狀態顯示第一張。
代碼:
protected void onDraw(Canvas canvas) {if (mMovie == null) {// src is classical imageView;super.onDraw(canvas);} else {int saveCount = canvas.getSaveCount();if (mDrawMatrix != null && !mDrawMatrix.isIdentity()) {canvas.concat(mDrawMatrix);}if (isSelected()) {playMovie(canvas);invalidate();} else {mMovie.setTime(0);mMovie.draw(canvas, 0, 0);}canvas.restoreToCount(saveCount);}}
playMovie(canvas); 方法代碼:
注釋放在代碼裡:
private boolean playMovie(Canvas canvas) {long now = SystemClock.uptimeMillis();// 擷取相對好時間if (mStartTime == 0) {mStartTime = now;}int duration = mMovie.duration();if (duration == 0) {duration = 1000;}int relTime = (int) ((now - mStartTime) % duration);//計算相對於開始播放的時間,用來確定需要繪製的圖片位置mMovie.setTime(relTime);//設定相對位置mMovie.draw(canvas, 0, 0);// 繪製if ((now - mStartTime) >= duration) {//完成一次播放,返回true,程式使用,請忽略mStartTime = 0;return true;}return false;}
二、gif 大小與 位置
本文使用矩陣經行相關處理。代碼叫簡單,基本都能看懂。
不熟悉矩陣運算的請猛戳這裡:http://www.apkbus.com/forum.php?mod=viewthread&tid=58458
private void calculateMatrix(){if (mMovie == null) {return;}int movieWidth = mMovie.width();// 實際像素寬高int movieHeight = mMovie.height();int vWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();int vHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();mDrawMatrix = new Matrix();float scale;scale = Math.min((float) vWidth / (float) movieWidth, (float) vHeight / (float) movieHeight);float dx = (int) ((vWidth - movieWidth * scale) * 0.5f + 0.5f);float dy = (int) ((vHeight - movieHeight * scale) * 0.5f + 0.5f);mDrawMatrix.setScale(scale, scale); // 設定縮放mDrawMatrix.postTranslate(dx, dy); // 設定平移}
自己的程式沒有使用自訂屬性,直接通過setGif 設定進去的。如果需要可以參考源碼裡面的實現方式。
表達有不精指出還望指出~