這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么在Android中實(shí)現(xiàn)微信群聊頭像效果,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)西安,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
一、自定義viewGroup,以此來實(shí)現(xiàn)主要的代碼邏輯
public class NineGridImageViewextends ViewGroup{ private int mRowCount; //行數(shù) private int mColumnCount; //列數(shù) private int mMaxSize = 9; //最大圖片數(shù) private int mGap; //宮格間距 private int parentWidth;//父組件寬 private int parentHeight;//父組件高 private List mImageViewList = new ArrayList<>(); private List mImgDataList; private NineGridImageViewAdapter mAdapter; public NineGridImageView(Context context) { this(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(); } /** * 設(shè)定寬高 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); parentWidth = measureWidth(widthMeasureSpec); parentHeight = measureHeight(heightMeasureSpec); setMeasuredDimension(parentWidth,parentHeight); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { layoutChildrenView(); } /** * 為子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;//當(dāng)前行數(shù) int columnNum = i % mColumnCount;//當(dāng)前列數(shù) int mImageSize = (parentWidth-(mColumnCount+1)*mGap)/mColumnCount;//圖片尺寸 int t_center = (parentHeight + mGap)/2;//中間位置以下的頂點(diǎn)(有宮格間距) int b_center = (parentHeight - mGap)/2;//中間位置以上的底部(有宮格間距) int l_center = (parentWidth + mGap)/2;//中間位置以右的左部(有宮格間距) int r_center = (parentWidth - mGap)/2;//中間位置以左的右部(有宮格間距) int center = (parentHeight - 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); } } } /** * 設(shè)置圖片數(shù)據(jù) * * @param lists 圖片數(shù)據(jù)集合 */ public void setImagesData(List lists){ if(lists == null || lists.isEmpty()){ this.setVisibility(GONE); return; }else { this.setVisibility(VISIBLE); } if(mMaxSize > 0 && lists.size() > mMaxSize){ lists = lists.subList(0, mMaxSize); } int[] gridParam = calculateGridParam(lists.size()); mRowCount = gridParam[0]; mColumnCount = gridParam[1]; if(mImgDataList == null){ int i = 0; while (i < lists.size()){ ImageView iv = getImageView(i); if(iv == null){ return; } addView(iv,generateDefaultLayoutParams()); i++; } }else { int oldViewCount = mImgDataList.size(); int newViewCount = lists.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 = lists; requestLayout(); } /** * 獲得 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("NineGirdImageView", "Your must set a NineGridImageViewAdapter for NineGirdImageView"); return null; } } } /** * 設(shè)置宮格參數(shù) * * @param imagesSize 圖片數(shù)量 * @return 宮格參數(shù) gridParam[0] 宮格行數(shù) gridParam[1] 宮格列數(shù) */ protected static int[] calculateGridParam(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; } /** * 設(shè)置適配器 * * @param adapter 適配器 */ public void setAdapter(NineGridImageViewAdapter adapter){ mAdapter = adapter; } /** * 設(shè)置宮格間距 * * @param gap 宮格間距 px */ public void setGap(int gap){ mGap = gap; } /** * 對(duì)宮格的寬高進(jìn)行重新定義 */ 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; } }
二、你要顯示你的網(wǎng)絡(luò)圖片所需要的代碼
public abstract class NineGridImageViewAdapter{ 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; } //這里可以添加你所需要的事件之類的方法 }
對(duì)了,別忘了配置間隔屬性,記得添加attrs.xml文件,加上如下代碼
三、用法
NineGridImageViewAdaptermAdapter = new NineGridImageViewAdapter () { @Override protected void onDisplayImage(Context context, ImageView imageView, String s) { Picasso.with(context).load(s).placeholder(R.mipmap.ic_holding).error(R.mipmap.ic_error).into(imageView); } @Override protected ImageView generateImageView(Context context) { return super.generateImageView(context); } }; groudIcon1.setAdapter(mAdapter); groudIcon1.setImagesData(mPostList1);
上述就是小編為大家分享的怎么在Android中實(shí)現(xiàn)微信群聊頭像效果了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。