• Android 实现在ImageView上绘图


    参考博客:https://www.cnblogs.com/hao-dotnet/p/3269149.html
    代码很简单,参考博客中有些错误已改正。

    step1:新建ViewPoint类

    该类用于存放点坐标,就是手指接触ImageView并移动时的坐标

    package com.example.handwritingimageview;
    
    public class ViewPoint {
        float x;
        float y;
    }
    
    

    step2:新建Line类

    顾名思义,该类存放点的集合,即一条线

    //表示一条线
    public class Line {
        ArrayList<ViewPoint> points = new ArrayList<>();
    }
    

    step3:编写HandWritingImageView类

    该类继承AppCompatImageView,先重写父类构造器,再重写onTouchEvent和onDraw方法,在onTouchEvent方法中多次使用了 invalidate()这个方法,这个方法是用来触发onDraw方方法进行画图。

    package com.example.handwritingimageview;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.widget.ImageView;
    
    
    import androidx.appcompat.widget.AppCompatImageView;
    import androidx.core.widget.ImageViewCompat;
    
    import java.util.ArrayList;
    
    
    public class HandWritingImageView extends AppCompatImageView {
        private Paint paint = new Paint();
    
        //当前正在画的线
        private Line current = new Line();
    
        public HandWritingImageView(Context context) {
            super(context);
        }
    
        public HandWritingImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public HandWritingImageView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        //画过的所有线
        private ArrayList<Line> lines = new ArrayList<Line>();
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            //获取坐标
            float clickX = event.getX();
            float clickY = event.getY();
    
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                //刷新屏幕
                invalidate();
                return true;
            }else if (event.getAction() == MotionEvent.ACTION_MOVE){
                ViewPoint point = new ViewPoint();
                point.x = clickX;
                point.y = clickY;
                Log.d("444", "clickX: "+clickX);
                Log.d("444", "clickY: "+clickY);
                //在移动时添加所有经过的点
                current.points.add(point);
                Log.d("222", "current.points.size(): "+current.points.size());
    
                invalidate();
                return true;
            }else if (event.getAction() == MotionEvent.ACTION_UP){
                //添加画过的线
                lines.add(current);
                Log.d("222", "lines.size(): "+lines.size());
                current = new Line();
                invalidate();
            }
            return super.onTouchEvent(event);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //画出之前所有的线
            for (int i = 0; i < lines.size(); i++)
            {
                drawLine(canvas, lines.get(i));
            }
    
            //画出当前的线
            drawLine(canvas, current);
        }
    
        private void drawLine(Canvas canvas, Line line)
        {
            for(int i = 0; i < line.points.size()-1; i++){
                float x = line.points.get(i).x;
                float y = line.points.get(i).y;
                float nextX = line.points.get(i+1).x;
                float nextY = line.points.get(i+1).y;
                canvas.drawLine(x,y,nextX,nextY,paint);
            }
        }
    }
    

    step4:编写xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <com.example.handwritingimageview.HandWritingImageView
            android:id="@+id/im_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
    

    效果图

    在这里插入图片描述

  • 相关阅读:
    第三节:模板模式——在Spring框架应用
    第二节:模板模式——模板模式应用
    idea ---- intelij IDEA安装
    计算机基础 ---- 编码(er)
    preg_match一些问题
    php 两个值进行比较的问题
    php中in_array一些问题
    配置完php.ini中的扩展库后,重启apache出现错误1067
    基于Intel 174;E810 的OVS-DPDK VXLAN TUNNEL性能优化
    tc filter 工作模式:传统模式和 direct-action 模式
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860122.html
Copyright © 2020-2023  润新知