Android Studio实现动画效果的主要方式
视图动画(包括补间动画Tween Animation)通过对View的视觉属性(透明度、缩放、旋转、位移)进行变换实现动画,不改变View的实际布局属性(如位置、大小),适用于简单的视觉效果。
视图动画支持四种基础变换,对应的XML标签及属性如下:
<translate>,属性包括fromXDelta/toXDelta(X轴起始/结束偏移量)、fromYDelta/toYDelta(Y轴起始/结束偏移量)、duration(持续时间,毫秒)。<scale>,属性包括fromXScale/toXScale(X轴起始/结束缩放比例)、fromYScale/toYScale(Y轴起始/结束缩放比例)、pivotX/pivotY(缩放中心点,默认为View中心)。<rotate>,属性包括fromDegrees(起始角度)、toDegrees(结束角度)、pivotX/pivotY(旋转中心点)。<alpha>,属性包括fromAlpha(起始透明度,0~1)、toAlpha(结束透明度,0~1)、duration。示例:创建一个平移动画(res/anim/move.xml):
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="200"
android:duration="1000"/>
res/anim目录下创建动画文件(如move.xml),通过AnimationUtils.loadAnimation()加载。startAnimation()方法。// 加载动画
Animation moveAnim = AnimationUtils.loadAnimation(this, R.anim.move);
// 绑定并启动动画
View myView = findViewById(R.id.my_view);
myView.startAnimation(moveAnim);
帧动画通过快速切换多张图片实现连续动画,属于视图动画的特殊类型。需在res/drawable下创建XML文件(animation-list),设置item的drawable(图片资源)和duration(每帧显示时间),然后通过AnimationDrawable控制播放。
示例:帧动画XML(res/drawable/frame_anim.xml):
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false"> <!-- oneshot=false表示循环播放 -->
<item android:drawable="@drawable/frame1" android:duration="100"/>
<item android:drawable="@drawable/frame2" android:duration="100"/>
</animation-list>
代码控制:
ImageView imageView = findViewById(R.id.imageView);
imageView.setBackgroundResource(R.drawable.frame_anim);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start(); // 启动动画
属性动画通过修改对象的属性值实现动画,支持任意对象(不仅是View),灵活性更强。核心类包括ObjectAnimator(单属性动画)、ValueAnimator(数值动画)、AnimatorSet(动画集合)。
ObjectAnimator:直接修改对象属性,语法为ObjectAnimator.ofXxx(target, propertyName, values)。
// 示例:View向右平移300像素
ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "translationX", 0f, 300f);
animator.setDuration(1000); // 持续1秒
animator.start();
ValueAnimator:仅生成数值,需通过AnimatorUpdateListener手动更新属性。
// 示例:背景色从红到蓝渐变
ValueAnimator colorAnim = ValueAnimator.ofInt(0xFFFF8080, 0xFF8080FF);
colorAnim.setDuration(3000);
colorAnim.addUpdateListener(animation -> {
int color = (int) animation.getAnimatedValue();
myView.setBackgroundColor(color);
});
colorAnim.start();
AnimatorSet:组合多个动画,支持同时(playTogether)或顺序(playSequentially)播放。
// 示例:同时执行旋转、缩放、透明度动画
AnimatorSet set = new AnimatorSet();
set.playTogether(
ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f),
ObjectAnimator.ofFloat(myView, "scaleX", 1f, 1.5f),
ObjectAnimator.ofFloat(myView, "alpha", 1f, 0.5f)
);
set.setDuration(2000);
set.start();
重复播放:setRepeatCount(int count)(INFINITE表示无限循环)、setRepeatMode(int mode)(RESTART重新开始、REVERSE反向播放)。
animator.setRepeatCount(ObjectAnimator.INFINITE);
animator.setRepeatMode(ObjectAnimator.REVERSE);
插值器(Interpolator):控制动画速率,如AccelerateDecelerateInterpolator(先加速后减速)、BounceInterpolator(弹跳效果)。
animator.setInterpolator(new BounceInterpolator());
Transition框架用于实现Activity/Fragment之间的平滑过渡,或View的布局变化动画(如展开/折叠)。核心类包括TransitionManager、Fade(淡入淡出)、Slide(滑动)等。
示例:Activity淡入淡出过渡
// 在目标Activity的onCreate()中
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
setContentView(R.layout.activity_second);
// 创建淡入过渡
Transition transition = new Fade();
TransitionManager.beginDelayedTransition(rootLayout, transition); // rootLayout为父布局
示例:View展开动画
// 初始状态:View高度为0
View myView = findViewById(R.id.my_view);
ViewGroup.LayoutParams params = myView.getLayoutParams();
params.height = 0;
myView.setLayoutParams(params);
// 创建展开过渡
Transition transition = new Expand();
TransitionManager.beginDelayedTransition(rootLayout, transition);
// 最终状态:View高度为MATCH_PARENT
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
myView.setLayoutParams(params);
通过AnimationListener(视图动画)或AnimatorListener(属性动画)监听动画状态,实现动画开始、结束、重复时的逻辑。
示例:视图动画监听
Animation.AnimationListener listener = new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.d("Animation", "开始");
}
@Override
public void onAnimationEnd(Animation animation) {
Log.d("Animation", "结束");
}
@Override
public void onAnimationRepeat(Animation animation) {
Log.d("Animation", "重复");
}
};
myView.getAnimation().setAnimationListener(listener);
示例:属性动画监听
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.d("Animator", "开始");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.d("Animator", "结束");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.d("Animator", "取消");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.d("Animator", "重复");
}
});
以上是Android Studio中实现动画的主要方式,开发者可根据需求选择合适的方法(如简单视觉效果用视图动画,复杂属性变化用属性动画,页面过渡用Transition框架)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。