Android动画系列

博客导航:

         

Android user_rotation 无效 android:rotation_ide

1.介绍:

在接下来的不断地学习Android动画期间,会总结相关知识点。旋转动画是Android补间动画中的其中一种,本篇博客主要总结了旋转动画的属性、实现方式、相关方法和一个小案例的实现。

2.属性

 

duration

动画执行的时间

pivotX

旋转中心点的X轴坐标,50%。浮点数或是百分比,浮点数和百分比都是表示距离Object的左边缘,如5、5%。还有一种百分比是相对于父容器的左边缘,如5%p。一般50%表示正中心。

pivotY

旋转中心点的Y轴坐标,50%。同上。

repeatCount

重复次数,无数循环,可以设置为infinite或是-1,表示无限的。

repeatMode

重复运行的模式,默认为restart,每次重复从头开始。可以设置为reverse,表示结束开始之后向前重复运行。

fromDegrees

开始角度位置0。

toDegrees

结束角度位置,正数表示顺时针,负数表示逆时针。

detachWallpaper

表示是否在壁纸上运行

zAdjustment

表示被animated的内容在运行时在z轴上的位置,默认为normal。normal保持内容当前的z轴顺序、top运行时在最顶层显示、bottom运行时在最底层显示

 

 

 

 

 

 

 

 

 

 

 

 

3.实现方式

3.1 xml方式

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="1000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="-1"
        android:repeatMode="restart"
        android:fromDegrees="0"
        android:toDegrees="359"></rotate>
</rotate>

3.2 代码方式实现

Animation rotate = new RotateAnimation(0f, 359f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        LinearInterpolator lin = new LinearInterpolator();
        rotate.setInterpolator(lin); //设置插值器
        rotate.setDuration(1000);//设置动画持续周期
        rotate.setRepeatCount(-1);//设置重复次数
        rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态

4.动画的监听事件

animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始回调方法
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //动画结束
                rotate_img.clearAnimation();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //动画重复执行
            }
        });

5.方法解释

setInterpolator

设置动画的旋转速率:LinearInterpolator为匀速、Accelerateinterpolator为加速效果、DecelerateInterpolator为减速效果、默认为开始结束慢中间快。

setStartOffset

表示执行start函数后等待开始运行的时间,单位为ms。

6.案例实现

6.1 Activity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/home_id"
    android:background="#fff"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.menglong.animatordemo.MainActivity">

    <Button
        android:id="@+id/rotate_but"
        android:text="旋转"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/rotate_img"
        android:layout_centerInParent="true"
        android:src="@mipmap/ic_launcher"
        android:layout_width="200px"
        android:layout_height="300px" />

</RelativeLayout>

6.2 Activity代码实现

package com.menglong.animatordemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity implements View.OnClickListener {

    private ImageView rotate_img;
    private Animation animation;
    private Button rotate_but;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        rotate_img = (ImageView) findViewById(R.id.rotate_img);
        rotate_but = (Button) findViewById(R.id.rotate_but);
        rotate_but.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        //xml文件实现方式
        xml();
        //代码实现方式
//        code();
    }

    private void code() {
        Animation rotate = new RotateAnimation(0f, 359f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        LinearInterpolator lin = new LinearInterpolator();
        rotate.setInterpolator(lin); //设置插值器
        rotate.setDuration(1000);//设置动画持续周期
        rotate.setRepeatCount(-1);//设置重复次数
        rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
//        rotate.setStartOffset(1000);//执行前的等待时间  单位ms
        rotate_img.setAnimation(rotate);
        rotate_img.startAnimation(rotate);
    }

    private void xml() {
        //xml文件动画执行
        animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
        //setInterpolator设置动画的旋转速率:LinearInterpolator为匀速
        //另:Accelerateinterpolator为加速效果、DecelerateInterpolator为减速效果、默认为开始结束慢中间快。
        LinearInterpolator lin = new LinearInterpolator();
        animation.setInterpolator(lin);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                //动画开始回调方法
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //动画结束
                rotate_img.clearAnimation();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
                //动画重复执行
            }
        });
        rotate_img.startAnimation(animation);
    }
}

6.3 rotate_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="1000"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="-1"
        android:repeatMode="restart"
        android:fromDegrees="0"
        android:toDegrees="359"></rotate>
</rotate>

 

7.案例效果展示

                                                      

Android user_rotation 无效 android:rotation_android_02

8.项目地址

https://github.com/SunMengLong/AnimatorDemo