Android用自定义view实现帧动画

此篇文章简单讲解下如何用自定义view将一张bitmap绘制在屏幕上
  • 将一张bitmap显示可以用ImageView的setImageBitmap(bm);这里我们为了熟悉自定义view的用法和绘制工具,以绘制bitmap为例子。

(绘制UI需了解下三个绘图工具类Paint,Canvas,Path)
1.我们创建一个Mview类继承自View

public class Mview extends View {
    private Paint mpaint;    //定义一个画笔
    private Canvas mCanvas;    //定义一个画布
    private Bitmap mBitmap;      //定义一个Bitmap
    //重写构造方法
    public Mview(Context context) {
        super(context);
        init();
    }


    public Mview(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    //进行初始化操作
    private void init()
    {
        mpaint=new Paint();
        mBitmap= BitmapFactory.decodeFile("/storage/emulated/0/1.webp");//得到bitmap
    }
    
   //UI绘制代码在onDraw里
    @Override
    protected void onDraw(Canvas canvas) {
       canvas.drawBitmap(mBitmap,0,0,mpaint);//调用Canvas类的drawBitmap()即可绘制bitmap。

    }
}

2.在layout中即可加入自定义的View

  • 在Activity中使用此View的方法就和使用Button,ImageView控件一样。


    

3.如果我们要不断刷新UI怎么办?

  • 我们可以调用View的invalidate() ,postInvalidate() 方法,每调用一次便会执行一次onDraw()方法,以此实现UI刷新。

  • postInvalidate(); 与invalidate()方法区别就是,postInvalidate()方法可以在UI线程执行,也可以在工作线程执行
    而invalidate()只能在UI线程操作。但是从重绘速率讲:invalidate()效率高。

我们用具体实例体验下用自定义view进行UI刷新
  • 我们用7张爆炸图片来实践,在屏幕上显示爆炸的动态效果(即不断循环显示1-7的图片,速度足够快时就是连续的画面)
demo.JPG
  • 我们在前面的Mview类中加入setmBitmap()方法以改变bitmap
public void setmBitmap(Bitmap get_bitmap)
    {
        this.mBitmap=get_bitmap;
    }
  • 在Activity中我们新开一个线程用来刷新UI
new Thread(new Runnable() {
                    @Override
                    public void run() {
              //我们用一个循环不断更新bitmap并进行重绘
              //不断改变i从1到7
                        for(int i=1;i<8;i++)
                        {
                         // 每次获取对应i名字的图片并赋给bitmap
                            new_bitmap= BitmapFactory.decodeFile("/storage/emulated/0/"+i+".png");
                        //调用Mview中setmBitmap设置新得到的bitmap
                            mview.setmBitmap(new_bitmap);
                        //重绘为当前bitmap
                            mview.postInvalidate();
      
                            if(i==7)
                                i=0;
                        }
                    }
                }).start();

启动app我们便可在手机上看到连续的爆炸画面,实现了UI刷新

你可能感兴趣的:(Android用自定义view实现帧动画)