自定义控件实现微博图片九宫格效果
来源:互联网 发布:管家婆辉煌软件 编辑:程序博客网 时间:2024/05/21 06:26
1:自定义GridView
public class NineGridlayout extends ViewGroup { private NineGridAdapter adapter; private OnItemClickListerner onItemClickListerner; // 行间距 private int lineSpace; //列间距 private int gap; private final int DEFAULT_WIDTH = 140; private int columns;// private int rows;// private int totalWidth; private Context context; int singleWidth = 0, singleHeight = 0; private int defaultWidth, defaultHeight; private int oldCount; public NineGridlayout(Context context) { this(context, null); } public NineGridlayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public NineGridlayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; gap = dip2px(context, 10); lineSpace = dip2px(context,10); defaultWidth = defaultHeight = dip2px(context, DEFAULT_WIDTH); } public void setDefaultWidth(int defaultWidth) { this.defaultWidth = defaultWidth; } public void setDefaultHeight(int defaultHeight) { this.defaultHeight = defaultHeight; } public void setAdapter(NineGridAdapter adapter) { this.adapter = adapter; if (adapter == null) { return; } //初始化布局形状 generateChildrenLayout(adapter.getCount()); //这里做一个重用view的处理// if (oldCount == 0) { removeAllViews(); for (int i = 0; i < adapter.getCount(); i++) { View itemView = adapter.getView(i, null); addView(itemView, generateDefaultLayoutParams()); }// } /*else { //以前添加过view int newViewCount = adapter.getCount(); if (oldCount > newViewCount) { removeViews(newViewCount - 1, oldCount - newViewCount); for (int i = 0; i < newViewCount - 1; i++) { adapter.getView(i, getChildAt(i)); } } else if (oldCount < newViewCount) { for (int i = 0; i < newViewCount - oldCount; i++) { View itemView = adapter.getView(i, null); addView(itemView, generateDefaultLayoutParams()); } } }*/ oldCount = adapter.getCount(); requestLayout(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); totalWidth = sizeWidth - getPaddingLeft() - getPaddingRight(); if (adapter != null && adapter.getCount() > 0) { int measureWidth, measureHeight; int childrenCount = adapter.getCount(); if (childrenCount == 1) { singleWidth = defaultWidth; singleHeight = defaultHeight; } else { singleWidth = (totalWidth - gap * (3 - 1)) / 3; singleHeight = singleWidth; } measureChildren(MeasureSpec.makeMeasureSpec(singleWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(singleHeight, MeasureSpec.EXACTLY)); measureWidth = singleWidth * columns + gap * (columns - 1); measureHeight = singleHeight * rows + lineSpace * (rows - 1); setMeasuredDimension(sizeWidth, measureHeight); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { layoutChildrenView(); } private void layoutChildrenView() { if (adapter == null || adapter.getCount() == 0) { return; } int childrenCount = adapter.getCount(); for (int i = 0; i < childrenCount; i++) { int[] position = findPosition(i); int left = (singleWidth + gap) * position[1] + getPaddingLeft(); int top = (singleHeight + lineSpace) * position[0] + getPaddingTop(); int right = left + singleWidth; int bottom = top + singleHeight; ImageView childrenView = (ImageView) getChildAt(i); if (childrenCount == 1) { //只有一张图片 childrenView.setScaleType(ImageView.ScaleType.FIT_CENTER); } else { childrenView.setScaleType(ImageView.ScaleType.CENTER_CROP); } final int itemPosition = i; childrenView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (onItemClickListerner != null) { onItemClickListerner.onItemClick(v, itemPosition); } } }); childrenView.layout(left, top, right, bottom); } } private int[] findPosition(int childNum) { int[] position = new int[2]; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { if ((i * columns + j) == childNum) { position[0] = i;//行 position[1] = j;//列 break; } } } return position; } public int getGap() { return gap; } public void setGap(int gap) { this.gap = gap; } /** * 根据图片个数确定行列数量 * 对应关系如下 * numrowcolumn * 1 11 * 2 12 * 3 13 * 4 22 * 5 23 * 6 23 * 7 33 * 8 33 * 9 33 * * @param length */ private void generateChildrenLayout(int length) { if (length <= 3) { rows = 1; columns = length; } else if (length <= 6) { rows = 2; columns = 3; if (length == 4) { columns = 2; } } else { rows = 3; columns = 3; } } /** * dp to px */ public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } public void setOnItemClickListerner(OnItemClickListerner onItemClickListerner) { this.onItemClickListerner = onItemClickListerner; } public interface OnItemClickListerner { public void onItemClick(View view, int position); }}2:自定义Adapter
public abstract class NineGridAdapter { protected Context context; protected List list; public NineGridAdapter(Context context, List list) { this.context = context; this.list = list; } public abstract int getCount(); public abstract String getUrl(int positopn); public abstract Object getItem(int position); public abstract long getItemId(int position); public abstract View getView(int i, View view);}
3:MainActivity中正常调用,和GridView一样使用。xml布局中的控件写自定义的控件然后就可以使用了。
public class SinaActivity extends BaseActivity{ private String imageUrl = "http://pic1.nipic.com/2008-09-08/200898163242920_2.jpg"; private List<String> list = new ArrayList<String>(); private ImageLoader imageLoader; private Adapter adapter; private NineGridlayout mGV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sina); mGV = (NineGridlayout) findViewById(R.id.iv_ngrid_layout); imageLoader = ImageLoader.getInstance(); for (int i = 0;i<4;i++){ list.add(imageUrl); } if (adapter == null){ adapter = new Adapter(this,list); mGV.setAdapter(adapter); } mGV.setOnItemClickListerner(new NineGridlayout.OnItemClickListerner() { @Override public void onItemClick(View view, int position) { Toast.makeText(getApplicationContext(), String.valueOf(position),Toast.LENGTH_LONG).show(); } }); } private class Adapter extends NineGridAdapter { public Adapter(Context context, List list){ super(context,list); } @Override public int getCount() { return list == null?0:list.size(); } @Override public String getUrl(int positon) { return getItem(positon) == null ? null : getItem(positon).toString(); } @Override public Object getItem(int position) { return (list == null) ? null : list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int i, View view) {// ImageView imageView = new ImageView(getApplicationContext()); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setBackgroundColor(Color.parseColor("#f5f5f5")); imageView.setLayoutParams(lp); imageLoader.displayImage(getUrl(i),imageView); return imageView; } } @Override public void onClick(View v) { }}
0 0
- 自定义控件实现微博图片九宫格效果
- 自定义九宫格控件NineGridLayout ,实现微信朋友圈图片九宫格显示
- 自定义控件一百行代码实现微信朋友圈九宫格图片显示
- [Android实例] 自定义控件一百行代码实现微信朋友圈九宫格图片显示
- 【Android】自定义控件实现九宫格解锁
- Android自定义控件实现九宫格解锁
- 仿美播登陆页面,实现九宫格图片翻转效果
- 自定义控件之九宫格
- java实现微博九宫格图片切分
- android实现九宫格效果
- iOS实现九宫格效果
- iOS 实现九宫格效果
- 自定义View常用例子二(点击展开隐藏控件,九宫格图片控件)
- 模仿微信九宫格图片展示控件
- php实现微信中的图片合并-九宫格图片
- 自定义控件九宫格滑动解锁
- Android自定义控件---仿微信群聊(九宫格)头像
- 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件
- LeetCode-- Flatten Binary Tree to Linked List
- 欢迎使用CSDN-markdown编辑器
- iOS 几种设计模式
- poj 1321
- iOS多线程与网络开发之解析json数据
- 自定义控件实现微博图片九宫格效果
- java关于线程的问题
- HDOJ 1272 小希的迷宫(并查集)
- EF增删改查的优化
- Android中关于Adapter的使用(上)ArrayAdapter
- 关于接入新浪微博第三方登录
- Leetcode #74 Search a 2D Matrix
- UIScrollView下拉刷新效果实现
- html 文档类型DTD与浏览器怪异模式