缩放文本框ExpandTextView

效果图:

代码:

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * Created by pengkv on 16/1/11.
 */
public class ExpandTextView extends TextView implements View.OnClickListener {

    private int mMaxCount;//记录文本框的最大行数
    private boolean isSinleLine = true;//是否是单行显示
    private boolean isFitst = true;//是否是第一次測量

    public ExpandTextView(Context context) {
        super(context);
        setOnClickListener(this);
    }

    public ExpandTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnClickListener(this);
    }

    public ExpandTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setOnClickListener(this);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (isFitst) {//假设是第一次測量,记录最大行数。測量后设置成单行
            mMaxCount = getLineCount();
            setEllipsize(TextUtils.TruncateAt.END);
            setSingleLine();
            isFitst = false;
        }
    }

    @Override
    public void onClick(View v) {

        ValueAnimator animator;
        final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams();
        if (isSinleLine) {//设置展开动画的位移
            setSingleLine(false);
            animator = ValueAnimator.ofInt(getLineHeight(), mMaxCount * getLineHeight());
        } else {//设置收缩动画的位移
            animator = ValueAnimator.ofInt(mMaxCount * getLineHeight(), getLineHeight());
        }
        //属性动画的使用方法
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                params.height = (int) animation.getAnimatedValue();
                setLayoutParams(params);
            }
        });
        animator.setInterpolator(new DecelerateInterpolator());
        animator.setDuration(300);
        animator.setTarget(this);
        animator.start();

        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                if (!isSinleLine) {//在动画结束后设置成单行,避免效果异常
                    setSingleLine();
                }
                isSinleLine = !isSinleLine;
            }
        });
    }
}

XML使用:

//注意:不要在xml的view.ExpandTextView里面定义singleLine、ellipsize属性,否则会异常
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="@string/str1"
        android:textSize="18sp" />

    <view.ExpandTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="@string/str2"
        android:textColor="#edd206"
        android:textSize="18sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/str3"
        android:textSize="18sp" />

</LinearLayout>

Tip:

代码中涉及到的属性动画建议參考这里

优化:

//点击事件的处理能够换成以下这样的更简洁的方式。

    @Override
    public void onClick(View v) {

        final ObjectAnimator animator;
        if (isSinleLine) {
            setSingleLine(false);
            animator = ObjectAnimator.ofInt(this, "height", getLineHeight(), mMaxCount * getLineHeight());
        } else {
            animator = ObjectAnimator.ofInt(this, "height", mMaxCount * getLineHeight(), getLineHeight());
        }

        animator.setDuration(300).start();
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                if (!isSinleLine) {//在动画结束后设置成单行,避免效果异常
                    setSingleLine();
                }
                isSinleLine = !isSinleLine;
            }
        });
    }
时间: 2025-01-02 03:22:51

缩放文本框ExpandTextView的相关文章

取消谷歌 Chrome 文本框(域)外边框高亮和缩放功能的办法

首先一下是摘抄别的博友的,我遇到过这问题才找的,希望也能为其他的博友解决这问题. 浏览器一直以来挺喜欢用谷歌的Chrome,界面简洁,体积小,速度快.因为苹果Safari也是使用Webkit内核,因此他们有着类似的样式体现. 虽然有诸多优点,但也有好心办坏事的时候,比如对文本域.文本框的处理,首先对于文本域右下角会多出一个手动缩放尺寸的功能,然后会自动加上黄色的高亮边框显示,这种“人性化”处理,一般情况下是很不错的,但是对于前端开发来讲,有时候反而成了问题,比如你想精准控制文本框文本域的外观样式

文本框控件JTextField和JTextArea的使用

-----------------siwuxie095 工程名:TestUI 包名:com.siwuxie095.ui 类名:TestTextFieldAndTextArea.java 工程结构目录如下: 在 Design 的根面板 contentPane 的上中下分别添加 一个 JTextField.JTextArea.JButton JTextField 即 单行文本框,JTextArea 即 多行文本框 文本框是文本的编辑器,可以指定文本的初始数据 即默认文本(text), 可以指定文字的

&#167;2.1 最常用的控件------文本框(TextView)

文本框TextView是我们在安卓应用的界面开发中经常用到的一个控件,同时,它也是输入框(EditText)和按钮(Button)的父类 (输入框和按钮后面章节会有介绍) 作用:在页面上显示文字. 我们重新来看第一章节的那个"Hello World应用". 在layout/activity_main.xml布局文件代码如下: 1 <?xml version="1.0" encoding="utf-8"?> 2 <Relative

iOS_book 02 - 基本交互(约束、视图控制器、基本控件:按钮、文本框、分段控件、开关、标签、图像控件)

实现基本交互 MVC模式 Cocoa Touch 设计者们采用MVC(Model-View-Controller, 模型 - 视图 - 控制器)模式作为指导原则. MVC 模式把代码功能划分为3个不同的类别. 模型: 保存应用程序数据的类. 视图:包括窗口.控件以及其他一些用户可以看到并能与之交互的元素. 控制器:把模型和视图绑定在一起的代码,包括处理用户输入的应用程序逻辑. MVC的目标最大限度地分离这三类代码.MVC可以帮助确保代码的最大可重用性. 控制器组件通常有应用程序的具体类组成.控制

(转)完美解决 Android WebView 文本框获取焦点后自动放大有关问题

完美解决 Android WebView 文本框获取焦点后自动放大问题 前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本框聚焦时,网页面会放大(他们用三星手机测试的) 网上查了好久参考他的方法加上去测试 http://www.cppblog.com/guojingjia2006/archive/2012/12/18/196429.html 下面我将原文copy过来 **************************

Android基础入门教程——2.3.1 TextView(文本框)详解

Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是翻译API文档,不会一个个属性的去扣,只学实际开发中常用的,有用的,大家遇到感觉到陌生的属性可以查询对应的API!当然,每一节开始都会贴这一节对应API文档的链接:TextVie

完美解决 Android WebView 文本框获取焦点后自动放大问题

前几天在写一个项目时,要求在项目中嵌入一个WebView 本来很快就完成了,测试也没有问题.但发给新加坡时,他们测试都会出现文本框聚焦时,网页面会放大(他们用三星手机测试的) 网上查了好久参考他的方法加上去测试 http://www.cppblog.com/guojingjia2006/archive/2012/12/18/196429.html 下面我将原文copy过来 **************************************************************

禁止多行文本框textarea拖拽

禁止多行文本框textarea拖拽: textarea { resize: none; } resize这个是用于元素缩放,它可以取以下几个值: none 默认值 both 允许水平方向及垂直方向缩放 horizontal 只允许水平方向缩放 vertical 只允许垂直方向缩放

使用 CSS 去掉 iPhone 网页上按钮的超大圆角以及文本框圆角默认样式

使用 iPhone 上的浏览器去浏览网页的时候,按钮总是显示超大圆角且颜色由上而下渐变的样式,显得超级恶心,而且文本框也会有一定的圆角,但是我们自己定义 border-radius 也没有效果,经过搜索发现这是 webikt 内核浏览器通过私有属性 -webkit-appearance 对控件设置了默认样式.此时的解决办法为: input[type=submit],input[type=reset],input[type=button],input[type=text]{-webkit-appe