需求:

本文记录了我尝试实现支付宝钱包样式带分割线GridView的过程。首先看一下高大上的支付宝钱包首页:

这里画红框的部分,给人的直观感觉就是一个GridView 。当然,这里很可能是支付宝同学自定义了一个GridView的子类 。相对于ListView的单列列表,GridView则是一种支持多行多列的网格形式。 当我们想要实现例如九宫格的效果时,GridView即是首选。

然而,与ListView可以方便的设置和自定义分割线不同不同,GridView貌似并不提供分割线属性。这样,只能开动劳动人民的智慧来尝试解决了。(今天进行了三次尝试,成功的方式在第三次尝试中。 欢迎大家提供更好的实现方法)

第一次尝试:item的背景图

这个方法实际上是从网上看到的,使用最多的解决方案。 简而言之,就是对GridView的每个单元做背景图。代码说话:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_margin="0.0dip"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_centerInParent="true"android:background="@drawable/item_gridview"android:padding="12.0dip" ><ImageViewandroid:id="@+id/gridview_item_icon"android:layout_width="58.0dip"android:layout_height="58.0dip"android:layout_centerHorizontal="true"android:contentDescription="@string/app_name" /><TextViewandroid:id="@+id/gridview_item_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/gridview_item_icon"android:layout_centerHorizontal="true"android:layout_marginTop="5.0dip"android:maxLines="1"android:textSize="14.0sp" /></RelativeLayout></RelativeLayout>  

在item_gridview中,已矩形框为背景:

<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape android:shape="rectangle"><stroke android:width="1px" android:color="@color/pink" /><gradient android:angle="270.0" android:endColor="#ffe8ecef" android:startColor="#ffe8ecef" /></shape></item><item android:state_focused="true"><shape android:shape="rectangle"><gradient android:angle="270.0" android:endColor="#ffe8ecef" android:startColor="#ffe8ecef" /><stroke android:width="1px" android:color="@color/pink" /></shape></item><item><shape android:shape="rectangle"><gradient android:angle="270.0" android:endColor="#ffffffff" android:startColor="#ffffffff" /><stroke android:width="1px" android:color="@color/pink" /></shape></item></selector>

在Activity中对GridView设置Adapter,充入对象,效果如下图所示。(目前仅探究gridview,其他部分还比较丑)
                                                                               

感觉哪里不对。。 通过比较中间的列和最右边的列可以发现,分割线太粗了!
虽然在xml中设置的是最小值 1px , 然而看起来还是比支付宝钱包的效果粗很多。 因为后者才是 真·1px ,前者的分割线实际上是相邻单元的边框合并在了一起,所以看起来要粗很多。

第二次尝试:相邻单元只有一个背景

上面的问题已经可以看出,是相邻的单元格背景框相邻使分割线变粗。 那么可以提出相应的解决办法:相邻单元格只有一个有背景。
    
以当前4列的情况为例,实际上,可以去掉:
     第一行的第二,第四个单元
     第二行的第一,第三个单元
     第三行的第二,第四个单元
     。。。

可以总结出规律,通过去掉行列数奇偶性不同的单元,可以使相邻的单元(包括上下相邻和左右相邻)不同时具有边框。在adapter的getView方法中加入如下代码:

if(position/4%2!=position%2){RelativeLayout layout=(RelativeLayout)convertView.findViewById(R.id.layout_gridview);layout.setBackgroundResource(R.drawable.item_gridview2);
}

其中item_gridview2是边框为空白的背景
效果图:
                                                                                  
这是才发现,我犯了一个很2的错误:小看了1px的误差
当相邻单元的边框去除后,成对角方向的单元框对不齐了。。

第三次尝试:暴力加框

这一次比较直接和暴力,最终达到了预想的效果。但是显得不是那么聪明和巧妙,这里抛砖引玉,希望路过的大牛能给出更好的实现方法。

这一次,通过在单元格xml中插入两个宽度为1px的ImageView做边框,来实现gridview的伪分割线:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_weight="1"android:gravity="center"android:id="@+id/layout_gridview_item"android:orientation="vertical"><ImageViewandroid:layout_marginTop="12dp"android:id="@+id/gridview_item_icon"android:layout_width="38.0dip"android:layout_height="38.0dip"android:layout_centerHorizontal="true"android:background="@drawable/guan"android:contentDescription="@string/app_name" /><TextViewandroid:id="@+id/gridview_item_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/gridview_item_icon"android:layout_centerHorizontal="true"android:maxLines="1"android:text="标题"android:textColor="@color/darkblue"android:layout_marginBottom="12dp"android:textSize="14.0sp" /><ImageViewandroid:layout_width="match_parent"android:id="@+id/line_bottom"android:layout_height="1dp"android:background="@color/lightgray"android:layout_gravity="bottom"/></LinearLayout><ImageViewandroid:layout_width="1dp"android:layout_weight="0"android:layout_height="match_parent"android:background="@color/lightgray"android:layout_gravity="bottom"/></LinearLayout></LinearLayout>

最终效果。。
                                                                                 

第四次尝试:重写dispatchDraw 方法

