Android实现带动画效果的可点击展开TextView
作者:u014620028 发布时间:2023-08-06 05:42:08
标签:Android,点击展开,TextView
本文为大家分享了Android实现带动画效果的可点击展开TextView 制作代码,效果图:
收起(默认)效果:
点击展开后的效果:
源码:
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/activity_main"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ScrollView
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f6f6f6"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="简介"
android:textColor="#000000"
android:textSize="20sp"/>
<TextView
android:id="@+id/tv_des"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#666666"
android:textSize="18sp"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_des_arrow"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentEnd="true"
android:background="@mipmap/arrow_down"/>
</RelativeLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
功能实现:
package com.cnfol.demo;
import android.animation.Animator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
public class MainActivity extends Activity implements View.OnClickListener {
private TextView tv_des;
private ImageView iv_des_arrow;
private boolean isExpandDes = false;//是否展开整个描述
private int minHeight = 0;
private int maxHeight = 0;
private ScrollView scrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scrollView = (ScrollView) findViewById(R.id.sv);
tv_des = (TextView) findViewById(R.id.tv_des);
tv_des.setOnClickListener(this);
iv_des_arrow = (ImageView) findViewById(R.id.iv_des_arrow);
iv_des_arrow.setOnClickListener(this);
String s = "中华人民共和国,简称中国,位于亚洲东部,太平洋西岸, 是工人阶级领导的、以工农联盟为基础的人民民主专政的社会主义国家。\n" +
"\n" +
"1949年(己丑年)10月1日成立, 以五星红旗为国旗, 《义勇军进行曲》为国歌, 国徽内容包括国旗、天安门、齿轮和麦稻穗, 首都北京, 省级行政区划为23个省、5个自治区、4个直辖市、2个特别行政区, 是一个以汉族为主体民族,由56个民族构成的统一多民族国家,汉族占总人口的91.51%。\n" +
"\n" +
"新中国成立后随即开展经济恢复与建设,1953年开始三大改造, 到1956年确立了社会主义制度,进入社会主义探索阶段。 文化大革命之后开始改革开放,逐步确立了中国特色社会主义制度。中国陆地面积约960万平方公里,大陆海岸线1.8万多千米,岛屿岸线1.4万多千米,内海和边海的水域面积约470多万平方千米。海域分布有大小岛屿7600多个,其中台湾岛最大,面积35798平方千米。同14国接壤,与8国海上相邻。中国是四大文明古国之一, 有着悠久的历史文化。是世界国土面积第三大的国家,世界第一大人口国家,与英、法、美、俄并为联合国安理会五大常任理事国。\n" +
"\n" +
"中国是世界第二大经济体,世界第一贸易大国,世界第一大外汇储备国, 世界第一大钢铁生产国和世界第一大农业国,世界第一大粮食总产量国以及世界上经济成长最快的国家之一。";
tv_des.setText(s);
tv_des.setMaxLines(3);
tv_des.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//一般用完之后,立即移除该监听
tv_des.getViewTreeObserver().removeGlobalOnLayoutListener(this);
minHeight = tv_des.getMeasuredHeight();//获取3行时候的高度
tv_des.setMaxLines(Integer.MAX_VALUE);//会全部显示内容
tv_des.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//一般用完之后,立即移除该监听
tv_des.getViewTreeObserver().removeGlobalOnLayoutListener(this);
maxHeight = tv_des.getMeasuredHeight();//获取总高度
if (minHeight == maxHeight) {
//最大高度和最小高度一样。说明设置的默认显示行数,已经可以把所有数据全部显示
iv_des_arrow.setVisibility(View.GONE);
}
tv_des.getLayoutParams().height = minHeight;
tv_des.requestLayout();//让tv_des显示为3行的高度
}
});
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_des:
case R.id.iv_des_arrow:
ValueAnimator desAnimator = null;
if (isExpandDes) {
desAnimator = ValueAnimator.ofInt(maxHeight, minHeight);
} else {
desAnimator = ValueAnimator.ofInt(minHeight, maxHeight);
}
desAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
int currentHeight = (Integer) animator.getAnimatedValue();
tv_des.getLayoutParams().height = currentHeight;
tv_des.requestLayout();
//只有展开动画的时候才需要内容向上滚动,收缩动画的时候是不需要滚动的
if (!isExpandDes) {
int scrollY = currentHeight - minHeight;
scrollView.scrollBy(0, scrollY);
}
}
});
desAnimator.setDuration(300);
desAnimator.addListener(new DesAnimListener());
desAnimator.start();
break;
}
}
/**
* 描述区域动画的监听
*
* @author Administrator
*/
class DesAnimListener implements Animator.AnimatorListener {
@Override
public void onAnimationCancel(Animator arg0) {
}
@Override
public void onAnimationEnd(Animator arg0) {
isExpandDes = !isExpandDes;
iv_des_arrow.setBackgroundResource(isExpandDes ? R.mipmap.arrow_up : R.mipmap.arrow_down);
}
@Override
public void onAnimationRepeat(Animator arg0) {
}
@Override
public void onAnimationStart(Animator arg0) {
}
}
}
0
投稿
猜你喜欢
- 1. 并行和并发有什么区别?并行:多个处理器或多核处理器同时处理多个任务。并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执
- 具体代码如下所示:***web.xml***<?xml version="1.0" encoding="
- Android Build类的详解及简单实例一、类结构:java.lang.Object? android.os.Build二、类概述:从系
- SQLite是Android自带的关系型数据库,是一个基于文件的轻量级数据库。Android提供了3种操作数据的方式,SharedPrefe
- google benchmark已经为我们提供了类似的功能,而且使用相当简单。具体的解释在后面,我们先来看几个例子,我们人为制造几个时间复杂
- 对接前端后效果展示如图:1、CPU相关信息实体类/** * CPU相关信息 * * @author csp */public class
- Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效
- 本文实例为大家分享了opencv实现轮廓高斯滤波平滑的具体代码,供大家参考,具体内容如下一个小测试的题目:在图像上点选,找到与点选处相邻的颜
- 1、说明isInterrupted()可以判断当前线程是否被中断,仅仅是对interrupt()标识的一个判断,并不会影响标识发生任何改变(
- iOS定位 - 普通定位(没有地图) - 反地理编码(得到具体位置),下面通过代码给大家详解,代码如下:#import <CoreLo
- 本文实例为大家分享了Android实现支付宝支付密码输入界面的具体代码,供大家参考,具体内容如下效果图:主要代码:import java.u
- [LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子
- 因为mybatis好使,所以几乎需要操作数据库的时候,我都会使用mybatis,而且在一个正式的项目中,同时存在BS和CS的程序,都使用的M
- instanceof判断某个对象是否是某个类的实例或者某个类的子类的实例。它的判断方式大概是这样的:public<T> bool
- 过年微信红包很火,最近有个项目也要做抢红包,于是写了个红包的生成算法。红包生成算法的需求预先生成所有的红包还是一个请求随机生成一个红包简单来
- instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例。 举个例子:public
- 这篇文章需要对git具有一定的了解,并且知道如何安装git工具(其实就是上git官网下载个文件,安装)git这种版本控制工具有什么好处第一个
- 在使用struts多模块的,找到一些小技巧和经验,与大家分享一下。 关于多module的配置就不说了,只需要用不同的config
- 在实际应用中,我们往往有需要比较两个自定义对象大小的地方。而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我
- 具体可见http://developer.android.com/tools/debugging/ddms.html。 DDMS为IDE和e