美文网首页
Android用自定义view实现帧动画

Android用自定义view实现帧动画

作者: NullUser | 来源:发表于2017-10-25 18:20 被阅读0次
    此篇文章简单讲解下如何用自定义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控件一样。
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.you.viewdemo1.MainActivity">
    
        <com.example.you.viewdemo1.Mview
            android:id="@+id/mView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

    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实现帧动画

          本文链接:https://www.haomeiwen.com/subject/tpfcpxtx.html