前两天在些项目的时候碰到常用的GridView要实现一些分割线,之前就是用本方法利用listView和Item的背景颜色的不同线显示分割线。这是最low的一种做法。于是我就简单的写了一个自定义的 GridView。

我们可以先看List怎么设置分割线
  1. android:divider
  2. android:dividerHeight
  • 1
  • 2
  • 1
  • 2

然而我们都知道 GirdView默认是没有网格线的,那么该如何设置呢?

如何设置GridView的分割线

  • 第一种通过设置背景颜色的不同来充当divier

    • 首先设置GridView的背景颜色
    • 设置item的背景颜色
    • 设置item的宽高
  1. <GridView
  2. android:id="@+id/mgv_griview2"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:layout_marginTop="30dp"
  6. android:background="@color/black3"
  7. android:horizontalSpacing="1dp"
  8. android:verticalSpacing="1dp"
  9. android:padding="2dp"
  10. android:numColumns="3" >
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:gravity="center"
  5. android:layout_margin="5dp"
  6. android:layout_height="match_parent">
  7. <ImageView
  8. android:layout_width="50dp"
  9. android:layout_height="50dp"
  10. android:background="@drawable/ic_launcher"
  11. android:id="@+id/myitem_gv"/>
  12. <TextView
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:gravity="center"
  16. android:layout_marginTop="10dp"
  17. android:text="图片"/>
  18. </LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

自定义View来解决GridView的分割线

效果图 

  1. **
  2. * 类功能描述:</br>
  3. * Created by Administrator on 2017/2/19 0018.
  4. * 博客地址: http://blog.csdn.net/androidstarjack
  5. * @author androidstar
  6. * @version 1.0 </p> 修改时间:</br> 修改备注:</br>
  7. * 公众号: 终端研发部
  8. */
  9. public class MyGridView extends GridView {
  10. /**
  11. * 默认的分割线的颜色
  12. * 也可以在布局中设置
  13. */
  14. private int diverColor = R.color.color1;
  15. /**
  16. * 默认的分割线的高度
  17. * 也可以在布局中设置
  18. */
  19. private int diverHeight = 1;
  20. /**
  21. * 所使用的画笔
  22. */
  23. private Paint paint;
  24. private Context context;
  25. public MyGridView(Context context, AttributeSet attrs) {
  26. super(context, attrs);
  27. this.context =context;
  28. TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.gv_acusttrs);
  29. diverHeight = (int) typedArray.getDimension(R.styleable.gv_acusttrs_divierHeight,10);
  30. diverColor = typedArray.getResourceId(R.styleable.gv_acusttrs_divierColor,R.drawable.editext_slelect_black4);
  31. typedArray.recycle();
  32. paint = new Paint();
  33. paint.setColor(ContextCompat.getColor(context,diverColor));
  34. paint.setStyle(Paint.Style.STROKE);
  35. paint.setAntiAlias(true);
  36. paint.setStrokeWidth(diverHeight);
  37. }
  38. @Override
  39. public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  40. int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
  41. super.onMeasure(widthMeasureSpec, expandSpec);
  42. }
  43. /**
  44. * 动态修改默认的分割线的颜色
  45. */
  46. public void setDiverColor(int diverColor){
  47. this.diverColor = diverColor;
  48. invalidate();
  49. }
  50. /**
  51. * 动态修改默认的分割线的颜色
  52. */
  53. public void setDiverHeight(int diverHeight){
  54. this.diverHeight = diverHeight;
  55. invalidate();
  56. }
  57. /**
  58. *
  59. * @param canvas
  60. */
  61. /* @Override
  62. protected void onDraw(Canvas canvas) {
  63. super.onDraw(canvas);
  64. Rect rect = new Rect();
  65. rect.left = DensityUtil.getScreenIntWidth(context) / 4;
  66. rect.top = DensityUtil.getScreenIntHeight(context) / 4;
  67. rect.right = DensityUtil.getScreenIntWidth(context)/ 4 * 3;
  68. rect.bottom = DensityUtil.getScreenIntHeight(context)/ 4 * 3;
  69. canvas.drawRect(rect,paint);
  70. }*/
  71. @Override
  72. protected void dispatchDraw(Canvas canvas) {
  73. super.dispatchDraw(canvas);
  74. View localView1 = getChildAt(0);//得到第一个view
  75. int column = getWidth() / localView1.getWidth();//列数
  76. int childCount = getChildCount();
  77. for (int i = 0; i < childCount; i++) {
  78. View cellView = getChildAt(i);
  79. if ((i + 1) % column == 0) {//每一行最后一个
  80. canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), paint);
  81. } else if ((i + 1) > (childCount - (childCount % column))) {//最后一行的item
  82. canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), paint);
  83. } else {
  84. canvas.drawLine(cellView.getRight(), cellView.getTop(), cellView.getRight(), cellView.getBottom(), paint);
  85. canvas.drawLine(cellView.getLeft(), cellView.getBottom(), cellView.getRight(), cellView.getBottom(), paint);
  86. }
  87. }
  88. }
  89. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

