博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为Android GridView 设置行背景
阅读量:6206 次
发布时间:2019-06-21

本文共 2325 字,大约阅读时间需要 7 分钟。

经常有这样的需求,你的功能图标要像一个个物品,摆放在书架上,像这样:

我的思路比较简单,重载GridView,在他绘制子视图前,先把背景绘制完成

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
public class RowGridView extends GridView {
    private static String NAMESPACE_ANDROID = "";
              
    private Bitmap rowBackground;
    private int rowBgHeight;
    private int columnNum;
              
    public RowGridView(Context context, AttributeSet attrs){
        super(context,attrs);
        //获得列数
        columnNum = attrs.getAttributeIntValue(NAMESPACE_ANDROID,"numColumns",3);
        //获取自定义属性
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.row_bg_grid_view);
        rowBgHeight = a.getDimensionPixelSize(R.styleable.row_bg_grid_view_row_bg_height,50);
        int row_bg_resource = a.getResourceId(R.styleable.row_bg_grid_view_row_background,-1);
        rowBackground = BitmapFactory.decodeResource(getResources(),row_bg_resource);
    }
              
    @Override
    protected void dispatchDraw(Canvas canvas){
        //行高
        int rHeight = getChildAt(0).getHeight();
        int width = getWidth();
        int rowNum = (int)Math.ceil(getChildCount()/(double)columnNum);
        //源绘制矩形
        Rect src = new Rect(0,0,rowBackground.getWidth(),rowBackground.getHeight());
        for(int i=0,y=rHeight-(rowBgHeight/2); i<rowNum; i++,y += rHeight){
            //目的绘制矩形
            Rect dst = new Rect(0,y,width,y+rowBgHeight);
            canvas.drawBitmap(rowBackground,src,dst,null);
        }
        super.dispatchDraw(canvas);
    }
}

上面第11行有这样一句

1
columnNum = attrs.getAttributeIntValue(NAMESPACE_ANDROID,"numColumns",3);

为什么不用getNumColumns?因为这个函数需要api level 11(即Android 3.0以上),而且有可能返回-1

两个自定义属性:背景和背景高度,在values/attrs.xml定义如下

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="row_bg_grid_view">
        <attr name="row_background" format="reference"/>
        <attr name="row_bg_height" format="dimension" />
    </declare-styleable>
</resources>

最后使用的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<LinearLayout
        xmlns:android=""
        xmlns:oa=""
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
    <com.best.oa.common.base.RowGridView
            android:id="@+id/functions"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:layout_weight="1"
            android:numColumns="2"
            oa:row_background="@drawable/grid_row_bg"
            oa:row_bg_height="60dip"
            android:stretchMode="columnWidth">
    </com.best.oa.common.base.RowGridView>
</LinearLayout>

转载地址:http://rxwja.baihongyu.com/

你可能感兴趣的文章
用大数据处理思路保护数据
查看>>
还是分了的好——看惠普、赛门铁克拆分
查看>>
yum和编译两种方式升级or降级Centos内核
查看>>
Android消息处理机制Looper和Handler详解
查看>>
C# 设置IE Cookie 从而实现自动打开需要登录的页面
查看>>
Android拓展系列(2)--Git使用
查看>>
脚踏实地,不要飘忽不定
查看>>
A Resegmentation Approach for Detecting Rectangular Objects in High-Resolution Imagery
查看>>
郁闷的时候干脆休息
查看>>
sql语句查询Oracle|sql server|access 数据库里的所有表名,字段名
查看>>
当 dynamic 遇上 internal
查看>>
webGL简单例子(klayge)
查看>>
如何在有int型主键遍历表中的某一列数据
查看>>
梯度下降法 Method of steepest descent.
查看>>
跟小静读CLR via C#(09)-扩展方法
查看>>
关于javascript中的回调函数
查看>>
多进程,多线程,就是这么回事儿
查看>>
Java之Log4j入门 [V512工作室视频]
查看>>
mass Framework class模块 v7
查看>>
数的乘方,简单背包,组合
查看>>