请选择 进入手机版 | 继续访问电脑版
JAVEN

类朋友圈图片布局(自定义)

所在版块: Android技术 2016-05-17 16:01   [复制链接] 查看: 8550|回复: 6
本帖最后由 wKai 于 2016-5-17 16:05 编辑

一个自定义ViewGroup,最多存放6张图,根据图片数量的不同,提供不同的显示方式。不好粘图,"o"代表图片。以下为排列方式。
1.  o    2.  oo    3.  ooo   4.  oo    5.  oo    6.  ooo
                                           oo         ooo       ooo


public class MutiImageView extends LinearLayout {
        private static final int DIVIER = 5;

        // 照片的Url列表
        private List<String> imagesList;

        /** 长度 单位为Pixel **/
        private int pxOneMaxWandH; // 单张图最大允许宽高

        public MutiImageView(Context context) {
                this(context, null);
        }

        public MutiImageView(Context context, AttributeSet attrs) {
                this(context, attrs, 0);
        }

        public MutiImageView(Context context, AttributeSet attrs, int defStyleAttr) {
                super(context, attrs, defStyleAttr);

        }

        int MAX_WIDTH = 0;

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                if (MAX_WIDTH == 0) {
                        int width = measureWidth(widthMeasureSpec);
                        if (width > 0) {
                                MAX_WIDTH = width;
                                // if (imagesList != null && imagesList.size() > 0) {
                                // setList(imagesList);
                                // }
                        }
                }
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }

        public void setUrlList(List<String> urlList) {
                if (urlList == null && urlList.size() == 0) {
                        setVisibility(GONE);
                        return;
                }
                setVisibility(VISIBLE);
                imagesList = urlList;
                if (!mIsFirst) {
                        notifyDataSetChanged();
                }
        }

        boolean mIsFirst = true;

        public void notifyDataSetChanged() {
                removeAllViews();
                int size = imagesList.size();
                if (size > 0) {
                        setVisibility(VISIBLE);
                } else {
                        setVisibility(GONE);
                }
                initView();
        }

        /**
         * 初始化位置
         *
         * @return
         */
        public LinearLayout initParams() {
                LinearLayout rowLayout = new LinearLayout(getContext());
                rowLayout.setOrientation(LinearLayout.HORIZONTAL);
                int wrap = LayoutParams.WRAP_CONTENT;
                int match = LayoutParams.MATCH_PARENT;
                LayoutParams params = new LayoutParams(match, wrap);
                params.setMargins(0, 0, 0, DIVIER);
                rowLayout.setLayoutParams(params);
                addView(rowLayout);
                return rowLayout;
        }

        @Override
        protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
                super.onLayout(changed, left, top, right, bottom);
                if (mIsFirst) {
                        notifyDataSetChanged();
                        mIsFirst = false;
                }
        }

        // 根据imageView的数量初始化不同的View布局,还要为每一个View作点击效果
        private void initView() {
                this.setOrientation(VERTICAL);
                this.removeAllViews();
                if (imagesList == null || imagesList.size() == 0) {
                        return;
                }
                int allCount = imagesList.size();
                switch (allCount) {
                case 1:
                        createOneImageView();
                        break;
                case 2:
                        LinearLayout rowLayout0 = initParams();
                        for (int columnCursor = 0; columnCursor < allCount; columnCursor++) {
                                if (columnCursor == 0) {
                                        rowLayout0.addView(createImageView(columnCursor, 2, false));
                                } else {
                                        rowLayout0.addView(createImageView(columnCursor, 2, true));
                                }
                        }
                        break;
                case 3:
                        LinearLayout rowLayout = initParams();
                        for (int columnCursor = 0; columnCursor < allCount; columnCursor++) {
                                if (columnCursor == 0) {
                                        rowLayout.addView(createImageView(columnCursor, 3, false));
                                } else {
                                        rowLayout.addView(createImageView(columnCursor, 3, true));
                                }
                        }
                        break;
                case 4:
                        for (int i = 0; i < 2; i++) {
                                LinearLayout rowLayout2 = initParams();
                                for (int columnCursor = 0; columnCursor < 2; columnCursor++) {
                                        if (columnCursor == 0) {
                                                rowLayout2.addView(createImageView(2 * i + columnCursor, 2, false));
                                        } else {
                                                rowLayout2.addView(createImageView(2 * i + columnCursor, 2, true));
                                        }

                                }
                        }
                        break;
                case 5:
                        for (int i = 0; i < 2; i++) {
                                LinearLayout rowLayout3 = initParams();
                                if (i == 0) {
                                        for (int columnCursor = 0; columnCursor < 2; columnCursor++) {
                                                if (columnCursor == 0) {
                                                        rowLayout3.addView(createImageView(columnCursor, 2, false));
                                                } else {
                                                        rowLayout3.addView(createImageView(columnCursor, 2, true));
                                                }
                                        }
                                } else if (i == 1) {
                                        for (int columnCursor = 0; columnCursor < 3; columnCursor++) {
                                                if (columnCursor == 0) {
                                                        rowLayout3.addView(createImageView(2 * i + columnCursor, 3, false));
                                                } else {
                                                        rowLayout3.addView(createImageView(2 * i + columnCursor, 3, true));
                                                }

                                        }
                                }
                        }
                        break;
                case 6:
                default:
                        for (int i = 0; i < 2; i++) {
                                LinearLayout rowLayout4 = initParams();
                                for (int columnCursor = 0; columnCursor < 3; columnCursor++) {
                                        if (columnCursor == 0) {
                                                rowLayout4.addView(createImageView(3 * i + columnCursor, 3, false));
                                        } else {
                                                rowLayout4.addView(createImageView(3 * i + columnCursor, 3, true));
                                        }
                                }
                        }
                        break;
                }
        }

        private int measureWidth(int measureSpec) {
                int result = 0;
                int specMode = MeasureSpec.getMode(measureSpec);
                int specSize = MeasureSpec.getSize(measureSpec);

                if (specMode == MeasureSpec.EXACTLY) {
                        // We were told how big to be
                        result = specSize;
                } else {
                        // Measure the text
                        // result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
                        // + getPaddingRight();
                        if (specMode == MeasureSpec.AT_MOST) {
                                // Respect AT_MOST value if that was what is called for by
                                // measureSpec
                                result = Math.min(result, specSize);
                        }
                }
                return result;
        }

        /**
         * 创建ImageView
         *
         * @param position
         * @param column
         * @param isMar
         * @return
         */
        private ImageView createImageView(int position, int column, boolean isMar) {
                String url = imagesList.get(position);
                ImageView imageView = new ImageView(getContext());
                imageView.setScaleType(ScaleType.CENTER_CROP);
                int match = (MAX_WIDTH - (column - 1) * DIVIER) / column;
                int height = match;
                LayoutParams params = new LayoutParams(match, height);
                if (isMar) {
                        params.setMargins(DIVIER, 0, 0, 0);
                }
                imageView.setLayoutParams(params);
                imageView.setId(url.hashCode());
                // imageView.setTag(position);
                // imageView.setOnClickListener(mImageViewOnClickListener);
                imageView.setOnClickListener(new ImageViewClickLister(position));
                displayImage(imageView, url);
                // Picasso.with(getContext()).load(url).into(imageView);
                return imageView;
        }

        private ImageView createOneImageView() {
                String url = imagesList.get(0);
                ImageView imageView = new ImageView(getContext());
                // imageView.setAdjustViewBounds(true);
                imageView.setScaleType(ScaleType.CENTER_CROP);
                int match = MAX_WIDTH;
                int height = match * 3 / 4;
                // Log.i("TAG", "match = " + match);
                LayoutParams params = new LayoutParams(match, height);
                imageView.setLayoutParams(params);
                addView(imageView);
                imageView.setId(url.hashCode());
                imageView.setOnClickListener(new ImageViewClickLister(0));
                displayImage(imageView, url);
                // Picasso.with(getContext()).load(url).into(imageView);
                return imageView;
        }

        protected void displayImage(ImageView imageView, String url) {
                Glide.with(getContext()).load(Urls.DOWNLOAD_IMG + url).into(imageView);
        }

        // 图片点击事件
        class ImageViewClickLister implements View.OnClickListener {

                private int position;

                public ImageViewClickLister(int position) {
                        super();
                        this.position = position;
                }

                @Override
                public void onClick(View v) {
                        if (mOnItemClickListener != null) {
                                mOnItemClickListener.onItemClick(v, position);
                        }
                }
        }

        private OnItemClickListener mOnItemClickListener;

        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
                mOnItemClickListener = onItemClickListener;
        }

        public interface OnItemClickListener {
                public void onItemClick(View view, int position);
                // public void onItemClick(View view);
        }
}

