当前位置: 首页 > news >正文

android手动绘制矩形框

public boolean onTouchEvent(MotionEvent event) {

float x = event.getX();

float y = event.getY();

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

if(is_select_area){

downX = x;

downY = y;

downRectF.set(downX, downY, downX, downY);

//表示可以改变矩形形状 得是矩形确认形状后

if (sideBoxRectF.contains(downRectF) && !dragRectF.contains(downRectF) && boxRectConfirm) {

changeBoxSide = true;

}

if (dragRectF.contains(downRectF) && boxRectConfirm) {

dragBox = true;

}

lastX = x;

lastY = y;

}

if(is_selected){

downX = x;

downY = y;

dragRectF.set(rect);

// downRectF.set(downX, downY, downX, downY);

// //表示可以改变矩形形状 得是矩形确认形状后

if (sideBoxRectF.contains(downRectF) && !dragRectF.contains(downRectF) && boxRectConfirm) {

changeBoxSide = true;

}

if (dragRectF.contains(downRectF) && boxRectConfirm) {

dragBox = true;

}

lastX = x;

lastY = y;

}

break;

case MotionEvent.ACTION_MOVE:

float offsetX = x - lastX;

float offsetY = y - lastY;

if(is_selected){

if (dragBox) {//手指按下点,在上一个lastBoxRectF矩形内,才考虑执行下面的代码 因为boxRectF会变的,有可能导致变着变着boxRectF包含了downRectF

rect.offset( offsetX, offsetY);

}

//拖动边缘改变View大小和形状

//当左边框小到一定程度就不响应了

//感觉需要对 矩形上下左右区域做下区分

if (leftRectF.contains(downRectF)) {//左区域

rect.left += offsetX;

} else if (leftTopRectF.contains(downRectF) && !dragRectF.contains(downRectF)) {//左上区域 特殊在,点击位置不位于上一次的标注框内

rect.left += offsetX;

rect.top += offsetY;

} else if (topRectF.contains(downRectF)) {//上区域

rect.top += offsetY;

} else if (rightTopRectF.contains(downRectF) && !dragRectF.contains(downRectF)) {

rect.top += offsetY;

rect.right += offsetX;

} else if (rightRectF.contains(downRectF)) {//右区域

rect.right += offsetX;

} else if (rightBottomRectF.contains(downRectF) &&a

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Spring Boot实战:拦截器
  • Python获取本机ip
  • 多久没有清理你的电脑磁盘了?轻松解锁免费轻量磁盘清理工具
  • 计网:http/1.1、http/2和http/3的改变和优化
  • 制造知识普及(八)--企业内部物料编码(IPN)与制造商物料编码(MPN)
  • WT2605C蓝牙语音芯片赋能对讲机新体验:无屏操控、音频解码与蓝牙音箱三合一
  • liunx装了torch-cuda,运行的却是cpu版的torch
  • Golang——逃逸分析
  • MindSearch:AI 时代的“思考型”搜索引擎
  • EasyExcel 自定义转换器、自定义导出字典映射替换、满足条件内容增加样式
  • Python 之Scikit-learn(三) -- 使用Scikit-learn进行数据归一化
  • 八股(1)
  • 中超股份五年坎坷资本梦:毛利率下滑,连年大额分红还募投补流
  • 利用SSH实现分布式应用的一键安装部署①(多主机执行指令函数封装、日志输出、关闭防火墙、传输文件函数封装)
  • Qt无边框窗口,关闭后再show,鼠标等事件不响应问题解决办法
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • conda常用的命令
  • Cookie 在前端中的实践
  • ES6核心特性
  • FineReport中如何实现自动滚屏效果
  • JavaScript的使用你知道几种?(上)
  • JavaScript中的对象个人分享
  • MySQL的数据类型
  • QQ浏览器x5内核的兼容性问题
  • Yii源码解读-服务定位器(Service Locator)
  • 全栈开发——Linux
  • 如何在 Tornado 中实现 Middleware
  • 算法-插入排序
  • 06-01 点餐小程序前台界面搭建
  • 带你开发类似Pokemon Go的AR游戏
  • #考研#计算机文化知识1(局域网及网络互联)
  • (poj1.3.2)1791(构造法模拟)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .net开发时的诡异问题,button的onclick事件无效
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Transactional 详解
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [51nod1610]路径计数
  • [Android 13]Input系列--获取触摸窗口
  • [AX]AX2012 R2 出差申请和支出报告
  • [BROADCASTING]tensor的扩散机制
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [C++]拼图游戏