ImageView 3D 翻转

本文介绍了在Android中实现ImageView的3D翻转动画,包括动画背景、逐帧动画、补间动画和属性动画的使用。重点讲解了ValueAnimator和ObjectAnimator在属性动画中的作用,以及如何实现点击后ImageView的3D翻转效果,提供了源码下载链接,旨在巩固和分享Android动画面知识。

动画背景

我在学习 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 翻转的时候不要选择太大的图片,否则会出现明显的卡顿
    图片适合手机分辨率就好

我们实现的效果如图所示
3D翻转
因为这是用模拟器演示的会有明显卡顿,用真机效果更好

相信学习到 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 是为了巩固知识,加深逻辑,顺便查漏补缺
因为博主水平有限,有什么可以改进的地方可以给我留言~(~ ̄▽ ̄)~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值