需求: 整个页面外层是套有可滑动ScrollView,中间有动态显示的GridView,用来显示常用的服务Icon,最终效果如下:
该需求支持以下两种特点: 1.最多显示两行文字; 2.多少文字都可以显示得出来,因为字体对应缩小了。
实现过程&遇到的问题:
1.因为GridView和ScrollView的滑动冲突问题,得重写GridView的onMeasure方法,使之支持嵌套在ScollView里面的时候,会直接全部渲染出来,而不用缓存机制。这样做的一个坏处是,如果有超级多item直接加载,会造成UI卡顿。
/**
* 重写onMeasure,让该GridView的高度永远是等于其所有item高度之和
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
2.ItemView里面是由ImageView和TextView组成,我当时想的做法是文字的高度用android:layout_height=“wrap_content”,这样就可以有多少字都可以动态显示多少字出来。若限定高度的话,就会出现文字过多的时候,后面的文字会显示不出来。
但是当我设置wrap_content的时候,文字超长的时候,就会出现如下图两个异常:
(1)异常一: 文字超过两行后,若超长的文字不是在GridView每行的最后一个Item,那么整个布局不会增大,但是文字会叠加到下面的Item上,如下图:
(2) 异常二: 文字超过两行后,若是在没每一行最后一个Item,那么会把整个这一行布局增大,但是最下面一行就会被挤出原先可视部分,此时怎么动态设置GridView的总高度都没用,如下图:
3.解决方法: 为了达到刚开始提的两个需求,目前想到的只能是当某个Item文字超长的时候,动态缩小文字的大小进行适配,处理的方法是利用8.0的兼容方法,用TextView的Autosizeing属性,如下代码,在Item布局的xml里面,加上app命名空间,以及固定TextView的高度,加入自动缩放的属性:
xmlns:app="http://schemas.android.com/apk/res-auto"
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_centerHorizontal="true"
android:gravity="center_horizontal"
android:textSize="12sp"
android:textColor="#9b9b9b"
android:maxLines="2"
app:autoSizeTextType="uniform"
app:autoSizeMinTextSize="5sp"
app:autoSizeMaxTextSize="12sp"
app:autoSizeStepGranularity="1sp"
/>
主要就是app:开头的这些属性和maxLine=2,具体效果就是开图的第一张图。
参考文章: https://www.cnblogs.com/plokmju/p/8268005.html
原创文章,欢迎转载,转载请注明:ifish.site
作者:JaydenZhou