1. 程式人生 > >[Android例項] 自定義控制元件一百行程式碼實現微信朋友圈九宮格圖片顯示

[Android例項] 自定義控制元件一百行程式碼實現微信朋友圈九宮格圖片顯示

  1. package com.weixinninegridlayout;
  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.graphics.drawable.ColorDrawable;
  5. import android.util.AttributeSet;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.ImageView;
  9. import java.util.List;
  10. /**
  11. * Created by Pan_ on 2015/2/2.
  12. */
  13. public class NineGridlayout extends ViewGroup {
  14.     /**
  15.      * 圖片之間的間隔
  16.      */
  17.     private int gap = 5;
  18.     private int columns;//
  19.     private int rows;//
  20.     private List listData;
  21.     private int totalWidth;
  22.     public NineGridlayout(Context context) {
  23.         super(context);
  24.     }
  25.     public NineGridlayout(Context context, AttributeSet attrs) {
  26.         super(context, attrs);
  27.         ScreenTools screenTools=ScreenTools.instance(getContext());
  28.         totalWidth=screenTools.getScreenWidth()-screenTools.dip2px(80);
  29.     }
  30.     @Override
  31.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  32.         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  33.     }
  34.     @Override
  35.     protected void onLayout(boolean changed, int l, int t, int r, int b) {
  36.     }
  37.     private void layoutChildrenView(){
  38.         int childrenCount = listData.size();
  39.         int singleWidth = (totalWidth - gap * (3 - 1)) / 3;
  40.         int singleHeight = singleWidth;
  41.         //根據子view數量確定高度
  42.         ViewGroup.LayoutParams params = getLayoutParams();
  43.         params.height = singleHeight * rows + gap * (rows - 1);
  44.         setLayoutParams(params);
  45.         for (int i = 0; i < childrenCount; i++) {
  46.             CustomImageView childrenView = (CustomImageView) getChildAt(i);
  47.             childrenView.setImageUrl(((Image) listData.get(i)).getUrl());
  48.             int[] position = findPosition(i);
  49.             int left = (singleWidth + gap) * position[1];
  50.             int top = (singleHeight + gap) * position[0];
  51.             int right = left + singleWidth;
  52.             int bottom = top + singleHeight;
  53.             childrenView.layout(left, top, right, bottom);
  54.         }
  55.     }
  56.     private int[] findPosition(int childNum) {
  57.         int[] position = new int[2];
  58.         for (int i = 0; i < rows; i++) {
  59.             for (int j = 0; j < columns; j++) {
  60.                 if ((i * columns + j) == childNum) {
  61.                     position[0] = i;//行
  62.                     position[1] = j;//列
  63.                     break;
  64.                 }
  65.             }
  66.         }
  67.         return position;
  68.     }
  69.     public int getGap() {
  70.         return gap;
  71.     }
  72.     public void setGap(int gap) {
  73.         this.gap = gap;
  74.     }
  75.     public void setImagesData(List<Image> lists) {
  76.         if (lists == null || lists.isEmpty()) {
  77.             return;
  78.         }
  79.         //初始化佈局
  80.         generateChildrenLayout(lists.size());
  81.         //這裡做一個重用view的處理
  82.         if (listData == null) {
  83.             int i = 0;
  84.             while (i < lists.size()) {
  85.                 CustomImageView iv = generateImageView();
  86.                 addView(iv,generateDefaultLayoutParams());
  87.                 i++;
  88.             }
  89.         } else {
  90.             int oldViewCount = listData.size();
  91.             int newViewCount = lists.size();
  92.             if (oldViewCount > newViewCount) {
  93.                 removeViews(newViewCount - 1, oldViewCount - newViewCount);
  94.             } else if (oldViewCount < newViewCount) {
  95.                 for (int i = 0; i < newViewCount - oldViewCount; i++) {
  96.                     CustomImageView iv = generateImageView();
  97.                     addView(iv,generateDefaultLayoutParams());
  98.                 }
  99.             }
  100.         }
  101.         listData = lists;
  102.         layoutChildrenView();
  103.     }
  104.     /**
  105.      * 根據圖片個數確定行列數量
  106.      * 對應關係如下
  107.      * num        row        column
  108.      * 1           1        1
  109.      * 2           1        2
  110.      * 3           1        3
  111.      * 4           2        2
  112.      * 5           2        3
  113.      * 6           2        3
  114.      * 7           3        3
  115.      * 8           3        3
  116.      * 9           3        3
  117.      *
  118.      * @param length
  119.      */
  120.     private void generateChildrenLayout(int length) {
  121.         if (length <= 3) {
  122.             rows = 1;
  123.             columns = length;
  124.         } else if (length <= 6) {
  125.             rows = 2;
  126.             columns = 3;
  127.             if (length == 4) {
  128.                 columns = 2;
  129.             }
  130.         } else {
  131.             rows = 3;
  132.             columns = 3;
  133.         }
  134.     }
  135.     private CustomImageView generateImageView() {
  136.         CustomImageView iv = new CustomImageView(getContext());
  137.         iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
  138.         iv.setOnClickListener(new OnClickListener() {
  139.             @Override
  140.             public void onClick(View v) {
  141.             }
  142.         });
  143.         iv.setBackgroundColor(Color.parseColor("#f5f5f5"));
  144.         return iv;
  145.     }
  146. }