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();}