【Android】格子布局(类似锤子桌面布局)

转载:

http://www.devstore.cn/code/info/277.html



利用自定义布局实现了格子布局,用来展示选项,添加了对应的item点击监听,和“锤子”桌面效果差不多。

源码运行截图

  • 【Android】格子布局(类似锤子桌面布局)_第1张图片效果图

源码片段

?
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
public class MyGridLayout extends ViewGroup {
     int margin = 2 ; // 每个格子的水平和垂直间隔
     int colums = 2 ;
     int count = 0 ;
 
     GridAdatper adapter;
 
     @SuppressLint ( "Recycle" )
     public MyGridLayout(Context context, AttributeSet attrs, int defStyle) {
         super (context, attrs, defStyle);
         if (attrs != null ) {
             TypedArray a = getContext().obtainStyledAttributes(attrs,
                     R.styleable.MyGridLayout);
             colums = a.getInteger(R.styleable.MyGridLayout_numColumns, 2 );
             margin = ( int ) a.getInteger(R.styleable.MyGridLayout_itemMargin, 2 );
         }
     }
 
     public MyGridLayout(Context context, AttributeSet attrs) {
         this (context, attrs, 0 );
     }
 
     public MyGridLayout(Context context) {
         this (context, null );
     }
 
     @Override
     protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec) {
 
         count = getChildCount();
         if (count == 0 ) {
             super .onMeasure(widthMeasureSpec, widthMeasureSpec);
             return ;
         }
 
         for ( int i = 0 ; i < count; i++) {
             final View child = getChildAt(i);
             if (child.getVisibility() == GONE) {
                 continue ;
             }
 
             child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
 
         }
 
         super .onMeasure(widthMeasureSpec, heightMeasureSpec);
     }
 
     @Override
     protected void onLayout( boolean changed, int l, int t, int r, int b) {
         int height = b - t; // 布局区域高度
         int width = r - l; // 布局区域宽度
         int rows = count % colums == 0 ? count / colums : count / colums + 1 ; // 行数
         if (count == 0 )
             return ;
         int gridW = (width - margin * (colums - 1 )) / colums; // 格子宽度
         int gridH = (height - margin * rows) / rows; // 格子高度
 
         int left = 0 ;
         int top = margin;
 
         for ( int i = 0 ; i < rows; i++) { // 遍历行
             for ( int j = 0 ; j < colums; j++) { // 遍历每一行的元素
                 View child = this .getChildAt(i * colums + j);
                 if (child == null )
                     return ;
                 left = j * gridW + j * margin;
                 // 如果当前布局宽度和测量宽度不一样,就直接用当前布局的宽度重新测量
                 if (gridW != child.getMeasuredWidth()
                         || gridH != child.getMeasuredHeight()) {
                     child.measure(makeMeasureSpec(gridW, EXACTLY),
                             makeMeasureSpec(gridH, EXACTLY));
                 }
                 child.layout(left, top, left + gridW, top + gridH);
             }
             top += gridH + margin;
         }
     }
 
     public interface GridAdatper {
         View getView( int index);
 
         int getCount();
     }
 
     /** 设置适配器 */
     public void setGridAdapter(GridAdatper adapter) {
         this .adapter = adapter;
         // 动态添加视图
         int size = adapter.getCount();
         for ( int i = 0 ; i < size; i++) {
             addView(adapter.getView(i));
         }
     }
 
     public interface OnItemClickListener {
         void onItemClick(View v, int index);
     }
 
     /**
      * 设置item点击事件
      *
      * @param click
      */
     public void setOnItemClickListener( final OnItemClickListener click) {
         if ( this .adapter == null )
             return ;
         for ( int i = 0 ; i < adapter.getCount(); i++) {
             final int index = i;
             View view = getChildAt(i);
             view.setOnClickListener( new View.OnClickListener() {
 
                 @Override
                 public void onClick(View v) {
                     click.onItemClick(v, index);
                 }
             });
         }
     }
}

你可能感兴趣的:(【Android】格子布局(类似锤子桌面布局))