IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> PathView手绘路径自定义控件 -> 正文阅读

[移动开发]PathView手绘路径自定义控件

前言

代码很简单,看看就懂

源代码

 /**
 * 文件名:PathView
 * 描  述:
 * 作  者: 
 * 时  间:2022/3/14 14:10
 */

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;

public class PathView extends View {

    //----绘制轨迹----
    private float mX;
    private float mY;
    private final Paint mGesturePaint = new Paint();
    private final Path mPath = new Path();
    private final ArrayList<Point> mPathPoints = new ArrayList<Point>();
    Region re = new Region();

    private int Black;
    private int White;
    private final int Strokewidth;
    private final int LineWidth;
    private boolean mTouchPath;

    public PathView(Context context, AttributeSet attrs) {
        super(context, attrs);

        Black = ContextCompat.getColor(context, android.R.color.black);
        White = ContextCompat.getColor(context, android.R.color.white);
        Strokewidth = dp2px(3.0f);
        LineWidth = dp2px(1f);

        mGesturePaint.setColor(White);
        mGesturePaint.setShadowLayer(LineWidth, LineWidth, LineWidth, Black);
        mGesturePaint.setStyle(Paint.Style.STROKE);
        mGesturePaint.setStrokeWidth(Strokewidth);
    }

    public PathView(Context context) {
        this(context, null);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (mTouchPath) {
            canvas.drawPath(mPath, mGesturePaint);
        }
    }

    private int dp2px(float dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                getResources().getDisplayMetrics());
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                touchDown(event);
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(event);
                break;
            case MotionEvent.ACTION_UP:
                mPath.close();
                touchDone(event);
                break;
        }
        //更新绘制
        invalidate();
        return mTouchPath && true;
    }

    private void touchDone(MotionEvent event) {
        //------关键部分 判断点是否在 一个闭合的path内--------//
        //构造一个区域对象,左闭右开的。
        RectF r = new RectF();
        //计算控制点的边界
        mPath.computeBounds(r, true);
        //设置区域路径和剪辑描述的区域
        re.setPath(mPath, new Region((int) r.left, (int) r.top, (int) r.right, (int) r.bottom));
        //在封闭的path内返回true 不在返回false

        Rect bounds = new Rect();
        re.getBounds(bounds);

        PathMeasure pathMeasure = new PathMeasure(mPath, false);
        int length = (int) (pathMeasure.getLength() / 10);
        Log.e("", "--length----" + length);
        if (length > 10 && !mPathPoints.isEmpty()) {
            Point[] points = mPathPoints.toArray(new Point[0]);
            mTouchPathListener.finish(bounds, points);
        }
        mPath.reset();
        invalidate();

        Log.e("", "--判断点是否则范围内----" + re.contains((int) event.getX(), (int) event.getY()));
    }

    //---------------下边是划线部分----------------------------//
    //手指点下屏幕时调用
    private void touchDown(MotionEvent event) {
        //重置绘制路线,即隐藏之前绘制的轨迹
        mPathPoints.clear();
        mPath.reset();
        float x = event.getX();
        float y = event.getY();
        mX = x;
        mY = y;
        mPath.moveTo(x, y);
        mPathPoints.add(new Point((int)mX, (int)mY));
    }

    //手指在屏幕上滑动时调用
    private void touchMove(MotionEvent event) {
        final float x = event.getX();
        final float y = event.getY();
        final float previousX = mX;
        final float previousY = mY;
        final float dx = Math.abs(x - previousX);
        final float dy = Math.abs(y - previousY);
        //两点之间的距离大于等于3时,连接连接两点形成直线
        if (dx >= 3 || dy >= 3) {
            //两点连成直线
            mPath.lineTo(x, y);
            //第二次执行时,第一次结束调用的坐标值将作为第二次调用的初始坐标值
            mX = x;
            mY = y;

            mPathPoints.add(new Point((int)mX, (int)mY));
        }
    }

    public interface TouchPathListener {
        void finish(Rect bounds, Point[] points);
    }

    private TouchPathListener mTouchPathListener;

    public void setTouchPath(boolean touchPath, TouchPathListener touchPathListener) {
        mTouchPath = touchPath;
        mTouchPathListener = touchPathListener;
    }

    public boolean ismTouchPath() {
        return mTouchPath;
    }
}

使用

pathTouchView.setTouchPath(!pathTouchView.ismTouchPath(), new PathView.TouchPathListener() {
      @Override
      public void finish(Rect bounds, Point[] srcPoints) {
      
          pathTouchView.setTouchPath(false, null);
      }
  });
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:12:54  更:2022-04-15 00:13:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 21:59:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码