android_自定义折叠View
2016-04-21 15:16
483 查看
最近项目需求,为了节约空间显示更多的内容,需要做一个可以折叠的view,个人百度了许久没有合适的代码,最终还是自己自定义算了。效果图看到的只是初步的效果,在这里只是将功能实现了,具体的UI没有做调整,别见怪。
效果如下:录制的gif有点卡大家凑合着看,运行在自己的模拟器上是不会卡顿的。
如何使用:
a.在布局文件中引用
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都让其
效果如下:录制的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>
相关文章推荐
- Android实现View滑动的几种方式
- Android中IntentService与Service的区别
- Android之NDK开发
- android中常常使用shape来定义控件的一些显示属性
- Android getWidth和getMeasuredWidth的正解
- Android 身份证、车牌号验证工具类
- Android Studio设置或修改Android SDK路径
- android 文档路径获取
- Android最基本的异步网络请求框架
- Android学习第一课
- Android 手把手教您自定义ViewGroup(一)
- Android中占位符的使用
- 理解 Android M 中的Permissions
- 在Android中使用Android Ksoap2调用WebService
- Android 使用UncaughtExceptionHandler 类捕抓异常信息
- android 学习
- Android GPS状态改变与监听
- Android:Layout_weight的深刻理解
- 安卓活动(Activity)和碎片(Fragment)的生命周期
- 一起动手编写Android图片加载框架