日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

仿微信九宫格群聊view

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿微信九宫格群聊view 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果如下:

自定義view的源碼

public class NineGridImageView<T> extends ViewGroup {private int mRowCount;//行數private int mColumnCount;//列數private int mMaxSize = 9;private int mGap;//宮格間距private int mWidth;//當前組件寬度private int mHeight;//當前組件高度/* private Paint mBGPaint;private Paint mPathPaint;private Paint mFaceRectPaint;private Paint mFaceRoundPaint;private Rect mFaceRect;private Rect mFaceDetectRect;public static final int COLOR_BG = Color.parseColor("#FFFFFF");public static final int COLOR_RECT = Color.parseColor("#FFFFFF");public static final int COLOR_ROUND = Color.parseColor("#FFFFFF");*/private List<ImageView> mImageViewList = new ArrayList<>();private List<T> mImgDataList;private NineGridImageViewAdapter<T> mAdapter;public NineGridImageView(Context context) {super(context, null);}public NineGridImageView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public NineGridImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.NineGridImageView);this.mGap = (int) typedArray.getDimension(R.styleable.NineGridImageView_imgGap, 8);typedArray.recycle();}/*** 設置控件的寬高*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mWidth = measureWidth(widthMeasureSpec);mHeight = measureHeight(heightMeasureSpec);setMeasuredDimension(mWidth, mHeight);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {layoutChildrenView();}private int measureWidth(int measureSpec) {int result = 0;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);if (specMode == MeasureSpec.EXACTLY) {result = specSize;} else {result = 200;if (specMode == MeasureSpec.AT_MOST) {result = Math.min(result, specSize);}}return result;}private int measureHeight(int measureSpec) {int result = 0;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);if (specMode == MeasureSpec.EXACTLY) {result = specSize;} else {result = 200;if (specMode == MeasureSpec.AT_MOST) {result = Math.min(result, specSize);}}return result;}/*** 為子ImageView布局*/private void layoutChildrenView() {if (mImgDataList == null) {return;}int childrenCount = mImgDataList.size();for (int i = 0; i < childrenCount; i++) {ImageView childrenView = (ImageView) getChildAt(i);if (mAdapter != null) {mAdapter.onDisplayImage(getContext(), childrenView, mImgDataList.get(i));}int rowNum = i / mColumnCount;//當前行數int columnNum = i % mColumnCount;//當前列數int mImageSize = (mWidth - (mColumnCount + 1) * mGap) / mColumnCount;//圖片心墳int t_center = (mHeight + mGap) / 2;//中間置以下的頂點(有宮格間距)int b_center = (mHeight - mGap) / 2;//中間位置以上的底部(有宮格間距)int l_center = (mWidth + mGap) / 2;//中間位置以右的左部(有宮格間距)int r_center = (mWidth - mGap) / 2;//中間位置以左的右部(有宮格間距)int center = (mHeight - mImageSize) / 2;//中間位置以上頂部(無宮格間距)int left = mImageSize * columnNum + mGap * (columnNum + 1);int top = mImageSize * rowNum + mGap * (rowNum + 1);int right = left + mImageSize;int bottom = top + mImageSize;/*** 不同子view情況下的不同顯示*/if (childrenCount == 1) {childrenView.layout(left, top, right, bottom);} else if (childrenCount == 2) {childrenView.layout(left, center, right, center + mImageSize);} else if (childrenCount == 3) {if (i == 0) {childrenView.layout(center, top, center + mImageSize, bottom);} else {childrenView.layout(mGap * i + mImageSize * (i - 1), t_center, mGap * i + mImageSize * i, t_center + mImageSize);}} else if (childrenCount == 4) {childrenView.layout(left, top, right, bottom);} else if (childrenCount == 5) {if (i == 0) {childrenView.layout(r_center - mImageSize, r_center - mImageSize, r_center, r_center);} else if (i == 1) {childrenView.layout(l_center, r_center - mImageSize, l_center + mImageSize, r_center);} else {childrenView.layout(mGap * (i - 1) + mImageSize * (i - 2), t_center, mGap * (i - 1) + mImageSize * (i - 1), t_center + mImageSize);}} else if (childrenCount == 6) {if (i < 3) {childrenView.layout(mGap * (i + 1) + mImageSize * i, b_center - mImageSize, mGap * (i + 1) + mImageSize * (i + 1), b_center);} else {childrenView.layout(mGap * (i - 2) + mImageSize * (i - 3), t_center, mGap * (i - 2) + mImageSize * (i - 2), t_center + mImageSize);}} else if (childrenCount == 7) {if (i == 0) {childrenView.layout(center, mGap, center + mImageSize, mGap + mImageSize);} else if (i > 0 && i < 4) {childrenView.layout(mGap * i + mImageSize * (i - 1), center, mGap * i + mImageSize * i, center + mImageSize);} else {childrenView.layout(mGap * (i - 3) + mImageSize * (i - 4), t_center + mImageSize / 2, mGap * (i - 3) + mImageSize * (i - 3), t_center + mImageSize / 2 + mImageSize);}} else if (childrenCount == 8) {if (i == 0) {childrenView.layout(r_center - mImageSize, mGap, r_center, mGap + mImageSize);} else if (i == 1) {childrenView.layout(l_center, mGap, l_center + mImageSize, mGap + mImageSize);} else if (i > 1 && i < 5) {childrenView.layout(mGap * (i - 1) + mImageSize * (i - 2), center, mGap * (i - 1) + mImageSize * (i - 1), center + mImageSize);} else {childrenView.layout(mGap * (i - 4) + mImageSize * (i - 5), t_center + mImageSize / 2, mGap * (i - 4) + mImageSize * (i - 4), t_center + mImageSize / 2 + mImageSize);}} else if (childrenCount == 9) {childrenView.layout(left, top, right, bottom);}}}/*** 設置圖片數據** @param data 圖片數據集合*/public void setImagesData(List data) {if (data == null || data.isEmpty()) {this.setVisibility(GONE);return;} else {this.setVisibility(VISIBLE);}if (mMaxSize > 0 && data.size() > mMaxSize) {data = data.subList(0, mMaxSize);}int[] gridParam = calulateGridParam(data.size());mRowCount = gridParam[0];mColumnCount = gridParam[1];if (mImgDataList == null) {int i = 0;while (i < data.size()) {ImageView iv = getImageView(i);if (iv == null) {return;}addView(iv, generateDefaultLayoutParams());i++;}} else {int oldViewCount = mImgDataList.size();int newViewCount = data.size();if (oldViewCount > newViewCount) {removeViews(newViewCount, oldViewCount - newViewCount);} else if (oldViewCount < newViewCount) {for (int i = oldViewCount; i < newViewCount; i++) {ImageView iv = getImageView(i);if (iv == null) {return;}addView(iv, generateDefaultLayoutParams());}}}mImgDataList = data;requestLayout();}/*** 設置適配器** @param adapter 適配器*/public void setAdapter(NineGridImageViewAdapter adapter) {mAdapter = adapter;}/*** 設置宮格間距** @param gap 宮格間距 px*/public void setGap(int gap) {mGap = gap;}/*** 設置宮格參數** @param imagesSize 圖片數量* @return 宮格參數 gridParam[0] 宮格行數 gridParam[1] 宮格列數*/private static int[] calulateGridParam(int imagesSize) {int[] gridParam = new int[2];if (imagesSize < 3) {gridParam[0] = 1;gridParam[1] = imagesSize;} else if (imagesSize <= 4) {gridParam[0] = 2;gridParam[1] = 2;} else {gridParam[0] = imagesSize / 3 + (imagesSize % 3 == 0 ? 0 : 1);gridParam[1] = 3;}return gridParam;}/*** 獲得 ImageView* 保證了ImageView的重用** @param position 位置*/private ImageView getImageView(final int position) {if (position < mImageViewList.size()) {return mImageViewList.get(position);} else {if (mAdapter != null) {ImageView imageView = mAdapter.generateImageView(getContext());mImageViewList.add(imageView);return imageView;} else {Log.e("NineGridImageView", "你必須為NineGridImageView設置NineGridImageViewAdapter");return null;}}} } <declare-styleable name="LQRNineGridImageView"><attr format="dimension" name="imgGap"/></declare-styleable> public abstract class NineGridImageViewAdapter<T> {/*** 重寫該方法,使用任意第三方圖片加載工具加載圖片* @param context* @param imageView* @param t*/protected abstract void onDisplayImage(Context context, ImageView imageView, T t);/*** 重寫該方法自定義生成ImageView方式,用于九宮格頭像中的一個個圖片控件,可以設置ScaleType等屬性*/protected ImageView generateImageView(Context context) {ImageView imageView = new ImageView(context);imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);return imageView;}}

如何使用:

<com.chuanglan.flashchat.nine.NineGridImageViewandroid:id="@+id/group_header"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/gray9"android:scaleType="centerCrop" /> binding.groupHeader.setAdapter(mNineGridAdapter);//設置圖片地址listbinding.groupHeader.setImagesData(groupChatBean.getHeadImgList());

總結

以上是生活随笔為你收集整理的仿微信九宫格群聊view的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。