动画背景
我在学习 android 动画的时候是直接使用属性动画的, 但是还是要对 android 之前的动画有必要了解。
参考资料:Android属性动画完全解析(上),初识属性动画的基本用法
逐帧动画
补间动画
- 在 android.view.animation 包下面有很多类供我们操作,来完成 View 的一系列效果,比如说移动、旋转、缩放、淡入淡出, 但是这一切都是基于 View 的,可以对 Button、TextView、LinearLayout进行操作,如果对非 View 进行操作的时候,补间动画明显不能胜任。所以在这个时候引入了属性动画。
- 并且虽然移动、旋转、缩放、淡入淡出可以满足我们大多数要求,但是一旦超出了这些操作,补间动画就不能再提供帮助, 所以使用属性动画的好处就是可以进行拓展
- 其中还有一点比较重要的是补间动画只是对 View 的重新绘制。
比如将一个 Button 从左上角移动到右下角,然后再对 Button 进行点击, 但实际上并不会产生点击效果,所以对动画的选择上,我们要明确需求然后选择动画。
属性动画
ValueAnimator
ValueAnimator 是整个属性动画机制中比较重要的一个类, 属性动画的运行机制是通过不断的对值进行操作来实现的,而初始值和结束值之间的动画就是由 ValueAnimator 这个类进行计算的,他的内部使用时间循环机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给 ValueAnimator,并且告诉它动画所需时间,就会自动完成过渡。并且 ValueAnumator 还负责管理动画的播放次数,播放模式,以及对动画设置监听。
ObjectAnimator
ObiectAnimator 相比起 ValueAnimator 更经常使用。因为 ObjectAnimator 可以直接对任意对象任意属性进行操作, 具体操作通过下面的小例子学习。
ImageView 3D 翻转
- 提醒大家一下,在做 ImageView 翻转的时候不要选择太大的图片,否则会出现明显的卡顿
图片适合手机分辨率就好
我们实现的效果如图所示
因为这是用模拟器演示的会有明显卡顿,用真机效果更好
相信学习到 android 动画的基础已经掌握,所以这里只说要点(^-^)V
//声明控件
private void initView(){
imageViewA = (ImageView) findViewById(R.id.imageViewA);
imageViewB = (ImageView) findViewById(R.id.imageViewB);
imageViewA.setOnClickListener(this);
imageViewB.setOnClickListener(this);
//避免第一次翻转的时候漏出下面的 imageViewB, 所以先将 imageViewB 隐藏起来
imageViewB.setVisibility(View.INVISIBLE);
}
在这里直接放点击 imageViewA 后的事件
case R.id.imageViewA:
//第一个动画是将 imageViewA 翻转到一半
ObjectAnimator objectAnimatorHideA = ObjectAnimator.ofFloat(imageViewA, "rotationY", 0, -90);
AnimatorSet animatorSet1 = new AnimatorSet();
animatorSet1.setDuration(1000);
animatorSet1.play(objectAnimatorHideA);
animatorSet1.start();
//设置动画监听事件,在翻转到一半结束后才能放接下来的动画
animatorSet1.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
//将翻转到一半的 imageViewA 隐藏起来 并将准备显示的 imageViewB 显示出来
imageViewA.setVisibility(View.INVISIBLE);
imageViewB.setVisibility(View.VISIBLE);
ObjectAnimator objectAnimatorRegainA = ObjectAnimator.ofFloat(imageViewA, "rotationY", -90, 0);
ObjectAnimator objectAnimatorShowB = ObjectAnimator.ofFloat(imageViewB, "rotationY", 90, 0);
AnimatorSet animatorSet2 = new AnimatorSet();
animatorSet2.setDuration(1000);
/*
* 将准备的两个动画一起播放,objectAnimatorRegainA 是用来翻转归位的
* 这就是属性动画的特点,改变了 View 的属性
* 因为 imageViewA 是隐藏起来的,所以只能看到 imageViewB 翻转过来;
*/
animatorSet2.play(objectAnimatorShowB).with(objectAnimatorRegainA);
animatorSet2.start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
break;
git源码下载
imageViewB 也是如此, 这样我们的 ImageView 3D 翻转就大功告成了
这是我学习做 3D 翻转的时候用到的,写 Blog 是为了巩固知识,加深逻辑,顺便查漏补缺
因为博主水平有限,有什么可以改进的地方可以给我留言~(~ ̄▽ ̄)~
本文介绍了在Android中实现ImageView的3D翻转动画,包括动画背景、逐帧动画、补间动画和属性动画的使用。重点讲解了ValueAnimator和ObjectAnimator在属性动画中的作用,以及如何实现点击后ImageView的3D翻转效果,提供了源码下载链接,旨在巩固和分享Android动画面知识。
504

被折叠的 条评论
为什么被折叠?



