package com.uiuios.aios.view; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import com.uiuios.aios.R; import com.uiuios.aios.bean.DesktopIcon; import java.util.ArrayList; import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.makeMeasureSpec; /** * 自定义布局组件 * * @author zihao */ public class MyGridLayout extends ViewGroup { private static final String TAG = MyGridLayout.class.getSimpleName(); int margin = 0;// 每个格子的水平和垂直间隔 int colums = 3;//列数 int rows = 3;//行数 int count = 0; private 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); // margin = a.getInteger(R.styleable.MyGridLayout_itemMargin, 2); colums = a.getInteger(R.styleable.MyGridLayout_numColumns, 3); rows = a.getInteger(R.styleable.MyGridLayout_numRows, 3); } } public MyGridLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyGridLayout(Context context) { this(context, null); } public void setColums(int c) { this.colums = c; } public void setRows(int r) { this.rows = r; } public void set(int c, int r) { this.colums = c; this.rows = r; } @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 + 1)) / rows;// 格子高度 int left; int top = margin + margin / 2; 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; } // if (j == 0) { left = j * gridW + (j + 1) * margin + margin / 2; // } else { // left = j * gridW + (j + 1) * margin; // } // 如果当前布局宽度和测量宽度不一样,就直接用当前布局的宽度重新测量 if (gridW != child.getMeasuredWidth() || gridH != child.getMeasuredHeight()) { child.measure(makeMeasureSpec(gridW, EXACTLY), makeMeasureSpec(gridH, EXACTLY)); } child.layout(left, top, left + gridW, top + gridH); // Log.e(TAG, "onLayout: left = " + left); // Log.e(TAG, "onLayout: top = " + top); // Log.e(TAG, "onLayout: right = " + left + gridW); // Log.e(TAG, "onLayout: bottom = " + 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); void onLongClick(View v, int index); } private ArrayList applicationInfos; public void setApplicationInfos(ArrayList infoArrayList) { this.applicationInfos = infoArrayList; } /** * 设置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 OnClickListener() { @Override public void onClick(View v) { click.onItemClick(v, index); } }); view.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View view) { click.onLongClick(view, index); return false; } }); if (applicationInfos.get(index) == null) { view.setClickable(false); } else { view.setClickable(true); } } } }