Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...
生活随笔
收集整理的這篇文章主要介紹了
Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android高級控件(二)——SurfaceView實現GIF動畫架包,播放GIF動畫,自己實現功能的初體現
寫這個的原因呢,也是因為項目中用到了gif動畫,雖然網上有很多的架包可以實現,不過我們還是要追究一下原理怎么做的,我們新建一個GifLibrary,然后右鍵Properties——Android,我們把架包勾上
然后我們新建一個類GifSurfaceView繼承自SurfaceView并且實現它的Callback接口
GifSurfaceView
package com.lgl.giflibrary;import java.io.IOException; import java.io.InputStream; import java.net.URL;import android.content.Context; import android.graphics.Canvas; import android.graphics.Movie; import android.os.Handler; import android.util.AttributeSet; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView;/*** 自定義Gif動畫引擎 SurfaceView的實現主要是實現高速預覽 我們將GIF圖片繪制在SurfaceView上* * @author LGL**/ public class GifSurfaceView extends SurfaceView implements Callback {// 監聽private SurfaceHolder holder;// 影片類private Movie movie;// 輸入流private InputStream is = null;// 縮放private float zoom = 1f;// 圖片路徑private String path;// 判斷是否網絡讀取private boolean isNet = false;// 逐步播放private Handler handler = new Handler();private Runnable run = new Runnable() {@Overridepublic void run() {// 不斷繪制Canvas canvas = holder.lockCanvas();// 繪制的時候進行縮放比例,不影響下次繪圖操作canvas.save();canvas.scale(zoom, zoom);movie.draw(canvas, 0, 0);canvas.restore();holder.unlockCanvasAndPost(canvas);// 開始繪制movie.setTime((int) (System.currentTimeMillis() % movie.duration()));handler.removeCallbacks(run);// 下次還用這個線程handler.postDelayed(run, 30);}};// 構造方法public GifSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);holder = getHolder();holder.addCallback(this);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {try {// 判斷讀取方法if (isNet) {is = new URL(path).openConnection().getInputStream();} else {// 本地讀取文件is = getContext().getAssets().open(path);}// 讀取流movie = Movie.decodeStream(is);// 設置SurfaceView的寬高int width = movie.width();int height = movie.height();setMeasuredDimension((int) (width * zoom), (int) (height * zoom));// 播放gif的幀動畫handler.post(run);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}// 初始化完成@Overridepublic void surfaceCreated(SurfaceHolder holder) {// 讀取影片流}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {// SurfaceView被銷毀時結束線程handler.removeCallbacks(run);}public void setZoom(float zoom) {this.zoom = zoom;}public void setPath(String path) {this.path = path;}public void setNet(boolean isNet) {this.isNet = isNet;}}layout_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#fff"android:gravity="center" ><com.lgl.giflibrary.GifSurfaceViewandroid:layout_width="wrap_content"android:layout_height="wrap_content" /></RelativeLayout>這里不難看出,我們判斷了兩種方法,從網絡加載還是本地加載,并且縮放比例是多少,那我們就來使用一下,我們直接新建一個項目GifDemo,同樣的右鍵Properties——Android,然后add一個庫
layout_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><com.lgl.giflibrary.GifSurfaceViewandroid:id="@+id/gsv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true" /></RelativeLayout>然后我們就來在MainActivity中使用
//初始化 private GifSurfaceView gsv;gsv = (GifSurfaceView) findViewById(R.id.gsv); // 設置路徑,這個路徑實際上在library中是課更改的,我們在assets目錄下放置一張gif圖片 gsv.setPath("phont.gif"); // 設置縮放大小 gsv.setZoom(2f);我們來運行一下
當然,如果是網上下載的,這個時候也我們可以用我們之前搭建的tomcat服務器測試一下
gsv = (GifSurfaceView) findViewById(R.id.gsv);// 設置路徑// gsv.setPath("photo.gif");// 設置縮放大小Fgsv.setZoom(2f);// 如果是網絡,記得添加權限gsv.setNet(true);gsv.setPath("http://localhost:8080/lgl/photo.gif");截圖都是一樣的,好的,這個博客只是說我們先腦子里又這么一個概念,讓我們更容易接受以后我們天馬行空的想法的基礎,這個libray要是真的放到項目中去還是有點欠缺火候,很多地方都不完善,只是作為一個演示的作用,Demo就不提供了,就這么一點點,當然你要是想要也可以評論一下
總結
以上是生活随笔為你收集整理的Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《python核心编程》读书笔记--第1
- 下一篇: [Dubbo实战]dubbo + zoo