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 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 自定义控件---检测区域网格绘制控件 -> 正文阅读

[移动开发]Android 自定义控件---检测区域网格绘制控件

在这里插入图片描述

先上效果图,这是国内萤石检测区域绘制控件看起来也是比较简单,今天,我进行以下开发
一,实现以上效果图
二,增加全选功能

先实现第一步
思路:
1.因为此控件需要加载图片,所以我们最简单的方式新建一个控件,继承自imageview,免去了宽高适配的烦恼,把重点放在实现的逻辑上
2.采用画线法将控件分成多个方块
3.采用矩形来填充方块,也就是说,方块与网格线是分别画上去的不是一体
4.新建两个数组,一个是全部被填充的方块数组,一个是临时的填充方块数组,每画一次,先放在临时的数组,后面再加入到全部的数组,为什么要这样做呢,后面我会分析
5.将手指滑过的路径中的方块全部选中,我的方式如下:
先把手指滑过的区域填充加入到临时的数组里
X方向:将每个最左边的X,最右边的X记录下来,判断中间是否有方块,有的话加入到临时数组里面
Y方向(同理):将每个最上边的Y,最上边的Y记录下来,判断中间是否有方块,有的话加入到临时数组里面
经过这个处理后,我们就能将手指滑过的路径中间空余的方块填充起来,这也是我为什么要用两个数组去记录的原因
6.擦除方块,有上面的方法,处理就比较简单了,将手指滑动路径经过的方块,加入到一个擦除数组里,在与填充的数组对比,remove调对应的方块即可
7.横竖屏切换:切换的时候,虽然imageview已经帮我们处理了整个控件的变化,但是由于我们是用画板绘制,所以我们需要计算横竖屏切换的比例转换,这里我直接使用一个比例系数 s = width / height,切换时各自的x,y,width,heigth 乘比例系数即可
8.填充方块的绘制:拿出填充数组,根据数组里面的x,y,绘制对应位置的方块

第二步
这个就简单了,直接把数组填充满,再画上去就行

最后上关键代码:
填充中间空余方块(注意精度问题,减少误差)

    private void fullXY() {

        for (int i = 1; i <= vCount; i++) {
            List<Float> listv = new ArrayList<>();
            for (int j = 0; j < tempList.size(); j++) {
                if (tempList.get(j).bottom == (i * (mCellHeight + 1))) ) {
                    listv.add(tempList.get(j).left);
                }
            }
            listX.add(list);

        }


        for (int i = 1; i <= hCount; i++) {
            List<Float> listh = new ArrayList<>();
            for (int j = 0; j < tempList.size(); j++) {
                if (tempList.get(j).right == (i * (mCellWidth + 1)))) {
                    listh.add(tempList.get(j).top);
                }
            }
            listY.add(list);

        }
    }

填充极值中间的方块

  for (int i = 0; i < listX.size(); i++) {
            for (int j = 0; j < listX.get(i).size(); j++) {
                float mi = (float) min(listX.get(i));
                float ma = (float) max(listX.get(i));
                //取极值,填充
                drawAllX(mi, ma);
            }


        }
        listX.clear();

        for (int i = 0; i < listY.size(); i++) {
            for (int j = 0; j < listY.get(i).size(); j++) {
                float min = (float) min(listY.get(i));
                float max = (float) max(listY.get(i));
                //取极值,填充
                drawAllY(min, max);
            }


        }
        listY.clear();

后续的代码就比较简单了,需要可以私聊我,或者等待我上传git
下次讲讲IOS端实现

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:42:07  更:2022-02-26 11:43:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 20:46:25-

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