版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中实现微信群聊头像效果
这期内容当中在下将会给大家带来有关怎么在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
contex
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路工程施工安全管理与监测技术研究
- 2023年广西南宁市马山县中考数学一模试卷
- 老年年专业技术人员发挥余热-老年年文体工作者
- 机械cad教案 文档
- 河南省郑州市第八中学2023-2024学年七年级下学期期中考试数学试卷
- 湖北省黄冈市蕲春县2023-2024学年七年级下学期期中地理试题
- 甘肃省2023年英语小升初试卷(含答案)
- 河北石家庄裕华区精英外语小学2023-2024学年六年级下学期期中英语试题
- 打造企业的执行力培训
- 2024年智能医疗项目经营分析报告
- 动画制作与特效设计项目实施服务方案
- 空运集装板集装板
- 房屋赠与协议书电子模板(2篇)
- 项目部组建及项目实施管理办法
- 一年级劳动认识2-5种校园植物评课稿
- 主题亲子农场项目商业计划书
- 初中数学-变量之间的关系教学设计学情分析教材分析课后反思
- 学校关于开展保密法宣传周活动方案
- 维护政治安全工作情况报告
- 人教版小学数学四年级上册每课一练(课堂同步)练习试题 全册
- 消化内镜操作、诊断及治疗
评论
0/150
提交评论