请问在handleMessage里能不能使用Canvas画图

本文探讨了使用Handler接收消息并在Android环境中根据不同消息类型绘制图形的方法。重点介绍了如何通过Canvas和Paint对象来实现画线和画圆的功能。

设计想法:在接收到主机发来的数据后,交给handler,handler根据消息不同画图。但是貌似根本画不出来,不知道哪位知道原因?
private Handler myHandler = new Handler()
        {
                // 2.重写消息处理函数
                public void handleMessage(Message msg)
                {
                        switch (msg.what)
                        {
                                // 判断发送的消息
                                case 1://画线
                                {
                                        Canvas canvas = new Canvas();
                                        canvas.drawColor(Color.WHITE);
                                        
                                        Paint paint = new Paint();
                                        paint.setColor(Color.BLUE);

                                        canvas.drawLine(300, 400, 200, 200, paint);
                                        break;
                                }
                                case 2://画圆
                                {
                                        Canvas canvas = new Canvas();
                                        canvas.drawColor(Color.WHITE);
                                        
                                        Paint paint = new Paint();
                                        paint.setColor(Color.BLUE);

                                        canvas.drawCircle(50, 100, 50, mPaint);
                                        break;
                                }

                        }
                        super.handleMessage(msg);
                }
        };
public class TelescopeView extends View { // 放大镜的半径 private static final int RADIUS = 80; // 放大倍数 private static final int FACTOR = 3; private final Matrix matrix = new Matrix(); private Bitmap bitmap; private ShapeDrawable shapeDrawable; public TelescopeView(Context context) { super(context); init(); } public TelescopeView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public TelescopeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { setLayerType(LAYER_TYPE_SOFTWARE, null); } private Handler handler = new Handler(Looper.getMainLooper()); private Runnable hideRunnable = new Runnable() { @Override public void run() { if (shapeDrawable != null) { shapeDrawable.setBounds(0, 0, 0, 0); // 隐藏放大镜 invalidate(); } } }; @Override protected void onDraw(@NonNull Canvas canvas) { super.onDraw(canvas); if (bitmap == null) { // 从资源中加载一张图片,并生成新的Bitmap Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.telescope_test_img); bitmap = Bitmap.createScaledBitmap(bmp, getWidth(), getHeight(), true); // 创建一个圆形的ShapeDrawable,并使用一个经过缩放的位图作为其填充着色器(BitmapShader) BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(bitmap, getWidth() * FACTOR, bitmap.getHeight() * FACTOR, true), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); shapeDrawable = new ShapeDrawable(new OvalShape()); shapeDrawable.getPaint().setShader(shader); shapeDrawable.setBounds(0, 0, RADIUS * 2, RADIUS *2 ); } // 绘制原始图片 canvas.drawBitmap(bitmap, 0, 0, null); // 绘制放大后的图片 shapeDrawable.draw(canvas); } @Override public boolean onTouchEvent(MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: // 移除之前可能存在的延迟任务,防止重复执行 handler.removeCallbacks(hideRunnable); // 控制 Shader(如 BitmapShader)在 ShapeDrawable 上的绘制位置的 // 放大镜核心原理 // 画图区域:以手指的位置(X,Y)为圆心画半径为RADIUS的圆; // (X,Y) -> (3X,3Y) 偏移半径的长度 matrix.setTranslate(RADIUS - x * FACTOR, RADIUS - y * FACTOR); shapeDrawable.getPaint().getShader().setLocalMatrix(matrix); // 绘制区域 shapeDrawable.setBounds(x - RADIUS, y - RADIUS, x + RADIUS , y + RADIUS); break; case MotionEvent.ACTION_UP: // 延迟 3 秒后隐藏放大镜 handler.postDelayed(hideRunnable, 3000); break; } invalidate(); return true; } } 分析代码的问题
最新发布
09-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值