回复

使用道具 举报

科学巨人-马云

  • TA的每日心情
    奋斗
    2016-7-28 15:40
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    发表于 2016-5-17 21:05:15 | 显示全部楼层
    回复

    使用道具 举报

    javen

  • TA的每日心情
    擦汗
    2016-5-26 16:08
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-5-17 23:07:06 | 显示全部楼层
      牛牛牛
    回复 支持 反对

    使用道具 举报

    javen

  • TA的每日心情
    擦汗
    2016-5-26 16:08
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2016-5-17 23:10:39 | 显示全部楼层

    如图,可以将一个图片添加到帖子的指定位置。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复 支持 反对

    使用道具 举报

    一道杠大队长

  • TA的每日心情
    难过
    2016-5-18 11:14
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2016-5-18 11:32:44 | 显示全部楼层
    牛  牛
    回复 支持 反对

    使用道具 举报

    smlqf7

    该用户从未签到

    发表于 2018-7-27 18:34:44 | 显示全部楼层
    回复 支持 反对

    使用道具 举报

    smlqf7

    该用户从未签到

    发表于 2018-10-9 07:34:40 | 显示全部楼层
    楼主万岁,万万岁,哈哈哈哈,谢谢了











    字典   http://www.gfgfgf.com.tw/zt/   2018年10月09日 世界之最
    中醫常識    表白的話 http://www.gfgfgf.com.tw/zyts/zyzl/  直髮         https://www.kenwoodhk.com.hk/  祝賀詞
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    我的博客

    QQ|Archiver|手机版|小黑屋|课堂笔记  

    GMT+8, 2018-12-12 10:59 , Processed in 0.110432 second(s), 31 queries .

    快速回复 返回列表