生活随笔
收集整理的這篇文章主要介紹了
仿微信九宫格群聊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 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
;}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
;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
);}}}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();}public void setAdapter(NineGridImageViewAdapter adapter
) {mAdapter
= adapter
;}public void setGap(int gap
) {mGap
= gap
;}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
;}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> {protected abstract void onDisplayImage(Context context
, ImageView imageView
, T t
);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
);binding
.groupHeader
.setImagesData(groupChatBean
.getHeadImgList());
總結
以上是生活随笔為你收集整理的仿微信九宫格群聊view的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。