简介:

由于界面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-带过渡动画的折叠收缩布局相关推荐

  1. android小球爆炸动画,自定义View抛物线爆炸动画

    一.最近在写商城方面的业务,需求在商品加如购物车过程中,实现一个抛物线加入的动画. 先看我写的效果图: ezgif.com-video-to-gif (3).gif 二.编写前的设计思路是: Imag ...

  2. android view 渐变动画,Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

  3. android刷新时的圆形动画_Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

  4. Android自定义view之围棋动画

    Android自定义view之围棋动画 好久不见,最近公众号内粉丝要求上新一篇有点难度的自定义view文章,所以它来了!! 干货文,建议收藏 文章目录 Android自定义view之围棋动画 前言 完 ...

  5. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  6. android录音波浪动画_Android自定义View实现波浪动画

    本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...

  7. [Android]自定义View带效果的滚动数字

    [Android]自定义View带效果的滚动数字 @Author GQ 2016年07月29日 一个可以让数字滚动的View,可以自定义参数,是想要的那种效果! 原文github地址 效果图 Andr ...

  8. Android模仿淘宝语音输入条形动画,录音动画自定义View

    Android模仿淘宝语音输入条形动画自定义View,类似柱状音频,折线音频,音乐跳动,音频跳动,录音动画,语音输入效果 地址: https://github.com/xfans/VoiceWaveV ...

  9. 【自定义View】洋葱数学同款阴影布局-ShadowLayout

    开箱即用的源码地址 洋葱数学同款阴影布局-ShadowLayout 支持自定义属性: sl_shadowRadius:阴影的发散距离 sl_shadowColor:阴影的颜色 sl_dx:阴影左右偏移 ...

  10. uniapp实现带过渡动画的手风琴折叠样式

    目录 最终效果 一.无过渡动画的手风琴 二.有过渡动画的手风琴 1. 不能再用v-if或v-show 2. 用:class动态绑定样式 3. 子元素也要设置transition 最终效果 UI同学让做 ...

最新文章

  1. [007]C++---写一个函数,返回它自己
  2. iOS 仿通讯录索引
  3. Django-HttpResponse、render,、redirect(转载)
  4. 有效处理 Java 异常三原则
  5. 漫话:为什么计算机起始时间是1970年1月1日?
  6. UC浏览器云标签怎么用 UC浏览器云标签使用方法
  7. vue中ast生成render
  8. iOS开发之UIAlertController的使用
  9. 趋势:指数基金如何做大做强?
  10. Jmeter压力测试实例
  11. PDF怎么编辑修改内容
  12. Greenplum5.9.0简单使用
  13. 中国 / 省市区县 / 四级联动 / 地址选择器(京东商城地址选择)
  14. Hive创建表的几种方式
  15. c3p0plugin mysql,四十八、5.12 多数据源支持
  16. 提高抗打击能力_怎么有效提高自身的抗打击能力?
  17. 极狐GitLab CI 月来袭!2小时 get CI 流水线设计秘籍
  18. JAVA中 什么是方法签名?
  19. C语言基础——%X(十六进制)的几种不同输出格式
  20. android USB连接电脑只充电问题

热门文章

  1. vue3+ts使用app.config.globalProperties全局挂载实例方法,扩展模块解决ts类型检查报错
  2. 数电加一取补与取补减一
  3. 什么是promise?什么是回调函数?
  4. mysql like带字符串_(转)MySQL数据表中带LIKE的字符匹配查询
  5. lxml解析html报错
  6. kepserver的url_kepserver中文手册,kepserver使用教程,kepserver设置
  7. 高雅有趣的Wolfram Mathematica导入篇:绘声绘色的程序语言
  8. 业火燃尽这片幽暗荒野 世界终将翻开新一页
  9. Qt样式表(QSS)Demo:黑色扁平加渐变
  10. 机器学习——神经网络(Neural Network)