Android之给gridview的单元格加上分割线

有时候需要给gridview加上分割线,没有现成的解决方案,这里写好一个可以直接用的自定义gridview,就叫做LineGridView吧。先上图,zaker客户端第三方分享的gridview样式:


可以看到靠边的格子都是半封闭的,要实现这种效果仅仅靠美工给图片恐怕不行。反编译zaker的代码,虽然看不到整个代码,但是从中可以摸索出zaker是重写了gridview的dispatchDraw实现的,知道了思路下面我就写出了自己的实现方式。

代码不多,只需重载一个方法dispatchDraw即可:

public class LineGridView extends GridView{public LineGridView(Context context) {super(context);// TODO Auto-generated constructor stub}public LineGridView(Context context, AttributeSet attrs) {super(context, attrs);}public LineGridView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void dispatchDraw(Canvas canvas){super.dispatchDraw(canvas);View localView1 = getChildAt(0);int column = getWidth() / localView1.getWidth();int childCount = getChildCount();Paint localPaint;localPaint = new Paint();localPaint.setStyle(Paint.Style.STROKE);localPaint.setColor(getContext().getResources().getColor(R.color.grid_line));for(int i = 0;i < childCount;i++){View cellView = getChildAt(i);if((i + 1) % column == 0){canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), localPaint);}else if((i + 1) > (childCount - (childCount % column))){canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), localPaint);}else{canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), localPaint);canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), localPaint);}}if(childCount % column != 0){for(int j = 0 ;j < (column-childCount % column) ; j++){View lastView = getChildAt(childCount - 1);canvas.drawLine(lastView.getRight() + lastView.getWidth() * j, lastView.getTop(), lastView.getRight() + lastView.getWidth()* j, lastView.getBottom(), localPaint);}}}
}
dispatchDraw 方法中,我们对每一个子view的边界按照一定的方式绘上了边框,一般一个格子只需绘制其中两条边,需要注意的是最边上的格子需要特殊处理。 super .dispatchDraw(canvas); 一定要调用,不然格子中的内容(子view)就得不到绘制的机会,结果就如下面这样:


仔细看代码你会发现这个实现方式是很好的,但是代码并不完美,因为每条线的绘制我们都是以第一个子view 的宽高为基准的,如果某个格子的高度和第一个格子不一致,那么可能出现错位。如果你能确保每个格子大小均匀,直接拿来用,否则还需要些修改。这里是重写的dispatchDraw,其实我我们重写onDraw方法也可以得到相同的结果。要完全弄明白的话,就得看看FrameWork中GridView的源码了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295721.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure Machine Learning - 如何使用 GPT-4 Turbo with Vision

介绍如何在Azure中使用GPT-4 Turbo with Vision 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理…

系统命名与 SQL 命名之争 - 第 1 部分

创建数据库对象的命名规范 创建数据库对象时&#xff0c;开发人员可以选择一种命名方法&#xff0c;可以选择遵循传统 IBM i 行为的系统命名模式 (*SYS)&#xff0c;也可以选择遵循SQL 标准规则的 SQL 命名规范 (*SQL)。 DB2 for i 与其他数据库管理系统 (DBMS) 之间的主要差别…

C++ const 关键字使用

2019独角兽企业重金招聘Python工程师标准>>> 为什么使用const&#xff1f;采用符号常量写出的代码更容易维护&#xff1b;指针常常是边读边移动&#xff0c;而不是边写边移动&#xff1b;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号…

论大象如何装进冰箱

全世界只有3.14 % 的人关注了爆炸吧知识在这美好的一天&#xff0c;想和大家讨论一个有趣的数学话题&#xff1a;怎么才能将一只大象装进冰箱呢&#xff1f;数学的方法把大象放到冰箱里的分析学方法1&#xff09;先把大象微分&#xff0c;然后把它放到冰箱里&#xff0c;再在冰…

2020下半年新机最新消息_提前剧透 2020 年下半年五大新机

华为 Mate40系列 美帝一系列封杀骚操作&#xff0c;并没有影响到华为手机下一代的处理器——台积电代工的、采用了 5nm 进程的 Mate40 处理器——麒麟 1020。为了 3D 脸部识别&#xff0c;可能还是采用刘海屏。Mate40 Pro 的曲率更大&#xff0c;正面屏幕的视觉冲击更加震撼&am…

手把手教你学Dapr - 5. 状态管理

介绍使用状态管理&#xff0c;您的应用程序可以将数据作为键/值对存储在支持的状态存储中。您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来保存和读取键/值对&#xff0c;如下图所示。例如&#xff0c;通过使用 HTTP POST&#xff0c;您可以保存键/值对&#xf…

Android之drawlayout使用和总结

DrawLayout 今天发的Android之SlidingMenu博客之后,有人说out了,说用DrawLayout,我插,被叼了,然后我就到网上查drawLayout是什么?原来是侧滑菜单,好吧,赶快学习下,网上很多例子,都不怎么全面,然后找了找了呀,终于找到到了个成形的,然后自己改了下,不说了,先爆照 …

eclipse 汉化教程(语言包)

Eclipse 汉化图形教程此教程仅仅以links方式安装eclipse插件&#xff0c;且接下来主要以eclipse安装语言包为例&#xff0c;如果教程过程中哪里不对&#xff0c;请指出&#xff0c;谢谢。因使Eclipse版本太多&#xff0c;我这里就以eclipse3.5.2为例&#xff0c;讲讲如何将其汉…

4. MyBatis几个可以优化的地方

与其说是优化, 还不如说是让配置更简单.一: 连接数据库的配置单独放到一个属性文件中在 src 路径下新建一个 db.properties 属性文件, 并把数据库连接信息放入文件中, 然后在 conf.xml 文件中导入属性文件引用就可以了, 这样更好管理.1. 新建 db.properties 文件2. 写入属性信息…

免费使用的支付宝,到底是怎么一年赚1206亿的?

全世界只有3.14 % 的人关注了爆炸吧知识眨眼间&#xff0c;马云居然退休已经一年了&#xff0c;真可谓白驹过隙&#xff0c;恍惚而逝啊&#xff01;不过&#xff0c;你以为马云退休了&#xff0c;就清风明月&#xff0c;万事不管了。太年轻&#xff01;其实马云依旧掌控者蚂蚁集…

C#中使用opencv处理图像

OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库&#xff0c;可以运行在Linux、Windows、Android、ios等操作系统上&#xff0c;它轻量级而且高效---由一系列C函数和少量C类构成&#xff0c;同时提供了Python、Ruby、MATLAB等语言的接口…

php psr 编码规范_PHP之PSR-4规范:自动加载

1. 概述本 PSR 是关于由文件路径 自动载入 对应类的相关规范&#xff0c;本规范是可互操作的&#xff0c;可以作为任一自动载入规范的补充&#xff0c;其中包括 PSR-0&#xff0c;此外&#xff0c;本 PSR 还包括自动载入的类对应的文件存放路径规范。关于「能愿动词」的使用为了…

两台服务器虚拟成一个ip地址,两台服务器如何用一个ip地址

两台服务器如何用一个ip地址 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。检查Pkey是否一致。查看弹性云服务器内部分配到的Pkey…

SQL注入漏洞全接触--高级篇

2019独角兽企业重金招聘Python工程师标准>>> 看完入门篇和进阶篇后&#xff0c;稍加练习&#xff0c;破解一般的网站是没问题了。但如果碰到表名列名猜不到&#xff0c;或程序作者过滤了一些特殊字符&#xff0c;怎么提高注入的成功率?怎么样提高猜解效率?请大家接…

除了沉迷酒色之外,你还做过什么?

1 是了&#xff0c;说的就是我▼2 你这叫落井又下石...▼3 如何让衣服瞬间好看&#xff1f;▼4 自己品品...▼5 买家秀与卖家秀▼6 舍友的水杯...妥妥养生局&#xff01;▼7 还有...▼你点的每个赞&#xff0c;我都认真当成了喜欢

ssl certificate 验证

2019独角兽企业重金招聘Python工程师标准>>> 生成certificate&#xff1a; client 验证certificate&#xff1a; 转载于:https://my.oschina.net/u/255456/blog/545568

使用C#开发交互式命令行应用

前言如果你开发过vue应用&#xff0c;应该对其交互式命令行印象深刻&#xff1a;它允许你无需任何编程经验&#xff0c;仅需回答问题&#xff0c;就可完成vue应用创建。虽然作为.NETer&#xff0c;大部分情况下我们不会使用命令行&#xff0c;但是还是希望能用C#开发出这样的交…

300 s7 置零指令_西门子1200与200、200 SMART置位复位指令的区别

S7-1200的位逻辑指令&#xff0c;这也是我们在学习PLC编程时最先接触到的指令&#xff0c;最基本的指令。位逻辑运算指令是对二进制位进行操作的指令&#xff0c;数据类型是BOOL型&#xff0c;这其中又包括了触点指令与赋值指令、置位与复位指令、沿脉冲检测指令这三个部分。在…

惊现试衣间照片流出??

1 论断句的重要性▼2 这是个有味道的手机壳▼3 啊这...就挺秃然的&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 男朋友的瘦肉礼物&#xff08;via.苍南派&#xff09;▼5 哭泣吧&#xff0c;打工人&#xff01;&#xff01;▼6 朋友送的生日礼物被子还是衣服啊…

【转载】创建型-工厂方法模式

介绍&#xff1a;在简单工厂模式中&#xff0c;我们提到&#xff0c;工厂方法模式是简单工厂模式的一个延伸&#xff0c;它属于Gof23中设计模式的创建型设计模式。它解决的仍然是软件设计中与创建对象有关的问题。它可以更好的处理客户的需求变化。引入我们继续来说"new&q…