Android绘制旋转动画方法详解

 更新时间:2022年01月06日 10:11:27   作者:吃橘子的季节呢  
这篇文章主要介绍了Android如何采用RotateAnimation绘制一个旋转动画,文中的实现方法讲解详细,感兴趣的小伙伴可以跟随小编一起试一试

1、准备工作

首先需要有一个用于旋转的图片

需要考虑如何开始、结束、加速、减速

2、加速减速原理

本次的动画采用RotateAnimation,初始化需要的参数如下

public RotateAnimation(float fromDegrees,float toDegrees,int pivotXType,float pivotXValue,int pivotYType, float pivotYValue) {
    mFromDegrees = fromDegrees;//开始角度
    mToDegrees = toDegrees;//结束角度
    mPivotXValue = pivotXValue;//确定x轴坐标的类型
    mPivotXType = pivotXType;//x轴的值,0.5f表明是以自身这个控件的一半长度为x轴
    mPivotYValue = pivotYValue;//确定y轴坐标的类型
    mPivotYType = pivotYType;//y轴的值,0.5f表明是以自身这个控件的一半长度为y轴
    initializePivotPoint();
}

所谓旋转动画,在本质上就是在如上的对象初始化之后,规定在一定的周期内旋转

所谓加速,本质上就是在设定好的周期内变换旋转角度

或者修改周期,在预设周期内旋转一定角度

总之,角度和周期一定会变化一个,就可以决定动画的快慢。

如: 从 2秒内旋转360度 到 1秒内旋转360度 就是一种加速,

从 2秒内旋转360度 到 2秒内旋转720度 也是一种加速。

反之就是减速。

3、初始化

RotateAnimation rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setInterpolator(new LinearInterpolator());
        rotate.setDuration(2000);//设置动画持续周期
        rotate.setRepeatCount(-1);//设置重复次数
//        rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
        rotate.setStartOffset(10);//执行前的等待时间

4、开始

start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fan.startAnimation(rotate);
            }
        });

5、加速

首先需要创建全局变量

private int duration=2000;

加速样例

accelerate.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View v) {
                if (duration>10){
                    duration/=2;				//周期除2角度不变加速(需要考虑极端,所以加一个判断)
                }
                rotate.setDuration(duration);	//设置周期
                fan.startAnimation(rotate);		//开始旋转
            }
        });

6、减速

decelerate.setOnClickListener(new View.OnClickListener() {
    @Override

    public void onClick(View v) {
        if (duration<10000){
            duration*=2;				//周期乘2角度不变减速(需要考虑极端,所以加一个判断)
        }
        rotate.setDuration(duration);	//设置周期
        fan.startAnimation(rotate);		//开始旋转
    }
});

7、停止

stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        fan.clearAnimation();            //停止
    }
});

8、项目源码

Layout部分

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#DEECFA"
    tools:context=".MainActivity">


    <RelativeLayout
        android:layout_centerHorizontal="true"
        android:layout_marginTop="100dp"
        android:id="@+id/relativeLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/border"
        tools:layout_editor_absoluteX="566dp"
        tools:layout_editor_absoluteY="132dp">
        <ImageView
            android:id="@+id/fan"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@mipmap/fan"
            tools:layout_editor_absoluteX="552dp"
            tools:layout_editor_absoluteY="122dp" />
    </RelativeLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="150dp">
        <Button
            android:id="@+id/start"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:background="@mipmap/border"
            android:text="开始"
            tools:layout_editor_absoluteX="525dp"
            tools:layout_editor_absoluteY="596dp" />
        <Button
            android:id="@+id/accelerate"
            android:layout_marginLeft="100dp"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:background="@mipmap/border"
            android:text="加速"
            tools:layout_editor_absoluteX="650dp"
            tools:layout_editor_absoluteY="596dp" />

        <Button
            android:layout_marginLeft="100dp"
            android:id="@+id/decelerate"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:background="@mipmap/border"
            android:text="减速"
            tools:layout_editor_absoluteX="795dp"
            tools:layout_editor_absoluteY="596dp" />

        <Button
            android:id="@+id/stop"
            android:layout_marginLeft="100dp"
            android:layout_width="60dp"
            android:layout_height="60dp"
            android:background="@mipmap/border"
            android:text="结束"
            tools:layout_editor_absoluteX="950dp"
            tools:layout_editor_absoluteY="596dp" />


    </LinearLayout>

    <ImageView
        android:layout_centerVertical="true"
        android:layout_marginLeft="90dp"
        android:id="@+id/imageView"
        android:layout_width="261dp"
        android:layout_height="527dp"
        app:srcCompat="@mipmap/title"
        tools:layout_editor_absoluteX="141dp"
        tools:layout_editor_absoluteY="132dp" />


