android 播放gif动态图片
扫描二维码
随时随地手机看文章
android不推荐使用gif图片,一般都是png的,对于gif的图片解析比较消耗资源,但是对于一些动态gif图片的播放,如果比较小的话还是可以的,要是大的话,建议还是把gif图片转换成一帧一帧的png图片,然后通过animation播放。
对于小的gif动态图片,可以通过Movie来播放,代码如下:
public class TestAvtivity extends Actitvity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new CustomGifView(mContext));
}
class CustomGifView extends View {
public CustomGifView(Context context) {
super(context);
if(g == 1)
{
mMovie = Movie.decodeStream(getResources().openRawResource(
R.drawable.praise1));
}else if(g == 2)
{
mMovie = Movie.decodeStream(getResources().openRawResource(
R.drawable.praise2));
}else
{
mMovie = Movie.decodeStream(getResources().openRawResource(
R.drawable.praise3));
}
}
public void onDraw(Canvas canvas) {
long now = android.os.SystemClock.uptimeMillis();
if (mMovieStart == 0) { // first time
mMovieStart = now;
}
if (mMovie != null) {
int dur = mMovie.duration();
if (dur == 0) {
dur = 1000;
}
int relTime = (int) ((now - mMovieStart) % dur);
mMovie.setTime(relTime);
mMovie.draw(canvas, 0, 0);
invalidate();
}
}
}
}
方法说明:
decodeByteArray(byte[] data, int offset, int length)
decodeFile(String pathName)
decodeStream(InputStream is)
三种不同的静态方法来获取Movie对象。三种方式的原理其实都一样,都是读入字节流来解码创建Movie对象。decodeByteArray是从一个已经存在的字节数组中创建,decodeFile是从一个文件读入字节流来创建。
draw(Canvas canvas, float x, float y)
draw(Canvas canvas, float x, float y, Paint paint)
绘制动画帧。
它们其实还是调用Canvas的drawBitmap来绘制帧的。
duration()
动画持续的时间,也就是完成一次动画播放的时间。
isOpaque()
是不是不透明
setTime(int relativeMilliseconds)
设置相对本次播放第一帧时间,根据这个时间来决定显示第几帧。
例如:
int relTime=(int)((now – moviestart)%movie.duration());
now:系统当前时刻
moviestart:动画开始的时间
movie.duration:动画持续的时间,也就是完成一次动画的时间
注意这是取余操作,这才能算出当前这次重复播放的第一帧的时间
我一开始播放gif的时候,发现出现了很多雪花,画面很不清楚,后来使用apiDemo里面的gif图片发现没有问题,所以断定是gif格式的问题,从网上查发现,把gif图片用Adobe ImageReady打开,然后在每一帧上右击选择恢复为背景,之后就可以了。
如果gif图片过大,建议还是把图片拆分成一张张的png图片然后通过Animation播放,代码如下:
在res目录下新建anim动画文件夹里面创建xml文件game_anim_lalian,写下如下代码
< animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
< item android:duration="150" android:drawable="@drawable/xiu0"
/>
< item android:duration="150" android:drawable="@drawable/xiu1"
/>
< item android:duration="150" android:drawable="@drawable/xiu2"
/>
< item android:duration="150" android:drawable="@drawable/xiu3"
/>
< /animation-list>
java代码:
private AnimationDrawable animDown = new AnimationDrawable();
private ImageView imgGameWord;
imgGameWord = (ImageView) this.findViewById(R.id.imgGameWord);
imgGameWord.setBackgroundResource(R.drawable.game_anim_lalian);
animDown = (AnimationDrawable) imgGameWord.getBackground();
private void startAnim_Lalian()
{
new Thread()
{
@Override
public void run()
{
super.run();
myHandler.post(new Runnable() {
@Override
public void run() {
if(animDown.isRunning())
{
animDown.stop();
}
animDown.start();
animDown.setOneShot(true);//设置是否只播放一遍
}
});
}
}.start();
}
private void stopAnim_Lalian()
{
new Thread()
{
@Override
public void run()
{
super.run();
myHandler.post(new Runnable() {
@Override
public void run() {
animDown.stop();
imgGameWord.clearAnimation();
imgGameWord.destroyDrawingCache();
}
});
}
}.start();}