GridView分割线在某些情景下可能不是很满足我们的需求,我们自己来实现一个可以自己控制的。这里继承GridView,通过测量绘制方法完成
注意:
1.考虑低版本适配,我们需要反射访问隐藏字段;
2.简单点,这里用直线表示,实际开发中可以根据需要定制要绘制的内容
思路:
1.根据Canvas.drawLine(startX, startY, endX, endY, Paint)方法反推,主要参数为startY与endY,二者必然一致,否则就歪。
2.总行数取值分为一屏以内、超出一屏两种情况。当在一屏内时,GridView高度与item高度取整;超出一屏时item总数与单行个数取整,此时会有不足一行的情况,我们要把多出来的算为一行。
3.在上下滑动时如默认不做任何处理,会出现错位现象,我们需要加上item具体位置,保证不会错位
下面继承GridView实现,根据以上思路实现一下:
[代码]java代码:
protected void dispatchDraw(Canvas canvas) { super .dispatchDraw(canvas); if (getChildCount() <= 0 ) return ; int numColumns = getNumColumnsCompatible(); View child = getChildAt( 0 ); if (child == null ) return ; int childHeight = child.getHeight(); int max = getHeight()/ childHeight; if (getCount() / numColumns > max ) { max = getCount() / numColumns ; int more = getCount() % numColumns ; if (more > 0 ) { max = max + 1 ; } } dividerLine(canvas, childView,max); } private void dividerLine(Canvas canvas, View child, int max) { int eachY = 0 ; for ( int i = 1 ; i < max ; i++) { eachY = child.getHeight() * i + child.getTop(); //确保滑动不错位 canvas.drawLine( 0 , eachY , parentWidth, eachY , Paint); } } @TargetApi ( 11 ) public int getNumColumnsCompatible() { if (Build.VERSION.SDK_INT >= 11 ) { return super .getNumColumns(); } else { try { Field numColumns = GridView. class .getDeclaredField( "mNumColumns" ); numColumns.setAccessible( true ); return numColumns.getInt( this ); } catch (Exception e) { if (mNumColumns != - 1 ) { return mNumColumns; } } } } |
可能有人会有疑问,为什么使用dispatchDraw而不使用onDraw方法?
首先:自定义View时,我们在measure、layout之后会调用onDraw完成绘制,此时我们是绘制View自身
此处我们的需求是,在GridView内部绘制出分割线,属于绘制子view。
最后奉上我曾经的思路来源:http://www.2cto.com/kf/201602/489367.html感谢po主分享
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