博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缩放文本框ExpandTextView
阅读量:5303 次
发布时间:2019-06-14

本文共 3727 字,大约阅读时间需要 12 分钟。

效果图:

这里写图片描写叙述

代码:

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属性,否则会异常

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; } }); }

转载于:https://www.cnblogs.com/brucemengbm/p/6992098.html

你可能感兴趣的文章
dedecms讲解-arc.listview.class.php分析,列表页展示
查看>>
Extjs6 经典版 combo下拉框数据的使用及动态传参
查看>>
【NodeJS】http-server.cmd
查看>>
研磨JavaScript系列(五):奇妙的对象
查看>>
面试题2
查看>>
selenium+java iframe定位
查看>>
P2P综述
查看>>
第五章 如何使用Burp Target
查看>>
Sprint阶段测试评分总结
查看>>
sqlite3经常使用命令&语法
查看>>
linux下编译openjdk8
查看>>
【python】--迭代器生成器装饰器
查看>>
Pow(x, n)
查看>>
安卓当中的线程和每秒刷一次
查看>>
每日一库:Modernizr.js,es5-shim.js,es5-safe.js
查看>>
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
TCL:表格(xls)中写入数据
查看>>
Oracle事务
查看>>