SurfaceView高性能绘制(三)代码实践篇-根据触屏绘制图片

一、前言

此篇文章实际上是在上篇文章SurfaceView高性能绘制(二)代码实践篇-图片绘制上,进行了一些添加更改,为了方便说明查阅单独写成一篇博文

二、修改说明

1、在自定义的MySurfaceView类里面,添加触屏事件

    //7、添加触摸事件,创建DrawingItem对象
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //监听down事件
        if(event.getAction() == MotionEvent.ACTION_DOWN){

            Log.v("SurfaceView@@@","点击屏幕后:"+drawingThread);
            //添加图片对象
            drawingThread.addItem(event.getX(),event.getY());

        }
        return super.onTouchEvent(event);
    }

2、在绘制线程DrawingThread类里面的修改

(1)添加方法addItem,发送消息绘制

   public void addItem(float x ,float y){
        //obtain(Handler h, int what, int arg1, int arg2)
        Message message = Message.obtain(revelver, MSG_ADD, (int)x, (int)y);
        this.revelver.sendMessage(message);
    }

(2)handleMessage收到消息绘制,修改如下

                lockCanvas.drawColor(Color.BLACK);//清空画布。这里设置画布为黑色
                
//                lockCanvas.drawBitmap(iconBitmap, 0, 0, paint);
                lockCanvas.drawBitmap(iconBitmap, msg.arg1, msg.arg2, paint);

                this.drawingHolder.unlockCanvasAndPost(lockCanvas);//解锁画布

意思把所绘制图片的坐标给传递过来了,通过Handler + Message 发送出去,然后回调得到坐标,进行图片绘制。

三、效果图、源码

(1)效果图

根据触屏绘制图片我们就这样实现了。那么如果我们要把每次绘制的图片都保持住在界面上呢,该怎么实现?

下一篇文章将讲到:SurfaceView高性能绘制(四)代码实践篇-绘制多张图片

(2)源码

https://download.csdn.net/download/yudbl/10968261

 

不得不吐槽一下,csdn有时候有点坑啊

1、几个月前写的博文图片,今天来看不见了。

为了安全:重要的博文备份吧,在多个热门平台写写吧,如:简书、知乎

2、现在不知道怎么搞得?csdn上传资源默认需要5分,选不了分数了

3、我用mac默认浏览器safari突然这几天登录不了,换成google才可以

4、很多时候要写博文,出现编辑器打开了,但是写不了文字

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SurfaceView 是一个强大的 Android 组件,它允许我们在一个单独的线程中执行图形渲染,从而提高应用程序的性能。SurfaceView 组件的绘制过程需要分为两个部分,一部分是在主线程中进行,另一部分是在后台线程中进行。 以下是绘制 SurfaceView 的基本步骤: 1. 创建 SurfaceHolder 对象,通过 SurfaceView.getHolder() 方法获取。 2. 实现 SurfaceHolder.Callback 接口,在 surfaceCreated() 方法中获取 Canvas 对象,进行绘制。 3. 在 surfaceChanged() 方法中更新 SurfaceView 的尺寸。 4. 在 surfaceDestroyed() 方法中停止绘制线程。 在绘制 SurfaceView 的过程中,最重要的一步是在 surfaceCreated() 方法中获取 Canvas 对象进行绘制。这里有两种方式可以获取 Canvas 对象:lockCanvas() 和 lockHardwareCanvas()。一般情况下,建议使用 lockCanvas() 方法获取 Canvas 对象,因为它可以保证在 SurfaceView 完全可见之前不会执行绘制操作。 以下是一个简单的 SurfaceView 绘制示例代码: ``` public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Paint mPaint; public MySurfaceView(Context context) { super(context); init(); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mHolder = getHolder(); mHolder.addCallback(this); mPaint = new Paint(); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.FILL); } @Override public void surfaceCreated(SurfaceHolder holder) { Canvas canvas = mHolder.lockCanvas(); canvas.drawColor(Color.WHITE); canvas.drawCircle(getWidth() / 2, getHeight() / 2, 100, mPaint); mHolder.unlockCanvasAndPost(canvas); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } ``` 在上面的示例代码中,我们通过实现 SurfaceHolder.Callback 接口,重写 surfaceCreated() 方法来绘制一个红色圆形。注意,在绘制完成后,需要调用 mHolder.unlockCanvasAndPost(canvas) 方法来提交绘制结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

被开发耽误的大厨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值