Android可收缩/扩展的TextView
2015-11-30 12:03
423 查看
在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容。
这样的设计有一定的优越性,毕竟用户的时间有限,注意力和关注力也有限,在使用APP时候,用户需要在最短时间内尽可能快速浏览和查阅到更主要内容,而不是一大堆泛泛而谈的文字内容。
在Android原生的TextView的基础上,我自己写了一个可收缩/扩展的TextView:PhilExpandableTextView。
实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。
如下图:
一、测试的Java代码
1、mainActivity
2、ExpandableTextView(核心代码部分)
二、MainActivity.java需要的布局文件:
这样的设计有一定的优越性,毕竟用户的时间有限,注意力和关注力也有限,在使用APP时候,用户需要在最短时间内尽可能快速浏览和查阅到更主要内容,而不是一大堆泛泛而谈的文字内容。
在Android原生的TextView的基础上,我自己写了一个可收缩/扩展的TextView:PhilExpandableTextView。
实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。
如下图:
一、测试的Java代码
1、mainActivity
package com.hxzy.expandabletextview; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private String text_str = ""; private String buttonText1 = "显示全文"; private String buttonText2 = "收起"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 测试的字符串 for (int i = 0; i < 200; i++) { text_str = text_str + "" + i; } final ExpandableTextView text = (ExpandableTextView) findViewById(R.id.text); text.setText(text_str); final Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub boolean b = text.getExpandableStatus(); b = !b; text.setExpandalbe(b); // 设置按钮文本 if (b == false) { button.setText(buttonText1); } else { button.setText(buttonText2); } } }); } }
2、ExpandableTextView(核心代码部分)
package com.hxzy.expandabletextview; import android.content.Context; import android.util.AttributeSet; import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnDrawListener; import android.view.ViewTreeObserver.OnPreDrawListener; import android.widget.TextView; public class ExpandableTextView extends TextView{ // 最大的行,默认只显示3行 private final int MAX=3; // 如果完全伸展需要多少行? private int lines; private ExpandableTextView mExpandableTextView; // 标记当前TextView的展开/收缩状态 // true,已经展开 // false,以及收缩 private boolean expandableStatus=false; //构造函数用此下两个参数的 public ExpandableTextView(Context context, AttributeSet attrs) { super(context, attrs); mExpandableTextView=this; init(); } private void init() { // ViewTreeObserver View观察者,在View即将绘制但还未绘制的时候执行的,在onDraw之前 ViewTreeObserver mViewTreeObserver=this.getViewTreeObserver(); mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() { @Override public boolean onPreDraw() { // 避免重复监听 mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this); lines=getLineCount(); return true; } }); setExpandalbe(false); } // 是否展开或者收缩, // true,展开; // false,不展开 public void setExpandalbe(boolean isExpand){ if(isExpand){ setMaxLines(lines+1); }else{ setMaxLines(MAX); } expandableStatus=isExpand; } public boolean getExpandableStatus(){ return expandableStatus; } }
二、MainActivity.java需要的布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.hxzy.expandabletextview.MainActivity" > <com.hxzy.expandabletextview.ExpandableTextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:background="#03a9f4" ></com.hxzy.expandabletextview.ExpandableTextView> <Button android:id="@+id/button" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示全文" /> </RelativeLayout>
相关文章推荐
- Android学习指南之十四:Service详解及应用实例
- Android Bionic库
- Android去掉标题栏点菜单键程序崩溃
- Android的动画机制学习---Animation
- Android手机装不上软件的问题解决
- Android无线调试 ADBWIFI
- AndroidStudio 1.4升级到1.5后,peer not authenticated错误
- Android开发总结笔记 Loader(加载器) 1-2-13
- android.support.v7.internal.widget.ActionBarOverlayLayou
- Android窗口抖动和控件抖动
- 当一回Android Studio 2.0的小白鼠
- Android实现全屏显示几种方法
- MediaStore.Images.Media.insertImage 得到保存图片的原始路径
- android的surfaceview的用法
- Android进阶(二十一)创建Android虚拟机
- Android进阶(二十一)创建Android虚拟机
- Android------Mycalculator堆栈完整版(非实现多位操作)
- Android 开发者的 RxJava 详解
- android 项目不能在手机上运行,(解析包出错)(bin文件红叉)
- Android Studio开发环境建立aidl文件,生成相应的java文件