android_自定义折叠View

最近项目需求,为了节约空间显示更多的内容,需要做一个可以折叠的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>









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值