android 实现控件搜索折叠效果 Animation动画折叠和普通控件直接折叠效果;

原理很简单,都是获取对应的高度,通过实现高度变化而改变显示效果;

话不多说直接上代码

1、普通折叠效果,以下是xml

<?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"><LinearLayoutandroid:id="@+id/Layout_top"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:id="@+id/Layout_btn"android:layout_width="match_parent"android:layout_height="50dp"android:layout_alignParentTop="true"android:layout_gravity="top"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_fold_all"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="全部折叠" /><Buttonandroid:id="@+id/btn_expand_all"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="全部展开" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="match_parent"android:layout_height="10dp"android:background="@drawable/textview_border" /></LinearLayout><LinearLayoutandroid:id="@+id/Layout_all"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:id="@+id/top_Layout"android:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_fold"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="折叠1" /><Buttonandroid:id="@+id/btn_expand"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="展开1" /></LinearLayout><LinearLayoutandroid:id="@+id/Layout_vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="btn1" /><Buttonandroid:id="@+id/btn2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="btn1" /><Buttonandroid:id="@+id/btn3"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="btn3" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="match_parent"android:layout_height="10dp"android:background="@drawable/textview_border" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_fold2"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="折叠2" /><Buttonandroid:id="@+id/btn_expand2"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="展开2" /></LinearLayout><LinearLayoutandroid:id="@+id/Layout_vertical2"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><Buttonandroid:id="@+id/btn4"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="btn4" /><Buttonandroid:id="@+id/btn5"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="btn5" /><Buttonandroid:id="@+id/btn6"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="btn6" /></LinearLayout></LinearLayout></LinearLayout>
</LinearLayout>

普通折叠的activity代码

package com.example.foldingeffectdemo;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;import com.example.foldingeffectdemo.Utilits.LogUtilits;import java.util.Timer;
import java.util.TimerTask;public class LayoutParamsActivity extends AppCompatActivity implements View.OnClickListener {private LinearLayout.LayoutParams mLayoutParams;private LinearLayout layoutAll;private LinearLayout layoutVertical;private LinearLayout layoutVertical2;private Button btnFold;private Button btnExpand;private Button btnFold2;private Button btnExpand2;private Button btnFoldAll;private Button btnExpandAll;private static final int HEIGHT_1 = 1;private int layoutVerticaHeight = 0;private int layoutVertical2Height = 0;private int layoutAllHeight = 0;private Timer timer = new Timer();TimerTask task = new TimerTask() {public void run() {Message message = new Message();message.what = 1;mHandler.sendMessage(message);}};@SuppressLint("HandlerLeak")Handler mHandler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);if (msg.what == 1) {getParameter();}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_layout_params);initView();initListener();timerSchedule();}private void initView() {btnFoldAll = findViewById(R.id.btn_fold_all);btnExpandAll = findViewById(R.id.btn_expand_all);layoutAll = findViewById(R.id.Layout_all);btnFold = findViewById(R.id.btn_fold);btnExpand = findViewById(R.id.btn_expand);layoutVertical = findViewById(R.id.Layout_vertical);btnFold2 = findViewById(R.id.btn_fold2);btnExpand2 = findViewById(R.id.btn_expand2);layoutVertical2 = findViewById(R.id.Layout_vertical2);}private void initListener() {btnFoldAll.setOnClickListener(this);btnExpandAll.setOnClickListener(this);btnFold.setOnClickListener(this);btnExpand.setOnClickListener(this);btnFold2.setOnClickListener(this);btnExpand2.setOnClickListener(this);}private void timerSchedule(){timer.schedule(task, 10, 500);}private void getParameter() {layoutAllHeight = layoutAll.getHeight();layoutVerticaHeight = layoutVertical.getHeight();layoutVertical2Height = layoutVertical2.getHeight();if (layoutAllHeight != 0 && layoutVerticaHeight != 0 && layoutVertical2Height != 0) {timer.cancel();}LogUtilits.LogErr("layoutAllHeight:" + layoutAllHeight);LogUtilits.LogErr("layoutVerticaHeight:" + layoutVerticaHeight);LogUtilits.LogErr("layoutVertical2Height:" + layoutVertical2Height);}@SuppressLint("NonConstantResourceId")@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_fold_all:foldAndExpand(layoutAll, HEIGHT_1);break;case R.id.btn_expand_all:foldAndExpand(layoutAll, layoutAllHeight);break;case R.id.btn_fold:foldAndExpand(layoutVertical, HEIGHT_1);break;case R.id.btn_expand:foldAndExpand(layoutVertical, layoutVerticaHeight);break;case R.id.btn_fold2:foldAndExpand(layoutVertical2, HEIGHT_1);break;case R.id.btn_expand2:foldAndExpand(layoutVertical2, layoutVertical2Height);break;}}private void foldAndExpand(LinearLayout mLinearLayout, int height) {mLayoutParams = (LinearLayout.LayoutParams) mLinearLayout.getLayoutParams();mLayoutParams.height = height;mLinearLayout.setLayoutParams(mLayoutParams);}
}

2、动画 Animation的实现折叠效果

以下是xml代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/layout_container"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:id="@+id/Layout_all"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><com.example.foldingeffectdemo.Utilits.FoldPanelLayoutandroid:id="@+id/pl_list"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:orientation="vertical"><LinearLayoutandroid:id="@+id/layout_list"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/tv_list"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/animation_textview_border"android:padding="10dp"android:text="list动画折叠"android:textSize="36dp" /><ListViewandroid:id="@+id/lv_list"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@id/tv_list"android:background="@android:color/white" /></LinearLayout></com.example.foldingeffectdemo.Utilits.FoldPanelLayout><com.example.foldingeffectdemo.Utilits.FoldPanelLayoutandroid:id="@+id/pl_control"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/purple_1"android:layout_marginTop="5dp"android:orientation="vertical"><LinearLayoutandroid:id="@+id/Layout_control"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/tv_control"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/animation_textview_border"android:padding="10dp"android:text="其他动画折叠"android:textSize="36dp" /><Buttonandroid:id="@+id/but1"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/button_border"android:text="btn1"android:textSize="24dp" /><Buttonandroid:id="@+id/but2"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/button_border"android:text="btn2"android:textSize="24dp" /><Buttonandroid:id="@+id/but3"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/button_border"android:text="btn3"android:textSize="24dp" /></LinearLayout></com.example.foldingeffectdemo.Utilits.FoldPanelLayout></LinearLayout></RelativeLayout>

以下是activity的代码

package com.example.foldingeffectdemo;import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.os.Bundle;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.example.foldingeffectdemo.Utilits.FoldPanelLayout;
import com.example.foldingeffectdemo.Utilits.LogUtilits;import java.util.Timer;
import java.util.TimerTask;public class AnimationActivity extends AppCompatActivity implements View.OnClickListener {private TextView tvList;private TextView tvControl;private ListView lvList;private LinearLayout llList;private FoldPanelLayout plList;private FoldPanelLayout plControl;private static final int EXPAND_WEEK = R.id.tv_list;private String[] listTestData = new String[5];private boolean isListCollapse = false;private boolean isConstorlCollapse = false;private static final int listExpandFlag = 0;private static final int controlExpandFlag = 1;private int plListHeight;private int plControlHeight;//动画时间private static final int ANIM_DURATION = 300;//要改变的属性,名称要与FoldPanelLayout中的set和get方法对应private static final String ANIM_PROPERTY = "panelHeight";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_animation);initView();initListener();setListTestData();}private void initView() {plList = findViewById(R.id.pl_list);plControl = findViewById(R.id.pl_control);tvList = findViewById(R.id.tv_list);tvControl = findViewById(R.id.tv_control);lvList = findViewById(R.id.lv_list);llList = findViewById(R.id.layout_list);}private void initListener() {tvList.setOnClickListener(this);tvControl.setOnClickListener(this);}private void setListTestData() {for (int i = 0; i < listTestData.length; i++) {listTestData[i] = "ListTestData   " + i;}lvList.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, listTestData));}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_list:if (isListCollapse) {expandLayout(listExpandFlag);isListCollapse = false;} else {collapseLayout(listExpandFlag);isListCollapse = true;}break;case R.id.tv_control:if (isConstorlCollapse) {expandLayout(controlExpandFlag);isConstorlCollapse = false;} else {collapseLayout(controlExpandFlag);isConstorlCollapse = true;}break;}}/*** 折叠** @param expandFlag*/private void collapseLayout(int expandFlag) {int startHeight = 0;if (expandFlag == listExpandFlag) {startHeight = plListHeight = plList.getHeight();} else {startHeight = plControlHeight = plControl.getHeight();}startAnimation(expandFlag,startHeight,tvList.getHeight());}/*** 展开** @param expandFlag*/private void expandLayout(int expandFlag) {int endHeight = 0;if (expandFlag == listExpandFlag) {endHeight = plListHeight;} else {endHeight = plControlHeight;}startAnimation(expandFlag,tvList.getHeight(),endHeight);}public class AnimUpdateListener implements ValueAnimator.AnimatorUpdateListener {ViewGroup vp;public AnimUpdateListener(ViewGroup vp) {this.vp = vp;}@Overridepublic void onAnimationUpdate(ValueAnimator arg0) {vp.getChildAt(0).getLayoutParams().height = (Integer) arg0.getAnimatedValue();}}private void startAnimation(int expandFlag, int start, int end) {ViewGroup expandVp = null;switch (expandFlag) {case listExpandFlag:expandVp = plList;break;case controlExpandFlag:expandVp = plControl;break;}ObjectAnimator anim = ObjectAnimator.ofInt(expandVp, ANIM_PROPERTY,start, end);anim.setDuration(ANIM_DURATION);anim.start();if (end > start) {// 如果是展开,则需要改变列表的高度anim.addUpdateListener(new AnimUpdateListener(expandVp));}}
}

demo链接:dandroid实现控件搜索折叠效果Animation动画折叠和普通折叠-Java文档类资源-CSDN下载android实现控件搜索折叠效果Animation动画折叠和普通控件直接折叠效果;原理很简更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/pizice/85482859

android 实现控件搜索折叠效果 Animation动画折叠和普通折叠相关推荐

  1. 【Android控件】呼吸效果的动画

    由于只是展示上的,就不需要使用属性动画.直接使用的补间动画,简单的动画. public class MainActivity extends Activity {private ImageView m ...

  2. android view控件的显示和隐藏动画效果

    // 显示动画 mShowAction = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO ...

  3. Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度

    Android AutoCompleteTextView 控件实现类似被搜索提示,效果如下 1.首先贴出布局代码 activity_main.xml: <?xml version="1 ...

  4. 一个帖子掌握android所有控件、ProgressBar 、Android 动画效果、SQLite、四大组件、Android多媒体(转...

    Android多媒体实例大汇集(源码,全)经过两个星期的多媒体学习,实现了一系列DEMO,几乎涵盖了Android中对媒体中的各个方面(当然底层除外). http://www.apkbus.com/a ...

  5. android触摸效果,Android开发进阶:仿MIUI12控件触摸反馈效果(下沉+倾斜)附源码...

    简单模仿了下MIUI12里控件的触摸反馈效果,转载请标明出处 效果简述 按压控件内圈区域,控件整体缩小,高度降低(阴影消失) 按压内圈 按压控件外圈区域,依据触摸点控件以中心为支点,向触摸点倾斜 按压 ...

  6. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  7. android课程表控件、悬浮窗、Todo应用、MVP框架、Kotlin完整项目源码

    Android精选源码 Android游戏2048 MVP Kotlin项目(RxJava+Rerotfit+OkHttp+Glide) Android基于自定义Span的富文本编辑器 android ...

  8. 日历控件的android代码,Android日历控件PickTime代码实例

    Android日历控件PickTime代码实例 发布时间:2020-10-03 16:05:51 来源:脚本之家 阅读:86 作者:手撕高达的村长 最近做项目,需要设置用户的生日,所以做这样一个功能. ...

  9. android 获取控件高度_安卓开发入门教程UI控件_ImageView

    什么是ImageView ImageView是用于显示图片的UI控件. 基础样例 1.展示本地图片 效果图 代码 <ImageViewandroid:layout_width="wra ...

最新文章

  1. html5拖动图像的关键字,6.7 拖放图像 - HTML5 Canvas 实战
  2. 批量处理word文件内容_用python批量提取word文件信息,导出到excel文件
  3. Linux 无法使用su
  4. WDK开发环境构建驱动程序入门、Windows驱动程序的Check Build和Free Build
  5. oracle+去括号,关于001 TK的几个问题,请大家一起讨论一下
  6. Ubuntu配置完全教程
  7. 23种设计模式[1]:单例模式
  8. Memcached内存管理机制浅析
  9. java recoed replay_easymock教程-record-replay-verify模型
  10. Codeforces Round #757 (Div. 2)ABCD1
  11. Google位置服务模板
  12. 技巧积累篇--Dashboard使用技巧
  13. ABAP clear、refresh、free的区别
  14. Unity3D坦克大战游戏开发——学习笔记(中)
  15. python做平面设计-Python系列干货之——Python与设计模式
  16. Dell戴尔笔记本电脑G15 5515 Ryzen Edition原装出厂Windows11系统恢复原厂oem系统
  17. C#在扩展桌面播放PPT并且无任务栏按钮
  18. PXC 配置笔记-从MySQL直接转成PXC集群
  19. [SWPU2019]伟大的侦探1
  20. 用Adobe Reader PDF阅读器来验证电子签名有效性

热门文章

  1. 监视Oracle ASM磁盘组上的空间使用情况(空闲和已用)
  2. Google新闻推荐系统
  3. Python中最全的窗口操作,如窗口最大化、最小化、窗口置顶、获取缩放比例等
  4. 【网络协议】互联网协议入门(一)
  5. 方舟服务器自动维护,明日方舟剿灭关卡积水潮窟地图分析 干员选择与站位推荐[多图]...
  6. 财政预算绩效优秀案例
  7. 线状图斑的平均宽计算
  8. Ubuntu22.04 VMWare Kernel Module Updater 失败
  9. swift版QQ音乐播放器(二)
  10. GLFore便携式声学成像仪G100功能