这里我们可以对gridview进行重绘, 重写父类的dispatchDraw方法。
思路基本跟方法三一致,对每个子item画两条框。不同之处在于,当我们采用动态绘制(而不是写死在xml)时,可以针对不同的情况进行判断和定制,使最后的效果更完美。 在这里,可以考虑到左右上下的对称性和gridview的item数不是列数的整数倍时的情况。 重写代码如下:

@Overrideprotected void dispatchDraw(Canvas canvas) {super.dispatchDraw(canvas);View localView1 = getChildAt(0);int column = getWidth() / localView1.getWidth();int childCount = getChildCount();Paint localPaint= new Paint();localPaint.setStyle(Paint.Style.STROKE);localPaint.setColor(getContext().getResources().getColor(R.color.lightgray));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);}}//如果最后一行不足,则补全缺省item的右侧竖线。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);}}}

效果与第三种方法相同。

仿支付宝钱包:带分割线的GridView相关推荐

  1. Android 控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现

    Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现 关注finddreams:http://blog.csdn.net/finddreams/articl ...

  2. Android控件GridView之仿支付宝钱包首页带有分割线的GridView九宫格的完美实现

    今天我们来模仿一下支付宝钱包首页中带有分割线的GridView,俗称九宫格.先上图,是你想要的效果么?如果是请继续往下看. 我们都知道ListView设置分割线是非常容易的,设置ListView的分割 ...

  3. 高仿支付宝钱包九宫格解锁

    转载请表明出处:http://blog.csdn.net/forsxj/article/details/45221933 废话不多说,上效果图,先是高仿: 下面是正版的: 大体上实现了支付宝钱包九宫格 ...

  4. android开发支付界面,Android仿微信、支付宝钱包宫格界面Demo

    [实例简介] 博文源码,文章链接:http://blog.csdn.net/airsaid/article/details/50588728 [实例截图] [核心代码] [ec]仿微信.支付宝钱包宫格 ...

  5. Android 仿支付宝支付密码输入框的具体实现

    Android仿支付宝支付密码框 前言 1. 设计思路 2. 项目地址和implementation使用方法 3. 涉及到的内容 4. 设计流程 4.1 Layout 4.2 GridView和Ada ...

  6. Android自定义控件开发系列(三)——仿支付宝六位支付密码输入页面

    在移动互联领域,有那么几家龙头一直是我等学习和追求的目标,比如支付宝.微信.饿了么.酷狗音乐等等,大神举不胜举,他们设计的界面.交互方式已经培养了中国(有可能会是世界)民众的操作习惯:举个小例子,对话 ...

  7. android开发游记:仿支付宝余额数字累加滚动效果的实现

    支付宝更新9.0后,细心的朋友会发现新增了一个动画效果,就是进入我的钱包的时候,我的余额会有一段滚动显示的动画效果,比如说你有100块,余额就从0滚动到100,看到自己的钱在不断涨,让我们这些穷屌丝莫 ...

  8. android绑定支付宝支付宝支付宝支付密码错误,Android 仿支付宝支付密码输入框

    看到网友:http://www.jointforce.com/jfperiodical/article/3527?ref=myread 做的仿支付宝支付密码输入框,感觉挺适合初学自定义view的同仁练 ...

  9. Android 仿支付宝支付密码输入框

    看到网友:http://www.jointforce.com/jfperiodical/article/3527?ref=myread 做的仿支付宝支付密码输入框,感觉挺适合初学自定义view的同仁练 ...

最新文章

  1. 计算机书籍-Scratch少儿编程
  2. 雪崩 计算机组成原理,计算机组成原理复习资料(学习课件整理版可自学使用).doc...
  3. cordova入门——cordova环境配置
  4. php 利用debug_backtrace方法跟踪代码调用
  5. Linux常用命令:用户
  6. .net 常见异常及其翻译
  7. 用户id可以出现在url中吗_下载Google Drive中的文件
  8. sqlmap 注入方式、使用总结
  9. 打包windows 和 linux caffe 版本的人脸识别 人脸年龄估计 人脸性别模型的总结
  10. 易语言远程查询oracle数据库连接,易语言如何连接远程服务器上的数据库,并读取数据...
  11. python—如何处理文件中的缺失值
  12. C++primer 6.7节练习
  13. 计算机组成原理选择题题库
  14. 在线作图 grapheditor
  15. linux多个文件打包命令行,Linux基础:对文件打包压缩
  16. 解决Proteus仿真时候提示Could not load simulator DLL错误
  17. 利用微信公众号实现商品的展示和支付(2)
  18. 在线JSON转TSV工具
  19. 计算机信息管理 日语,2017年北京科技大学高职计算机信息管理(第一外语:日语)...
  20. 中国人民银行面试题目(经典题目2)

热门文章

  1. png转jpg具体操作方法
  2. 国庆七天测(五)马里奥
  3. 开通微信公众号留言功能的开通问题
  4. 微型计算机原理8255并行接口实验,微机原理实验二 8255A并行接口应用.pdf
  5. VUE 查找数组中符合条件的对象
  6. Ubuntu 18.04 vscode安装网易云音乐插件
  7. DOA_GAN的近似复现
  8. elm and halogen
  9. icloud安装错误怎么办_怎么办?iCloud云备份失败该如何解决?
  10. 梅科尔工作室-江凌宇-鸿蒙笔记2