国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android仿微信群聊頭像效果

2019-10-21 21:45:58
字體:
來源:轉載
供稿:網友

在網上找了些仿微信群聊頭像的開源庫后,發現沒特別好用的,或者說滿足我需求的,就只好在別人的基礎上改了下,也就有了這樣的自定義控件了,以此來實現微信群聊頭像的效果,效果圖如下所示:

Android,微信,頭像

主要實現:

一、自定義viewGroup,以此來實現主要的代碼邏輯

public class NineGridImageView<T> extends ViewGroup{  private int mRowCount; //行數 private int mColumnCount; //列數  private int mMaxSize = 9; //最大圖片數 private int mGap; //宮格間距  private int parentWidth;//父組件寬 private int parentHeight;//父組件高  private List<ImageView> mImageViewList = new ArrayList<>(); private List<T> mImgDataList;  private NineGridImageViewAdapter<T> 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(); }  /**  * 設定寬高  */ @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;//當前行數   int columnNum = i % mColumnCount;//當前列數    int mImageSize = (parentWidth-(mColumnCount+1)*mGap)/mColumnCount;//圖片尺寸    int t_center = (parentHeight + mGap)/2;//中間位置以下的頂點(有宮格間距)   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);   }  } }  /**  * 設置圖片數據  *  * @param lists 圖片數據集合  */ 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;   }  } }  /**  * 設置宮格參數  *  * @param imagesSize 圖片數量  * @return 宮格參數 gridParam[0] 宮格行數 gridParam[1] 宮格列數  */ 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; }  /**  * 設置適配器  *  * @param adapter 適配器  */ public void setAdapter(NineGridImageViewAdapter adapter){  mAdapter = adapter; }  /**  * 設置宮格間距  *  * @param gap 宮格間距 px  */ public void setGap(int gap){  mGap = gap; }  /**  * 對宮格的寬高進行重新定義  */ 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; }}

二、你要顯示你的網絡圖片所需要的代碼

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; }  //這里可以添加你所需要的事件之類的方法}

對了,別忘了配置間隔屬性,記得添加attrs.xml文件,加上如下代碼

<declare-styleable name="NineGridImageView">  <attr format="dimension" name="imgGap"/> </declare-styleable>

三、用法

NineGridImageViewAdapter<String> mAdapter = new NineGridImageViewAdapter<String>() {   @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);

四、總結

用適配器模式的方法給群聊頭像加圖片的方式是想可以在這里可以用不同方式來實現圖片的加載方式,這里普及下適配器模式的知識,主要是把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作,優點是更好的復用性和擴展性,缺點則是過多使用會使系統零亂,不易整體把握。好像有點偏題了,這里就附上:GroupIconSample源碼地址

參考:NineGridImageView

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金川县| 汶川县| 开鲁县| 南召县| 得荣县| 锡林浩特市| 伊金霍洛旗| 宜阳县| 富裕县| 平武县| 尼木县| 琼中| 新河县| 沭阳县| 蚌埠市| 乌海市| 来安县| 常德市| 潍坊市| 桓台县| 砀山县| 都江堰市| 开封县| 壶关县| 阿坝县| 荣昌县| 马边| 黄大仙区| 南漳县| 荔波县| 中西区| 灵石县| 安图县| 永泰县| 新闻| 文昌市| 丰台区| 中山市| 大宁县| 临沂市| 金湖县|