可伸缩的textview

在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。
实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。

public class MainActivity extends Activity {
    private String str = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (int i = 0; i < 200; i++) {
            str = str + i + "  ";
        }
        final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv);
        etv.setText(str);

        Button btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                boolean b = etv.getExpandablestatus();

                b = !b;
                etv.setExpandable(b);

            }
        });

    }

}

PhilExpandableTextView.java:

package com.ganchuanpu.ExpandableTextView;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableTextView extends TextView {

    // 最大行,默认显示3行
    private final int MAX = 3;
    // 完全展开需要的行数
    private int lines;

    private ExpandableTextView mExpandableTextView;

    private boolean expandablestatus = false;

    // 构造方法用两个参数的
    public ExpandableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mExpandableTextView = this;
        init();

    }

    private void init() {
        // 在view绘制之前的时候执行,在onDraw之前
        ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver();
        mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {

            @Override
            public boolean onPreDraw() {
                // 避免重复监听
                mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this);
                // 获得内容行数
                lines = getLineCount();

                return true;
            }
        });
        setExpandable(false);

    }
    // 是否展开或者收缩,
    // true,展开;
    // false,不展开

    public void setExpandable(boolean isExpand) {
        if (isExpand) {
            setMaxLines(lines + 1);
        } else
            setMaxLines(MAX);

        expandablestatus = isExpand;
    }

    public boolean getExpandablestatus() {
        return expandablestatus;
    }

}

时间: 2024-10-11 18:08:24

可伸缩的textview的相关文章

Android可伸缩布局-FlexboxLayout(支持RecyclerView集成)

Android可伸缩布局-FlexboxLayout(支持RecyclerView集成) 1 . 前言 前几天看到Google官方的博客介绍了Google开源的一个强大的布局-FlexboxLayout,看见第一眼我心里的想法是,卧槽,Android 居然有这么一个强大的布局.作为一个有好奇心的工程狮,当然第一时间就去试了试手,效果非常赞,因此这篇文章就介绍一下它的用法和最新版添加的一些特性(支持集成RecyclerView),Github地址:https://github.com/google

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

使用文本框TextView/EditText的开源库清单

在实际的开发中TextView和EditText是非常基本的控件.这两个控件的使用也是十分简单.而TextView/EditText的功能其实也是非常强大,例如简单的图文就可以使用TextView配合Spannable来实现,以及TextView的drawableTop属性. 而使用以下的这些库则可以帮我们很方便实现各种需求,例如标签云.支持各种字体.文本动画.富文本编辑框等等需求. AndroidTagGroup 一个漂亮的标签控件,可以动态添加和删除标签 https://github.com

android TextView实现滚动显示效果

在android中,如果设置了TextView控件为单行显示,且显示的文本太长的话,默认情况下会造成显示不全的情况,这种情况下我们需要设置该控件属性如下: <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" and

项目需求:自定义倒计时的TextView

现在这么一个需求: 我有一个ListView,每一个列表项 布局如上图,顶部一个大图片展示,中部一个音频播放,底部一个描述文字. 在这个界面,一次只能点击一个列表项的播放按钮,那么我直接在ListView所属的activity创建了唯一的一个MediaPlayer,然而,这不是问题,所有的音频方面的播放冲突都解决了 问题就在中部的音频播放,我需要点击左边的播放按钮,然后右边有一个剩余时间要跟随着变化,当然点击暂停的时候,剩余时间也要暂停 首先,这里运用了购物车功能的原理实现按钮的操作.Andro

android ListView条目中TextView隐藏到显示时的测量

觉得ExpendableListView挺好用,但是就是代码复杂了点,我一时半会理解不了,于是就直接自己写个效果来实现.先来看一下expendableListView中展开的动画效果: 然后我模仿此效果,建立如下的item布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent" andr

安卓给textView增加自定义的颜色

1:创建一个color.xml,然后把颜色填入 <?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color><!--白色 --> <color name="ivory">#FFFFF0</color><!--象牙色 -->

xml中定义个TextView控件及java代码中调用方法。

<TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/hello_world"         android:id="@+id/myTextView" /> TextView myTextView = (Text

使用代码为textview设置drawableLeft

xml中的textView中设置android:drawableLeft: <TextView android:id="@+id/bookTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:drawableLeft="@drawable/