我们都知道这里用到了dispatchDraw方法

  1. /**
  2. * Called by draw to draw the child views. This may be overridden
  3. * by derived classes to gain control just before its children are drawn
  4. * (but after its own view has been drawn).
  5. * @param canvas the canvas on which to draw the view
  6. */
  7. protected void dispatchDraw(Canvas canvas) {
  8. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小 
    画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法,
  • dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(),

相关demo现在地址: 
MyGridViewApplication.rar

自定义GridView实现分割线解析的更多相关文章

  1. android gridview画分割线

    dongyangzhang android gridview画分割线,如图: 1.先上图: 2.具体实现代码: public class LineGridView extends GridView { ...

  2. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  3. List<T>集合的Sort自定义排序用法简单解析

    List<T>集合的Sort自定义排序用法简单解析: 如下:一系列无序数字,如果想要他们倒序排列,则使用如下代码: 那么如何理解这段代码呢? (x,y)表示相邻的两个对象,如果满足条件:x ...

  4. android开发(34) 自定义 listView的分割线( 使用xml drawable画多条线)

    我遇到这样一个场景,我需要自定义 listView的分割线,而这个分割线是由两条线组成的,在使用xml drawable时遇到了困难. 注释:画两条线是为了实现 凹陷的效果,在绘图中一条暗线紧跟着一条 ...

  5. [转载]开发 Spring 自定义视图和视图解析器

    原文出处 http://www.ibm.com/developerworks/cn/java/j-lo-springview/ 概述 Spring 3.0 默认包含了多种视图和视图解析器,比如 JSP ...

  6. 30、自定义gridview

    要想实现自定义gridview效果,有下边几个步骤: 1.定义grivew中的item的xml文件 假如item需要显示一个图片,图片下边显示文字: <?xml version="1. ...

  7. Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解

    Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解 @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Javabean中的一 ...

  8. android 自定义gridview(导航)

    最近又重新做回安卓,做了个小项目.下绝心使用android studio,通过这一回实战,终于用上了.综合了前人的经验,搞了个自己满意的导航界面,用的是gridview. 代码: package co ...

  9. 这一次搞懂Spring自定义标签以及注解解析原理

    前言 在上一篇文章中分析了Spring是如何解析默认标签的,并封装为BeanDefinition注册到缓存中,这一篇就来看看对于像context这种自定义标签是如何解析的.同时我们常用的注解如:@Se ...

随机推荐

  1. Ubuntu下使用cmake生成可执行文件

    1.单个CPP文件的cmake 首先编写一个简单的程序(main.cpp): #include <iostream> using namespace std; int main() { c ...

  2. 2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1)

    A. Ducks in a Row 当$n\times k>|S|$时,显然无解. 否则最优解中翻转的区间一定两两不相交,设$f[i][j][x][y]$表示考虑前$i$个位置,第$i$个位置翻 ...

  3. 考前停课集训 Day2 非

    因为太长了 所以一天一天分开发 Day2 昨天晚上没开黑车 没脱衣服就睡了 可能是我难受了…… 新的一天. 早上好. 我没去晨跑,早上先和团长集合了,没看见rkbudlo来 于是就先吃饭了 去机房的时 ...

  4. Java 接口 Comparable

    compareTo方法是Comparable接口中唯一的方法.类实现了该接口后表明它的实例具有内在的排序关系.当该对象小于.等于或大于指定对象的时候,分别返回一个负整数.0或者正整数.如果由于指定对象 ...

  5. input的一些使用方法

  6. 学习 IOC 设计模式前必读:依赖注入的三种实现

    一直以来就是越难的东西越值钱! 嘿嘿,这篇博文章转载自:http://www.cnblogs.com/liuhaorain/p/3747470.html 摘要 面向对象设计(OOD)有助于我们开发出高 ...

  7. C_求质数

    质数:质数(prime number)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数. 题设:输入一个大于1的自然数,求出从2到该数之间所有的质数 ...

  8. Eclipse/myEclipse 代码提示/自动提示/自动完成设置

    设置eclipse/myEclipse代码提示可以方便开发者,不用在记住拉杂的单词,只用打出首字母,就会出现提示菜单.如同dreamweaver一样方便. 1.菜单window->Prefere ...

  9. 00、Word Count

    1.开发环境 1.eclipse-jee-neon-3 2.scala-ide:http://download.scala-ide.org/sdk/lithium/e46/scala212/stabl ...

  10. Hexo 博客 github.io MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...