ConstraintLayout Guideline百分比动画实现求助(Java)
实现ConstraintLayout数字键盘滑入/滑出动画的正确姿势
首先得说,你这段代码的问题在于没有利用interpolatedTime来实现平滑过渡——直接把guidePercent设成固定值,动画自然不会有滑动效果。下面给你两种靠谱的实现方式,都是针对ConstraintLayout里的Guideline来做键盘滑入滑出的:
方法一:优化你的自定义Animation思路
你原来的方向是对的,但要把初始的guidePercent和目标值结合interpolatedTime计算过渡值。比如假设键盘隐藏时Guideline在屏幕外底部(1.0f),显示时停在屏幕内底部(0.7f):
// 先记录Guideline的初始位置 final float startPercent = guideline.getLayoutParams() instanceof ConstraintLayout.LayoutParams ? ((ConstraintLayout.LayoutParams) guideline.getLayoutParams()).guidePercent : 1.0f; final float targetPercent = 0.7f; // 键盘显示时的目标位置 Animation slideAnimation = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) guideline.getLayoutParams(); // 用插值时间计算当前的guidePercent,实现平滑过渡 params.guidePercent = startPercent + (targetPercent - startPercent) * interpolatedTime; guideline.setLayoutParams(params); } }; slideAnimation.setDuration(300); // 300ms足够流畅,不用3000这么久 slideAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); // 加个插值器让动画更自然 // 启动动画 guideline.startAnimation(slideAnimation);
如果是隐藏键盘,只需要把targetPercent设回1.0f就行。
方法二:用ConstraintLayout官方动画工具(更简洁)
ConstraintLayout本身提供了ConstraintSet和TransitionManager来做布局动画,代码更简洁,也更符合官方推荐的方式:
1. 定义键盘显示/隐藏的两种布局状态
你可以在代码里直接创建两个ConstraintSet,分别对应两种状态:
ConstraintLayout constraintLayout = findViewById(R.id.your_constraint_layout); // 获取当前布局的基础ConstraintSet ConstraintSet baseSet = new ConstraintSet(); baseSet.clone(constraintLayout); // 键盘显示状态:把Guideline移到屏幕内 ConstraintSet showKeyboardSet = new ConstraintSet(); showKeyboardSet.clone(constraintLayout); showKeyboardSet.setGuidelinePercent(R.id.keyboard_guideline, 0.7f); // 键盘隐藏状态:把Guideline移到屏幕外 ConstraintSet hideKeyboardSet = new ConstraintSet(); hideKeyboardSet.clone(constraintLayout); hideKeyboardSet.setGuidelinePercent(R.id.keyboard_guideline, 1.0f);
2. 切换状态时启动过渡动画
// 显示键盘 TransitionManager.beginDelayedTransition(constraintLayout, new AutoTransition()); showKeyboardSet.applyTo(constraintLayout); // 隐藏键盘 TransitionManager.beginDelayedTransition(constraintLayout, new AutoTransition()); hideKeyboardSet.applyTo(constraintLayout);
AutoTransition会自动处理布局变化的平滑过渡,你也可以自定义Transition来调整动画细节:
CustomTransition customTransition = new CustomTransition(); customTransition.setDuration(300); customTransition.setInterpolator(new DecelerateInterpolator()); TransitionManager.beginDelayedTransition(constraintLayout, customTransition);
额外小提示
- 如果要和系统软键盘联动,记得监听软键盘的显示/隐藏事件,再触发对应动画
- 动画时长建议设为300-500ms,太长会显得拖沓
- 用
AccelerateDecelerateInterpolator或者DecelerateInterpolator会让动画更符合用户操作直觉
内容的提问来源于stack exchange,提问作者Lysdexia
相关产品推荐
相关产品推荐

