学习了gif播放,在网上看到实例自定义view显示gif,于是复制运行一下,结果发现自己的gif图片在第一帧地方就停住了,没有动画效果,尝试着改了一下代码发现真的改好了,虽然不知道为什么,还是很欣喜的记录下,等以后再翻出来看看。
代码复制网址https://www.cnblogs.com/android-blogs/p/5160433.html
代码如下:
步骤1:看一下这个工具类的实例代码:MyGifView.java
import android.content.Context; import android.graphics.Canvas; import android.graphics.Movie; import android.util.AttributeSet; import android.view.View;
public class MyGifView extends View{ private long movieStart; private Movie movie; //此处必须重写该构造方法
此工具类中,只做了2件事情。1,构造方法;2,重写了onDraw()方法。大家以后用的话,只需拷贝此类到你的工程下即可起作用。
步骤2:布局文件代码 activity_main.xml
布局文件中,注意的是:标签的设置 <com.example.showgifimage.MyGifView/>. 格式:包名+.类名
步骤3:主activity中调用
就这么轻松的把Gif图片显示了~~ |
改动代码如下,黑色加粗部分是改动的重点:
package com.example.tools;
import com.example.stocktrading.R;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class MyGifView extends View {
private long movieStart;
private Movie movie;
// 此处必须重写该构造方法
public MyGifView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
// 以文件流(InputStream)读取进gif图片资源
movie = Movie.decodeStream(getResources().openRawResource(
R.drawable.cat));
}
@Override
protected void onDraw(Canvas canvas) {
long curTime = android.os.SystemClock.uptimeMillis();// 从开机到现在的毫秒书(手机睡眠的时间不包括在内)
// 第一次播放
if (movieStart == 0) {
movieStart = curTime;
Log.i("TAG", "wwwww"+movieStart);
}
if (movie != null) {
int time=0;
int n=0;
int duraction = movie.duration();//获得影片完全播放的时间,以秒为单位。
Log.i("TAG", duraction+"yyyyy");
int relTime = (int) ((curTime - movieStart) % duraction);
int m=(relTime-time)/10;
for(int j=0;j<10;j++){
n=time+m*j;
movie.setTime(n); //这句话保证当前播放的都是对应当前时间的画面。
Log.i("TAG", n+"xxyyx");
movie.draw(canvas, 0, 0);
// 强制重绘,为什么这个重绘一定要放在for循环中才重绘 啊,之前没有都只画一遍就不画了
}
// for(int i=0;i<3;i++){
// movie.setTime(relTime);
// Log.i("TAG", relTime+"xxyyx");
// movie.draw(canvas, 0, 0);
// }
// 为什么这个就显示gif不动呢,是因为relTime的数据太少了吗,只有十几个数据,我在上面的for循环中插入了十个点,一共是一百多个数据,是这个原因吗,不是因为没有重画的原因吗
time=relTime;
}
invalidate();
//这里是绘制此gif的某一帧,并刷新本身,从而又调起了onDraw方法,如此动画的效果就达到了。
super.onDraw(canvas);
}
}
以上就是问题解决的一个方案,虽然还云里雾里,哈哈菜鸟一枚,发表再次希望大神看到可以指点一二。