Android开发:如何实现ImageView从上到下落动时缩小尺寸?
嘿,这个需求很常见嘛!你已经搞定了ImageView从上到下的下落动画,现在要加上同步缩小的效果,其实只要把位移动画和缩放动画同步执行就行,给你几个实用的实现方案:
核心思路
核心就是让「位移动画」和「缩放动画」在同一时间段内同时运行,保证下落和缩小的节奏一致。Android里有几种方式可以实现这种组合动画:
- 使用
AnimatorSet组合多个属性动画(推荐,因为属性动画更灵活,能直接修改View的属性,动画结束后状态会保留) - 使用XML动画集合(补间动画,适合简单场景)
- 自定义
ValueAnimator手动控制每个帧的属性变化(适合需要精细控制的复杂场景)
代码示例
方案1:XML动画集合(快速实现)
先在res/anim文件夹下创建fall_and_shrink.xml文件:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="800" android:interpolator="@android:anim/decelerate_interpolator" android:fillAfter="true"> <!-- 从上到下的位移动画:初始位置在屏幕顶部外,移动到目标位置(这里设为0,你可以根据需求调整) --> <translate android:fromYDelta="-100%p" android:toYDelta="0" /> <!-- 缩放动画:从原始大小缩小到目标比例,以View中心为缩放支点 --> <scale android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="0.5" android:toYScale="0.5" /> </set>
然后在代码中加载并启动动画:
val yourImageView = findViewById<ImageView>(R.id.your_image_view) val shrinkFallAnim = AnimationUtils.loadAnimation(this, R.anim.fall_and_shrink) yourImageView.startAnimation(shrinkFallAnim)
方案2:AnimatorSet属性动画(推荐,更可控)
属性动画可以直接修改View的真实属性,动画结束后不需要额外处理状态,而且能更精准地控制动画参数:
val yourImageView = findViewById<ImageView>(R.id.your_image_view) // 1. 创建位移动画:从View自身高度的负位置(顶部外)移动到屏幕底部附近 val screenHeight = Resources.getSystem().displayMetrics.heightPixels val targetY = screenHeight - yourImageView.height * 0.5f // 缩放后View高度变小,调整目标位置 val translateAnim = ObjectAnimator.ofFloat(yourImageView, "translationY", -yourImageView.height.toFloat(), targetY) // 2. 创建缩放动画:从1.0缩放到0.5,以View中心为支点 val scaleXAnim = ObjectAnimator.ofFloat(yourImageView, "scaleX", 1.0f, 0.5f) val scaleYAnim = ObjectAnimator.ofFloat(yourImageView, "scaleY", 1.0f, 0.5f) // 设置缩放支点为View中心 scaleXAnim.setPivotX(yourImageView.width / 2f) scaleYAnim.setPivotY(yourImageView.height / 2f) // 3. 组合动画,让三个动画同时执行 val animatorSet = AnimatorSet() animatorSet.playTogether(translateAnim, scaleXAnim, scaleYAnim) animatorSet.duration = 800 // 动画时长,单位毫秒 animatorSet.interpolator = DecelerateInterpolator() // 减速插值器,模拟自然下落的重力效果 // 启动动画 animatorSet.start()
关键注意事项
- 插值器选择:
DecelerateInterpolator会让动画开始快、结束慢,更符合现实中物体下落的物理效果;如果需要匀速运动,可以用LinearInterpolator。 - 目标位置计算:如果需要让View落到屏幕底部,记得根据缩放后的尺寸调整目标Y值,避免View被截断。
- 动画状态保留:XML补间动画需要设置
android:fillAfter="true"才能让View保持动画结束后的状态;属性动画默认会保留状态,不需要额外设置。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

