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是什么?原来是侧滑菜单,好吧,赶快学习下,网上很多例子,都不怎么全面,然后找了找了呀,终于找到到了个成形的,然后自己改了下,不说了,先爆照 …

qtp服务器怎么获得日志信息,QTP自动化测试-打开运行报告

微信JSAPI支付最近在微信H5页面内集成微信JSAPI支付,遇到不少问题,现将集成步骤及遇到的问题记录如下: 1.官方下载SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api ...如何Windows分页控件中增加统计功能在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管…

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 还包括自动载入的类对应的文件存放路径规范。关于「能愿动词」的使用为了…

Android之日期时间选择器使用方法

// 设置日期 @Override public void onClick(View v) {new DatePickerDialog(activity,new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year,int monthOfYear, int dayOfMonth) {// 设置calendar.set(year, monthOfYear, day…

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

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

近期调优总结

近期由于公司举行大促&#xff0c;访问量巨增&#xff0c;预计流量为平时流量的60倍&#xff0c;在增加了两台服务器后&#xff0c;为了更大程度的压榨服务器性能&#xff0c;从各个层面上进行了优化&#xff0c;现在做下总结以备忘。 1&#xff09;nginx优化 nginx优化主要涉及…

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#开发出这样的交…