大家好,从今天开始就要跟大家学习属性动画下了,这些课程比较难,大家做好准备哦!本次我们是用SurfaceView加载gif动画!
首先大家准备好一张gif动画,把他加载到assets文件夹里!注意是asset文件夹,不是drawable文件夹!我在这里使用了一张美女的照片!嘿嘿新建一个类继承SurfaceView
package com.example.shuxingdonghua;
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.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
public class ZhangxinGifSurfaceView extends SurfaceView implements Callback {
private SurfaceHolder holder;//起缓冲作用,提供缓存的地方
//资源路径
private String path;
//使用hangler循环执行
private Handler handler=new Handler();
private Runnable runnable=new Runnable(){
@Override
public void run() {
// 第一步,拿到画布,因为gif动画是由很多帧组成的,画布加锁。
Canvas canvas=holder.lockCanvas();
//第二部:加完锁开始画图片
movie.draw(canvas, 0, 0);
//第三部:逐帧绘制图片
//假设我的gif图片有五张,当前时间(毫秒)运行到
//1,2,3,4,5,6,7,8,9,10……秒。除以5的余数为:
//1,2,3,4,0,1,2,3,4,0
//表示切换到哪一张图片,设置当前时间显示哪一张图片。
int time=(int) (System.currentTimeMillis()%movie.duration());
System.out.println("duration:"+movie.duration()+";time:"+time);
movie.setTime(time);
//解锁
holder.unlockCanvasAndPost(canvas);
handler.postDelayed(runnable, 50);
}
};
private Movie movie; public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public ZhangxinGifSurfaceView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
initparams();
}
public ZhangxinGifSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
initparams();
}
public ZhangxinGifSurfaceView(Context context) {
super(context);
initparams();
}
private void initparams() {
holder = getHolder();
holder.addCallback(this);
}
//android中的高级控件都有生命周期
//surfaceView创建的时候把gif图片加载进来
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
InputStream open=getContext().getAssets().open(path);
movie = Movie.decodeStream(open);
//运行gif图片
handler.post(runnable);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
}
Activity类
package com.example.shuxingdonghua;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
/**gif 动画引擎
* 一:在java中,gif是一次性的加入内存,如果gif图片过多过大,会导致内存溢出。可以使用c语言动态读取。
——NDK开发在以后我会给大家详细讲解的
二:今天我们讲解的内容就是把GIF里面一帧的画面解析出来,然后绘制在canvas上。
三:gif动画实现步骤:
* 第一步:自定义一个类继承SurfaceView
* 第二步:准备一些资源
* 第三步:使用SurfaceHolder,
* 第四步:加载gif动画图片
* 第五步:执行gif动画
* 使用Handler+Runnable实现gif动画。
*
*
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ZhangxinGifSurfaceView surfaceView= (ZhangxinGifSurfaceView) findViewById(R.id.gsv);
surfaceView.setPath("mn.gif");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
布局文件
<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=".MainActivity" >
<com.example.shuxingdonghua.ZhangxinGifSurfaceView
android:id="@+id/gsv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>