自制android gif動畫解析器
GifSurfaceView
package com.tz.dream.pa.gifanimation;
import java.io.IOException;
import java.io.InputStream;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Handler;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class GifSurfaceView extends SurfaceView implements Callback {
private SurfaceHolder holder;
// gif圖片路徑
private String path;
private Movie movie;
// 放大倍數
private int zoom = 1;
// 執行動畫
private Handler handler = new Handler();
// 執行緒
private Runnable runnable = new Runnable() {
@Override
public void run() {
// 獲取畫布(加鎖)
Canvas canvas = holder.lockCanvas();
canvas.save();
canvas.scale(zoom, zoom);
// 畫圖片(設定圖片顯示的位置)
movie.draw(canvas, 0, 0);
// 逐幀繪製圖片(圖片數量5)
// 1 2 3 4 5 6 7 8 9 10
// 1 2 3 4 0 1 2 3 4 0
movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
canvas.restore();
// 畫畫完成(解鎖)
holder.unlockCanvasAndPost(canvas);
handler.postDelayed(runnable, 50);
}
};
public void setPath(String path) {
this.path = path;
}
public void setZoom(int zoom) {
this.zoom = zoom;
}
public GifSurfaceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initParam();
}
public GifSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initParam();
}
public GifSurfaceView(Context context) {
super(context);
initParam();
}
/**
* 初始化引數
*/
private void initParam() {
holder = getHolder();
holder.addCallback(this);
// handler = new Handler();
}
/**
* 計算檢視寬高
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 載入gif圖片
// 1、獲取gif圖片路徑
if (!TextUtils.isEmpty(path)) {
try {
// 載入gif圖片
InputStream stream = getContext().getAssets().open(path);
movie = Movie.decodeStream(stream);
// 獲取gif圖片寬高
int width = movie.width();
int height = movie.height();
setMeasuredDimension((int)(width*zoom), (int)(height*zoom));
// 執行gif動畫
handler.post(runnable);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止gif動畫
handler.removeCallbacks(runnable);
}
}
MainActivity
package com.tz.dream.pa.gifanimation;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GifSurfaceView gifSurfaceView = (GifSurfaceView) findViewById(R.id.gsv);
gifSurfaceView.setPath("mn.gif");
}
}
activity_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"
tools:context="${relativePackage}.${activityClass}" >
<com.tz.dream.pa.gifanimation.GifSurfaceView
android:id="@+id/gsv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
資源圖片
整理自教程
相關文章
- Android自定義View播放Gif動畫AndroidView動畫
- 使用gif分幀工具分解gif動畫動畫
- iOS 動畫之Spring動畫、Block動畫、GIF圖iOS動畫SpringBloC
- three.js 自制骨骼動畫(二)JS動畫
- three.js 自制骨骼動畫(一)JS動畫
- GIF動畫製作軟體哪個好動畫
- html最簡單的Gif圖動畫製作方法gif轉base64HTML動畫
- Screen To Gif 2.23 釋出,動畫錄製軟體動畫
- WPF中輕鬆操控GIF動畫:WpfAnimatedGif庫詳解動畫
- Android動畫Android動畫
- android 動畫Android動畫
- 用什麼軟體能把flv影片轉成GIF動畫動畫
- 從零開始擼一個Fresco之gif和Webp動畫Web動畫
- 如何在 Linux 桌面上使用 Gifine 錄製 GIF 動畫?Linux動畫
- Windows 8應用例項解析 - WinRT下建立GIF動畫(Flipflop)Windows動畫
- Android 動畫之屬性動畫Android動畫
- Android 動畫詳解:屬性動畫、View 動畫和幀動畫Android動畫View
- 從視訊提取迴圈播放式GIF動畫的演算法動畫演算法
- 9 個 GIF 動畫闡述 Web 設計的 25 年曆史動畫Web
- 【Android 動畫】動畫詳解之屬性動畫(三)Android動畫
- 【Android 動畫】動畫詳解之補間動畫(一)Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(五)Android動畫
- android動畫——屬性動畫(Property Animation)Android動畫
- android 動畫 ——檢視動畫(View Animation)Android動畫View
- Android屬性動畫:動畫流控制Android動畫
- Android之動畫Android動畫
- Android 動畫初探Android動畫
- Android 動畫原理Android動畫
- 用彩色動畫 GIF 大圖解釋彈性盒工作機制動畫圖解
- Android使用Fresco之下載圖片(包括GIF圖)Android
- Android 動畫實現Android動畫
- Android 轉場動畫Android動畫
- Android 幀動畫使用Android動畫
- Android 補間動畫Android動畫
- android屬性動畫Android動畫
- Android:動畫詳解Android動畫
- Android動畫的理解Android動畫
- Android動畫小結Android動畫