自定义控件实现微博图片九宫格效果

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;
    }

    /**
     * 根据图片个数确定行列数量
     * 对应关系如下
     * num	row	column
     * 1	   1	1
     * 2	   1	2
     * 3	   1	3
     * 4	   2	2
     * 5	   2	3
     * 6	   2	3
     * 7	   3	3
     * 8	   3	3
     * 9	   3	3
     *
     * @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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值