</RelativeLayout>

MainActivity部分

package com.suk.rotate;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.RotateDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
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.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.suk.rotate.R;

public class MainActivity extends AppCompatActivity {

    private ImageView fan;
    private Button start;
    private Button stop;
    private Button accelerate;
    private RotateAnimation rotate;
    private Button decelerate;
    private int duration=2000;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fan = findViewById(R.id.fan);
        start = findViewById(R.id.start);
        stop = findViewById(R.id.stop);
        accelerate = findViewById(R.id.accelerate);
        decelerate = findViewById(R.id.decelerate);


    }

    @Override
    protected void onStart() {
        super.onStart();

        rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        rotate.setInterpolator(new LinearInterpolator());
//        rotate.setInterpolator(lin);
        rotate.setDuration(2000);//设置动画持续周期
        rotate.setRepeatCount(-1);//设置重复次数
//        rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
        rotate.setStartOffset(10);//执行前的等待时间

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fan.startAnimation(rotate);
            }
        });
        accelerate.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View v) {
                if (duration>10){
                    duration/=2;}
                rotate.setDuration(duration);
                fan.startAnimation(rotate);
            }
        });

        decelerate.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(View v) {
                if (duration<10000){
                    duration*=2;}
                rotate.setDuration(duration);
                fan.startAnimation(rotate);
            }
        });
        /*
        fan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
                dialog.setTitle("点我没用");
                dialog.setIcon(R.drawable.fan);
                dialog.setPositiveButton("OK",null);
                dialog.setMessage("这是普通对话框");
                View view=View.inflate(MainActivity.this,R.layout. activity_main1, null);
                dialog.setView(view);
                dialog.create();
                dialog.show();

            }
        });
		*/
        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fan.clearAnimation();
            }
        });

    }
}

需要有三个图片:

fan.png 风扇扇叶

border.png 风扇边框

title.png 贴图

(随便找一个能看就行)

以上就是Android绘制旋转动画方法详解的详细内容,更多关于Android旋转动画的资料请关注脚本之家其它相关文章!

相关文章

  • React Native学习之Android的返回键BackAndroid详解

    React Native学习之Android的返回键BackAndroid详解

    这篇文章主要给大家介绍了关于React Native学习之Android的返回键BackAndroid的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用React Native具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-10-10
  • Android实现自定义圆角对话框Dialog的示例代码

    Android实现自定义圆角对话框Dialog的示例代码

    项目中多处用到对话框,本篇文章主要介绍了Android实现圆角对话框Dialog的示例代码,有兴趣的可以了解一下。
    2017-03-03
  • Android开发笔记之如何正确获取WebView的网页Title

    Android开发笔记之如何正确获取WebView的网页Title

    获取h5页面的携带的title中是很简单的,下面这篇文章主要给大家介绍了关于Android开发笔记之如何正确获取WebView的网页Title的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面来一起看看吧
    2018-09-09
  • Android控件之Gallery用法实例分析

    Android控件之Gallery用法实例分析

    这篇文章主要介绍了Android控件之Gallery用法,以完整实例形式较为详细的分析了Gallery控件实现图像显示的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android自定义view实现圆形与半圆形菜单

    Android自定义view实现圆形与半圆形菜单

    这篇文章主要介绍了Android自定义view实现圆形与半圆形菜单的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • Android中资源文件用法简单示例

    Android中资源文件用法简单示例

    这篇文章主要介绍了Android中资源文件用法,简单分析了Android资源文件的类型、格式及使用方法,需要的朋友可以参考下
    2016-07-07
  • Android中的sqlite查询数据时去掉重复值的方法实例

    Android中的sqlite查询数据时去掉重复值的方法实例

    今天小编就为大家分享一篇关于Android中的sqlite查询数据时去掉重复值的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Android中自定义View实现圆环等待及相关的音量调节效果

    Android中自定义View实现圆环等待及相关的音量调节效果

    这篇文章主要介绍了Android中自定义View实现圆环等待及相关的音量调节效果,逻辑非常简单,或许绘图方面更加繁琐XD 需要的朋友可以参考下
    2016-04-04
  • Android编程简易实现XML解析的方法详解

    Android编程简易实现XML解析的方法详解

    这篇文章主要介绍了Android编程简易实现XML解析的方法,结合实例形式总结分析了Android操作xml文件的各种常见技巧与相关注意事项,需要的朋友可以参考下
    2017-08-08
  • 浅析Flutter AbsorbPointer 与 IgnorePointer的区别

    浅析Flutter AbsorbPointer 与 IgnorePointer的区别

    Flutter是Google一个新的用于构建跨平台的手机App的SDK。这篇文章主要介绍了Flutter AbsorbPointer 与 IgnorePointer的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论