android 布局收缩动画,自定义View-带过渡动画的折叠收缩布局
简介:
由于界面View.VISIBLE和View.GONE的动画太生硬,所以写了ExpandLayout类来平滑过渡。 基本思路,动态的设置布局的高度。
先上效果图:
expand.gif
核心动画效果代码
/**
* 切换动画实现
*/
private void animateToggle(long animationDuration) {
ValueAnimator heightAnimation = isExpand ?
ValueAnimator.ofFloat(0f, viewHeight) : ValueAnimator.ofFloat(viewHeight, 0f);
heightAnimation.setDuration(animationDuration / 2);
heightAnimation.setStartDelay(animationDuration / 2);
heightAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float val = (float) animation.getAnimatedValue();
setViewHeight(layoutView, (int) val);
}
});
heightAnimation.start();
}
使用:
布局文件中 (引入自定义View)
android:id="@+id/expandLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFF00"
android:clickable="true">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="15dp"
android:text="大辉儿: 这里是可收缩布局内部" />
java代码中 初始状态是否显示,toggleExpand切换折叠/展开状态
private ExpandLayout mExpandLayout;
public void initExpandView() {
mExpandLayout = (ExpandLayout) findViewById(R.id.expandLayout);
mExpandLayout.initExpand(false);//设定初始化折叠,默认展开
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mExpandLayout.toggleExpand();
}
});
}
下面是全部代码:
布局文件:
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="50dp">
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#32CD32"
android:text="点击展开/收缩" />
android:id="@+id/expandLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFF00"
android:clickable="true">
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="15dp"
android:text="大辉儿: 这里是可收缩布局内部" />
自定义View 伸缩布局类:
package com.p.h;
import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
/**
* Created by : Pan_Hui on
* Time: 2020/07/27 13:14
* 带过渡动画的折叠收缩布局
*/
public class ExpandLayout extends RelativeLayout {
public ExpandLayout(Context context) {
this(context, null);
}
public ExpandLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ExpandLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
private View layoutView;
private int viewHeight;
private boolean isExpand;
private long animationDuration;
private boolean lock;
private void initView() {
layoutView = this;
isExpand = true;
animationDuration = 300;
setViewDimensions();
}
/**
* @param isExpand 初始状态是否折叠
*/
public void initExpand(boolean isExpand) {
this.isExpand = isExpand;
setViewDimensions();
}
/**
* 设置动画时间
*
* @param animationDuration 动画时间
*/
public void setAnimationDuration(long animationDuration) {
this.animationDuration = animationDuration;
}
/**
* 获取subView的总高度
* View.post()的runnable对象中的方法会在View的measure、layout等事件后触发
*/
private void setViewDimensions() {
layoutView.post(new Runnable() {
@Override
public void run() {
if (viewHeight <= 0) {
viewHeight = layoutView.getMeasuredHeight();
}
setViewHeight(layoutView, isExpand ? viewHeight : 0);
}
});
}
public static void setViewHeight(View view, int height) {
final ViewGroup.LayoutParams params = view.getLayoutParams();
params.height = height;
view.requestLayout();
}
/**
* 切换动画实现
*/
private void animateToggle(long animationDuration) {
ValueAnimator heightAnimation = isExpand ?
ValueAnimator.ofFloat(0f, viewHeight) : ValueAnimator.ofFloat(viewHeight, 0f);
heightAnimation.setDuration(animationDuration / 2);
heightAnimation.setStartDelay(animationDuration / 2);
heightAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) (float) animation.getAnimatedValue();
setViewHeight(layoutView, value);
if (value == viewHeight || value == 0) {
lock = false;
}
}
});
heightAnimation.start();
lock = true;
}
public boolean isExpand() {
return isExpand;
}
/**
* 折叠view
*/
public void collapse() {
isExpand = false;
animateToggle(animationDuration);
}
/**
* 展开view
*/
public void expand() {
isExpand = true;
animateToggle(animationDuration);
}
public void toggleExpand() {
if (lock) {
return;
}
if (isExpand) {
collapse();
} else {
expand();
}
}
}
MainActivity中绑定使用自定义View
package com.p.h;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Button button;
private ExpandLayout mExpandLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
//初始化展开View
initExpandView();
}
public void initExpandView() {
mExpandLayout = (ExpandLayout) findViewById(R.id.expandLayout);
//初始状态是否折叠false 否 true 是
mExpandLayout.initExpand(false);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mExpandLayout.toggleExpand();
}
});
}
}
最近有点忙,没时间更新 抱歉~~~
android 布局收缩动画,自定义View-带过渡动画的折叠收缩布局相关推荐
- android小球爆炸动画,自定义View抛物线爆炸动画
一.最近在写商城方面的业务,需求在商品加如购物车过程中,实现一个抛物线加入的动画. 先看我写的效果图: ezgif.com-video-to-gif (3).gif 二.编写前的设计思路是: Imag ...
- android view 渐变动画,Android自定义view渐变圆形动画
本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...
- android刷新时的圆形动画_Android自定义view渐变圆形动画
本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...
- Android自定义view之围棋动画
Android自定义view之围棋动画 好久不见,最近公众号内粉丝要求上新一篇有点难度的自定义view文章,所以它来了!! 干货文,建议收藏 文章目录 Android自定义view之围棋动画 前言 完 ...
- android 自定义加载动画效果,Android自定义View实现loading动画加载效果
项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...
- android录音波浪动画_Android自定义View实现波浪动画
本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...
- [Android]自定义View带效果的滚动数字
[Android]自定义View带效果的滚动数字 @Author GQ 2016年07月29日 一个可以让数字滚动的View,可以自定义参数,是想要的那种效果! 原文github地址 效果图 Andr ...
- Android模仿淘宝语音输入条形动画,录音动画自定义View
Android模仿淘宝语音输入条形动画自定义View,类似柱状音频,折线音频,音乐跳动,音频跳动,录音动画,语音输入效果 地址: https://github.com/xfans/VoiceWaveV ...
- 【自定义View】洋葱数学同款阴影布局-ShadowLayout
开箱即用的源码地址 洋葱数学同款阴影布局-ShadowLayout 支持自定义属性: sl_shadowRadius:阴影的发散距离 sl_shadowColor:阴影的颜色 sl_dx:阴影左右偏移 ...
- uniapp实现带过渡动画的手风琴折叠样式
目录 最终效果 一.无过渡动画的手风琴 二.有过渡动画的手风琴 1. 不能再用v-if或v-show 2. 用:class动态绑定样式 3. 子元素也要设置transition 最终效果 UI同学让做 ...
最新文章
- [007]C++---写一个函数,返回它自己
- iOS 仿通讯录索引
- Django-HttpResponse、render,、redirect(转载)
- 有效处理 Java 异常三原则
- 漫话:为什么计算机起始时间是1970年1月1日?
- UC浏览器云标签怎么用 UC浏览器云标签使用方法
- vue中ast生成render
- iOS开发之UIAlertController的使用
- 趋势:指数基金如何做大做强?
- Jmeter压力测试实例
- PDF怎么编辑修改内容
- Greenplum5.9.0简单使用
- 中国 / 省市区县 / 四级联动 / 地址选择器(京东商城地址选择)
- Hive创建表的几种方式
- c3p0plugin mysql,四十八、5.12 多数据源支持
- 提高抗打击能力_怎么有效提高自身的抗打击能力?
- 极狐GitLab CI 月来袭!2小时 get CI 流水线设计秘籍
- JAVA中 什么是方法签名?
- C语言基础——%X(十六进制)的几种不同输出格式
- android USB连接电脑只充电问题
热门文章
- vue3+ts使用app.config.globalProperties全局挂载实例方法,扩展模块解决ts类型检查报错
- 数电加一取补与取补减一
- 什么是promise?什么是回调函数?
- mysql like带字符串_(转)MySQL数据表中带LIKE的字符匹配查询
- lxml解析html报错
- kepserver的url_kepserver中文手册,kepserver使用教程,kepserver设置
- 高雅有趣的Wolfram Mathematica导入篇:绘声绘色的程序语言
- 业火燃尽这片幽暗荒野 世界终将翻开新一页
- Qt样式表(QSS)Demo:黑色扁平加渐变
- 机器学习——神经网络(Neural Network)