您的位置:首页 > 移动开发 > Android开发

android_自定义折叠View

2016-04-21 15:16 483 查看
最近项目需求,为了节约空间显示更多的内容,需要做一个可以折叠的view,个人百度了许久没有合适的代码,最终还是自己自定义算了。效果图看到的只是初步的效果,在这里只是将功能实现了,具体的UI没有做调整,别见怪。

效果如下:录制的gif有点卡大家凑合着看,运行在自己的模拟器上是不会卡顿的。



如何使用:

a.在布局文件中引用

<span style="font-size:14px;"><com.example.view.CollapseView
android:id="@+id/collapseView"
android:layout_width="match_parent"
android:layout_height="wrap_content" /></span>

b.在Activity调用

开始上代码。。。

可以设置折叠之后显示几个标签。

每一个红色区域表示一个标签,上面没有圈红色的也是同理。

开始测量:onMeause()

计算宽度width:

<span style="font-size:14px;">int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width = 0;
int height = 0;
DisplayMetrics dm = mContext.getResources().getDisplayMetrics();
int screenWidth = dm.widthPixels; // 屏幕宽度(像素)
// 计算该view的宽度
if (widthMode == MeasureSpec.EXACTLY) {
<span style="white-space:pre"> </span>width = widthSize;
} else {
// 当大小不确定时就设置为屏幕的宽度
width = screenWidth;
}</span>当在XML中设置的layout_width是确定的话,那么width=widthSize,否则width=screenWidth也就是屏幕的宽度。
计算宽度height:

上图即为每一个条目的内容

情况一:layout_height是设置了wrap_content

需要根据外部设置的setContentList()来计算需要展示内容的高度,让控件height自适应于需要展示的内容的高度。

情况二:layout_height是设置了match_parent

在本项目中,layout_height是设置了wrap_content还是match_parent都让其

<span style="font-size:14px;">@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

lineHeights.clear();
bitmaps.clear();
for (int i = 0; i < mDatas.size(); i++) {
Bean bean = mDatas.get(i);
// 获取左边显示的图片
Bitmap bitmap = BitmapFactory.decodeResource(
mContext.getResources(), bean.resId);
int bitmapWidth = bitmap.getWidth();
int bitmapHeight = bitmap.getHeight();
// 得到文字在指定宽度下的高度
int titleHeight = getTextHeight(mTextPaint, bean.title, width
- getPaddingLeft() - getPaddingRight() - bitmapWidth);
// 得到文字的宽度
int contentHeight = getTextHeight(mTextPaint, bean.content, width
- getPaddingLeft() - getPaddingRight());
// 得到行高
float lineHeight = contentHeight
+ Math.max(bitmapHeight, titleHeight);

// 计算height
height += lineHeight;

// 保存数据
lineHeights.add(lineHeight);
bitmaps.add(bitmap);
}

if (heightMode == MeasureSpec.EXACTLY) {
height = heightSize;
}
setMeasuredDimension(width, height);
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: