package com.application.zhangshi_app_android.ui.function; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.FrameLayout; import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.recyclerview.widget.LinearLayoutManager; import com.application.zhangshi_app_android.BR; import com.application.zhangshi_app_android.R; import com.application.zhangshi_app_android.adapter.OldSpouseRvAdapter; import com.application.zhangshi_app_android.databinding.ActivityMarriageBinding; import com.application.zhangshi_app_android.ui.DLBaseActivity; /** * @author Ljj * @date 2023.04.23. 23:23 * @desc 婚姻状况 Activity */ public class MarriageActivity extends DLBaseActivity { private OldSpouseRvAdapter adapter; @Override public int getLayoutId() { return R.layout.activity_marriage; } @Override public int getVariableId() { return BR.viewModel; } @Override public void initParam() { } @Override public void initView() { adapter = new OldSpouseRvAdapter(this); binding.rvPredecessor.setNestedScrollingEnabled(false); binding.rvPredecessor.setAdapter(adapter); final int SCROLL_THRESHOLD = 400; // 滑动阈值,按钮在滑动超过该阈值后开始根据超出阈值距离渐渐显示出来 final int SCROLL_DISTANCE = 400; // 按钮从隐藏到全部显示出来需要滑动的距离 binding.fabMoveToTop.setAlpha(0f); binding.nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { // 当滑动距离超过阈值一半时,开始慢慢显示按钮 if (scrollY >= SCROLL_THRESHOLD) { // 根据滑动距离设置按钮透明度 float alpha = Math.min(1.0f, (float) (scrollY - SCROLL_THRESHOLD) / SCROLL_DISTANCE); binding.fabMoveToTop.setAlpha(alpha); } else { binding.fabMoveToTop.setAlpha(0f); } } }); binding.fabMoveToTop.setOnClickListener(v -> { // 点击按钮返回顶部 binding.nestedScrollView.smoothScrollTo(0, 0); }); } @Override public void initData() { viewModel.getMarriageInfo(); } @Override public void initLiveDataObserve() { viewModel.getIsSpouseExpendedLiveData().observe(this, aBoolean -> { if (aBoolean){ binding.layoutTitleSpouse.setOnClickListener(view -> { collapseView(binding.cardSpouse,binding.layoutTitleSpouse); viewModel.getIsSpouseExpendedLiveData().setValue(false); }); }else { binding.layoutTitleSpouse.setOnClickListener(view -> { expendView(binding.cardSpouse); viewModel.getIsSpouseExpendedLiveData().setValue(true); }); } }); viewModel.getIsPredecessorExpendedLiveData().observe(this, aBoolean -> { if (aBoolean){ binding.layoutTitlePredecessor.setOnClickListener(view -> { collapseView(binding.cardPredecessor,binding.layoutTitlePredecessor); viewModel.getIsPredecessorExpendedLiveData().setValue(false); }); }else { binding.layoutTitlePredecessor.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { expendView(binding.cardPredecessor); viewModel.getIsPredecessorExpendedLiveData().setValue(true); } }); } }); viewModel.getIsProcreateExpendedLiveData().observe(this, aBoolean -> { if (aBoolean){ binding.layoutTitleProcreate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { collapseView(binding.cardProcreate,binding.layoutTitleProcreate); viewModel.getIsProcreateExpendedLiveData().setValue(false); } }); }else { binding.layoutTitleProcreate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { expendView(binding.cardProcreate); viewModel.getIsProcreateExpendedLiveData().setValue(true); } }); } }); viewModel.getInfoLiveData().observe(this, marriageInfoBean -> { if (marriageInfoBean != null){ if (marriageInfoBean.getOldSpouseList() == null || marriageInfoBean.getOldSpouseList().size() == 0) { binding.cardSpouse.setVisibility(View.GONE); }else { binding.cardSpouse.setVisibility(View.VISIBLE); adapter.setData(marriageInfoBean.getOldSpouseList()); } } }); } @Override protected void dataNull() { super.dataNull(); binding.layoutDataNull.setVisibility(View.VISIBLE); binding.nestedScrollView.setVisibility(View.GONE); } @Override protected void hide() { super.hide(); binding.layoutDataNull.setVisibility(View.GONE); binding.nestedScrollView.setVisibility(View.VISIBLE); } public void collapseView(View initialView,View collapsedView){ int initialHeight = initialView.getMeasuredHeight(); int collapsedHeight = collapsedView.getMeasuredHeight(); int distanceToCollapse = (int) (initialHeight - collapsedHeight); Animation a = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if (interpolatedTime == 1){ } initialView.getLayoutParams().height = (int) (initialHeight - (distanceToCollapse * interpolatedTime)); initialView.requestLayout(); } @Override public boolean willChangeBounds() { return true; } }; a.setDuration(500); initialView.startAnimation(a); } public void expendView(View initialView){ int initialHeight = initialView.getMeasuredHeight(); initialView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int targetHeight = initialView.getMeasuredHeight(); ValueAnimator animator = ValueAnimator.ofInt(initialHeight,targetHeight); animator.addUpdateListener(animation -> { initialView.getLayoutParams().height = (int) animation.getAnimatedValue(); initialView.requestLayout(); }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { initialView.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; initialView.setLayoutParams(initialView.getLayoutParams()); } }); animator.setDuration(500); animator.start(); } }