最近项目需求,为了节约空间显示更多的内容,需要做一个可以折叠的view,个人百度了许久没有合适的代码,最终还是自己自定义算了。效果图看到的只是初步的效果,在这里只是将功能实现了,具体的UI没有做调整,别见怪。
计算宽度height:
效果如下:录制的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>