先上效果图:

思路:

1. 定义四个点, 初始化四个点的坐标,绘制点。

2. 绘制 直线,把四个点连接起来。

3. 根据四个点的坐标绘制直线路径,填充颜色。

4. 判断手势是否点中四个点的坐标范围内。

5. 手势移动时重绘当前 View 。

代码:

自定义 View ,定义四个点:

public class DotView extends View {//定义四个点的坐标private float dot1_x;private float dot1_y;private float dot2_x;private float dot2_y;private float dot3_x;private float dot3_y;private float dot4_x;private float dot4_y;//触摸事件的坐标private float event_x;private float event_y;//四点坐标的数组private float[] pts;//控件的宽和高private float v_width;private float v_height;//手势选中的点 标记private int select_index=0;

初始化四个点的默认坐标:

 @Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);//初始化四个点的默认坐标v_width = this.getWidth(); //获取当前View的宽v_height = this.getHeight(); //获取当前View的高dot1_x=v_width/2-250;  //点1 x轴坐标dot1_y=v_height/2+250; //点1 y轴坐标dot2_x=dot1_x+300;dot2_y=dot1_y;dot3_x=dot1_x;dot3_y=dot1_y+300;dot4_x=dot2_x;dot4_y=dot2_y+300;//封装坐标点数组pts=new float[]{dot1_x,dot1_y,dot2_x,dot2_y,dot3_x,dot3_y,dot4_x,dot4_y};}

绘制点、线、路径:

@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);Paint paint = new Paint();paint.setColor(getResources().getColor(R.color.red)); //画笔颜色 (点)paint.setStrokeWidth(5f);                             //画笔宽度 (点的大小)canvas.drawPoints(pts, paint);                        //画出四个点paint.setStrokeWidth(1f);                             //画笔宽度 (线的粗细)canvas.drawLines(new float[]{dot1_x,dot1_y,dot2_x,dot2_y,dot2_x,dot2_y,dot4_x,dot4_y,dot4_x,dot4_y,dot3_x,dot3_y,dot3_x,dot3_y,dot1_x,dot1_y},paint);          //画出四条线 (连接四个点)Path path=new Path();                                 //初始化路径(用于填充颜色)path.moveTo(dot1_x,dot1_y);                           //路径移动到第一个点(从点 1 开始)path.lineTo(dot2_x,dot2_y);                           //路径直线到第二个点path.lineTo(dot4_x,dot4_y);                           //路径直线到第四个点path.lineTo(dot3_x,dot3_y);                           //路径直线到第三个点path.lineTo(dot1_x,dot1_y);                           //路径直线到第一个点(闭合形成四边形)paint.setColor(getResources().getColor(R.color.transparent_gray));  //画笔颜色 (填充)canvas.drawPath(path,paint);                          //根据路径画出图形}

判断是否点中四个点的坐标范围:

private boolean isRangeOfView(float dx,float dy,float ev_x,float ev_y) {//dx:点的x轴  dy:点的y轴  ev_x:手势触摸到的x轴  ev_y:手势触摸到的y轴// 点的 x,y 轴 上下左右各增加40像素,扩大触摸范围,判断触摸手势是否在该范围内return (ev_x > dx-40) && (ev_x < dx + 40) && (ev_y > dy-40) && (ev_y < dy + 40);}

手势监听,重绘 View :

    @Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubevent_x = event.getX(); //当前手势X轴坐标event_y = event.getY(); //当前手势Y轴坐标switch (event.getAction()){case MotionEvent.ACTION_DOWN://当手指按下时判断是否选中四个点中的一个if(isRangeOfView(dot1_x,dot1_y,event_x,event_y)){select_index=0;}else if(isRangeOfView(dot2_x,dot2_y,event_x,event_y)){select_index=1;}else if(isRangeOfView(dot3_x,dot3_y,event_x,event_y)){select_index=2;}else if(isRangeOfView(dot4_x,dot4_y,event_x,event_y)){select_index=3;}else{select_index=-1; //没选中为 -1}break;case MotionEvent.ACTION_MOVE://当手指滑动的时候,判断移动哪一个点switch (select_index){case 0: //标记=0  选中了第一个点dot1_x=event_x; //点1 x轴赋值=当前手势x轴dot1_y=event_y; //点1 y轴赋值=当前手势y轴pts=new float[]{dot1_x,dot1_y,dot2_x,dot2_y,dot3_x,dot3_y,dot4_x,dot4_y}; //重新封装点坐标数组invalidate(); //重绘当前Viewbreak;case 1:dot2_x=event_x;dot2_y=event_y;pts=new float[]{dot1_x,dot1_y,dot2_x,dot2_y,dot3_x,dot3_y,dot4_x,dot4_y};invalidate();break;case 2:dot3_x=event_x;dot3_y=event_y;pts=new float[]{dot1_x,dot1_y,dot2_x,dot2_y,dot3_x,dot3_y,dot4_x,dot4_y};invalidate();break;case 3:dot4_x=event_x;dot4_y=event_y;pts=new float[]{dot1_x,dot1_y,dot2_x,dot2_y,dot3_x,dot3_y,dot4_x,dot4_y};invalidate();break;}break;}return true;}

activity 布局中使用:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.xavi.testcanvas.DotViewandroid:layout_width="match_parent"android:layout_height="match_parent"/></androidx.constraintlayout.widget.ConstraintLayout>

OVER!

demo :https://download.csdn.net/download/qq396063616/12746905

Android Canvas制作一个可以拖动改变任意形状的四边形效果,并填充颜色相关推荐

  1. 怎么用Android做登录界面,利用Android怎么制作一个APP登录界面

    利用Android怎么制作一个APP登录界面 发布时间:2020-12-02 17:09:10 来源:亿速云 阅读:79 作者:Leah 这期内容当中小编将会给大家带来有关利用Android怎么制作一 ...

  2. [html] 使用canvas制作一个印章

    [html] 使用canvas制作一个印章 <!DOCTYPE html> <html lang="en"> <head><meta ch ...

  3. android 浮动文字提示,怎么在Android中实现一个自由拖动并显示文字的悬浮框

    怎么在Android中实现一个自由拖动并显示文字的悬浮框 发布时间:2021-01-27 15:34:05 来源:亿速云 阅读:107 作者:Leah 今天就跟大家聊聊有关怎么在Android中实现一 ...

  4. 基于Android Tv制作一个Tv桌面(二)

    标题基于Android Tv制作一个Tv桌面(二) 这里是获取APP的各种信息,不知道为什么这一步只能在主类MainActivity 上进行,不能在其他的类进行此操作,也许是我见识短浅的原因吧,因为其 ...

  5. 【web前端特效源码】使用HTML5+CSS3+JavaScript制作一个可拖动的拼图游戏动画效果~适合初学者~超简单~ |it前端开发

    b站视频演示效果: [web前端特效源码]使用HTML5+CSS3+JavaScript制作一个可拖动的拼图游戏动画效果~适合初学者~超简单~ |前端开发|IT软件 效果图: 完整代码: <!D ...

  6. 物联网控制APP入门专题(四)---使用android studio制作一个控制页面的APP框架

    摘要:上篇文章讲了如何用阿里云IoT Studio快速制作一个网页版的手机端,以及通过第三方平台将这个网页打包成一个APK文件,使它可以安装到手机实现APP的功能.但是使用第三方平台做的APP是需要收 ...

  7. 【web前端特效源码】使用HTML5+CSS3制作一个会动的电脑桌面+昼夜变化动画效果~~适合初学者~超简单~ |前端开发

    b站视频演示效果: [web前端特效源码]使用HTML5+CSS3制作一个会动的电脑桌面+昼夜变化动画效果~~适合初学者~超简单~ |前端开发|IT软件 效果图: 完整代码: <!DOCTYPE ...

  8. 蓝牙App设计2:使用Android Studio制作一个蓝牙软件(包含:代码实现等)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:二.蓝牙搜索配对连接实现. 课程1:Android Studio小白安装教程,以及第 ...

  9. 怎样用HTML5 Canvas制作一个简单的游戏

    为了让大家清楚HTML5制作游戏的简单流程,所以先了制作一个非常简单的游戏,来看一看这个过程.   游戏非常简单,无非就是英雄抓住怪物就得分,然后游戏重新开始,怪物出现在地图的随机位置,英雄初始化在地 ...

最新文章

  1. phpc.sinaapp.com 加密的解密方法
  2. cms java垃圾回收_java cms垃圾回收器总结
  3. eps如何建立立体白模_从几个方面说说自动化立体仓库的特别之处
  4. 支持与不支持in-place操作的OpenCV函数汇总
  5. 导入shape文件到SDE数据库
  6. 力扣350.两个数组的交集 II(JavaScript)
  7. wcf 基础教程 第一讲 wcf基础知识
  8. 关于ashx的基本应用
  9. 一个优质的课堂直播软件需要具备哪些功能?
  10. 实现html文件和c# 交互
  11. 如何删除下一页分节符_怎么去掉分节符下一页
  12. 完美解决电脑老是弹出广告窗口!
  13. java用etiplus如何打jar,README.md · Ranossy/majsoul_mod_plus - Gitee.com
  14. [附源码]java毕业设计动物保护网站
  15. 问题 D: 分解质因数
  16. 正负号 substr java_实战LeetCode 系列(一) (题目+解析)
  17. 口语语汇单词篇(5)
  18. 联想计算机phoenix award bios,BIOS设置图解教程(AWARD,AMI和PHOENIX)
  19. 黑马程序员--C语言基础之--变量、内部函数与外部函数
  20. StringBuffer为什么是线程安全的,StringBuilder为什么不是是线程安全的,以及它们的使用场景(代码测试验证)

热门文章

  1. Qt实现简单拼图游戏
  2. 云出阿里见月明(上)
  3. 摇一摇周边:微信是这样连接线下商户的
  4. minigui之显示gif
  5. 学习MySQL之数据库简介
  6. html css标记文本,HTML图像标记和CSS核心基础和文本相关样式
  7. 中国古代兵器与兵书·铁马驰骋
  8. HTML5微数据初识
  9. 永磁同步电机转子位置估算专题 —— 基波模型与转子位置角
  10. SOT-23三极管、MOS管、LDO封装对应图汇总