Android 支援Gif動態圖 的imagview,androidimagview

來源:互聯網
上載者:User

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 設定進去的。如果需要可以參考源碼裡面的實現方式。


表達有不精指出還望指出~



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.