Android SurfaceView动画(二)

效果图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

慢慢的绘制出来,从左往右一帧一帧的绘制而成

新建一个 class,SurfaceViewAnim.java:

public class SurfaceViewAnim extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    private SurfaceHolder mHolder;  //  声明SurfaceHolder
    private Canvas mCanvas;
    private boolean isDrawing;  //控制绘图线程
    private Paint paint;        //  画笔对象
    private Bitmap snail;   //  实现动画的图片对象
    private int snail_X;        //  动画元素的起始X坐标

    public SurfaceViewAnim(Context context) {
        super(context);
        snail = BitmapFactory.decodeResource(getResources(),R.drawable.ic_one);

        //  为了得到屏幕的宽度
        DisplayMetrics dm2 = getResources().getDisplayMetrics();
        int width = dm2.widthPixels;

        snail_X = width;    //  起始 X 坐标赋值为当前屏幕宽度值,即屏幕最右边
        paint = new Paint();
        mHolder = this.getHolder(); //  获取SurfaceHolder 对象
        mHolder.addCallback(this);  //  添加 Callback 接口
        
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        isDrawing = true;
        new Thread(this).start();   //  启动绘图的线程
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        isDrawing = false;  //  终止绘图线程
    }

    public void run(){
        while (isDrawing){
            snail_X--;      //  绘图元素属性修改,此处为修改其 X 坐标
            if (snail_X <= 0){  //  到达最左边后,不再移动
                snail_X = 0;
            }
            mydraw();       //  绘图
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private void mydraw() {
        try {
            mCanvas = mHolder.lockCanvas();     // 锁定面板,开始绘图
            paint.setColor(Color.WHITE);
            mCanvas.drawRect(0,0,getWidth(),getHeight(),paint); //  绘制背景
            mCanvas.drawBitmap(snail,snail_X,100,paint);    //  绘图
        }catch (Exception e){

        }
        finally {
           if ( mCanvas != null){
               mHolder.unlockCanvasAndPost(mCanvas);    //  解锁花瓣,推送到界面
           }
        }
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    SurfaceViewAnim anim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        anim = new SurfaceViewAnim(this);
        setContentView(anim);   //  设置 anim 为显示视图
    }
}

activity_main.xml,不变

点击运行即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王睿丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值