android 动画效果

帧动画

首先是创建了一个开关 和一个imageview 用来完成帧动画切换

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <androidx.appcompat.widget.SwitchCompat
            android:id="@+id/sw_frame"
            android:layout_gravity="center"
            android:text="帧动画开关"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <ImageView
            android:layout_gravity="center"
            android:id="@+id/image_frame"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:background="@drawable/wifi_animation"
            />
</LinearLayout>

然后是在drawable文件下下创建帧动画的 animation-list用来放帧动画的图片 oneshot =false 循环执行 oneshot=true 执行一次 开关设置需要创建两个drawable 正序和倒序duration为每张图片的毫秒

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
  <item android:drawable="@drawable/draw1" android:duration="100"/>
  <item android:drawable="@drawable/draw2" android:duration="100"/>
  <item android:drawable="@drawable/draw3" android:duration="100"/>
  <item android:drawable="@drawable/draw4" android:duration="100"/>
  <item android:drawable="@drawable/draw5" android:duration="100"/>
  <item android:drawable="@drawable/draw6" android:duration="100"/>
</animation-list>

然后在Mainactivity 做开启动画操作 根据开关做正序 或倒序的帧动画

mImage_frame = findViewById(R.id.image_frame);
        mSwitch_frame = findViewById(R.id.sw_frame);
        //帧动画
        mSwitch_frame.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    mImage_frame.setBackgroundResource(R.drawable.wifi_animation);
                } else {
                    mImage_frame.setBackgroundResource(R.drawable.wifi_animation_un);
                }
                AnimationDrawable animationDrawable = (AnimationDrawable) mImage_frame.getBackground();
                animationDrawable.start();
            }
        });

属性动画

首先写了几个平移 旋转 渐变 Animator 添加了一个差值器

/**
     * @param propertyName 动画名称
     * @param values       值
     * @param time         响应时间
     * @return
     */
    private ObjectAnimator objectAnimator(String propertyName, int values, long time) {
        ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImage, propertyName, values);
        objectAnimator.setInterpolator(new LinearOutSlowInInterpolator());
        objectAnimator.setDuration(time);
        return objectAnimator;
    }

    /**
     * @param fromX
     * @param toX
     * @param fromY
     * @param toY
     * @param pivotX
     * @param pivotY
     * @param time         动画事件
     * @param pivotBoolean 标识
     * @return
     */
    private ScaleAnimation scaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY, long time, boolean pivotBoolean) {
        if (pivotBoolean) {
            ScaleAnimation scaleAnimation = new ScaleAnimation(fromX, toY, fromY, toY, pivotX, pivotY);
            // 设置动画播放的时间
            scaleAnimation.setInterpolator(new LinearOutSlowInInterpolator());
            scaleAnimation.setDuration(time);
            return scaleAnimation;
        } else {
            // 创建缩放的动画对象
            ScaleAnimation scaleAnimation = new ScaleAnimation(fromX, toX, fromY, toY);
            scaleAnimation.setInterpolator(new LinearOutSlowInInterpolator());
            // 设置动画播放的时间
            scaleAnimation.setDuration(time);
            return scaleAnimation;
        }
    }

    /**
     * @param fromAlpha 开始
     * @param toAlpha   结束
     * @param time      响应时间
     * @return
     */
    private AlphaAnimation alphaAnimation(float fromAlpha, float toAlpha, long time) {
        AlphaAnimation alphaAlphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
        alphaAlphaAnimation.setInterpolator(new LinearOutSlowInInterpolator());
        alphaAlphaAnimation.setDuration(time);
        return alphaAlphaAnimation;
    }

    /**
     * @param value1
     * @param value2
     * @param time
     * @return
     */
    private ValueAnimator valueAnimator(float value1, float value2, long time) {
        ValueAnimator animator = ValueAnimator.ofFloat(value1, value2);
        animator.setInterpolator(new LinearInterpolator());
        animator.setDuration(time);
        return animator;
    }

平移动画

//向右移动
objectAnimator("translationX", mImage.getWidth(), 2000).start();
//向下移动
objectAnimator("translationY", mImage.getWidth(), 2000).start();
//向左移动
objectAnimator("translationX", -mImage.getWidth() + mImage.getWidth(), 2000).start();
//向上移动
objectAnimator("translationX", -mImage.getWidth() + mImage.getWidth(), 2000).start();

旋转动画

//向右旋转
objectAnimator("rotation", mImage.getWidth(), 2000).start();
//向左旋转
objectAnimator("rotation", -mImage.getWidth(), 2000).start();
//上下向后旋转
objectAnimator("rotationX", mImage.getWidth(), 2000).start();
//上下向前旋转
objectAnimator("rotationX", -mImage.getWidth(), 2000).start();
//左右向右旋转
objectAnimator("rotationY", mImage.getWidth(), 2000).start();
//左右向左旋转
objectAnimator("rotationY", -mImage.getWidth(), 2000).start();

缩放动画

//从左上角开始缩放  
ScaleAnimation scaleAnimation = scaleAnimation(0f, 1.0f, 0f, 1.0f, 0f, 0f, 2000, false);
 mImage.startAnimation(scaleAnimation);
//从中心开始缩放 这里还设置了动画的执行次数和动画模式
 ScaleAnimation scaleAnimation = scaleAnimation(0f, 1.0f, 0f, 1.0f, mImage.getWidth() / 2, mImage.getHeight() / 2, 2000, true);
// 开始播放动画
mImage.startAnimation(scaleAnimation);
 //设置动画执行次数
 scaleAnimation.setRepeatCount(3);
  //设置动画模式
  scaleAnimation.setRepeatMode(ScaleAnimation.REVERSE);

渐变动画

//开启渐变 1-0.5 然后 0.5-1
 AlphaAnimation alphaAnimation = alphaAnimation(1f, 0.5f, 2000);
  mImage.startAnimation(alphaAnimation);
  AlphaAnimation alphaAnimation1 = alphaAnimation(0.5f, 1f, 2000);
  mImage.startAnimation(alphaAnimation1);
ValueAnimator
//ValueAnimator  提供产生一些规律的数字
        final Button btn_ValueAnimator_value = findViewById(R.id.btn_ValueAnimator_value);
        findViewById(R.id.btn_ValueAnimator).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ValueAnimator animator = valueAnimator(0, 10, 3000);
                animator.start();
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float animatedValue = (float) animation.getAnimatedValue();
                        btn_ValueAnimator_value.setText(animatedValue + "");
                    }
                });
                //提供了对事件监听的方法
                animator.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        //动画完成
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }

                });
            }
        });

最后就是AnimatorSet 组合动画

//组合动画
        findViewById(R.id.btn_AnimatorSet).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AnimatorSet animatorSet = new AnimatorSet();
                ObjectAnimator translationX = objectAnimator("translationX", mImage.getWidth(), 2000);
                ObjectAnimator rotationY = objectAnimator("rotationY", mImage.getWidth(), 2000);
                ObjectAnimator rotation = objectAnimator("rotation", mImage.getWidth(), 2000);
                animatorSet.setInterpolator(new LinearOutSlowInInterpolator());
                //方式
//                animatorSet.playTogether(translationX,rotationY,rotation);
                //方式
                /**
                 * 方式太多不一一列举
                 * after:现有的动画插入到传入的动画之后执行
                 * after:现有动画延迟指定毫秒后执行
                 * before:现有动画插入到传入的动画之前执行
                 * with :现有动画和传入的动画同时执行
                 */
                animatorSet.play(translationX).with(rotationY).after(rotation);
                animatorSet.setDuration(3000);
                animatorSet.start();
            }
        });

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值