Android绘制旋转动画方法详解

作者:吃橘子的季节呢 时间:2021-11-30 20:11:07 

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 贴图

(随便找一个能看就行)

来源:https://blog.csdn.net/w_Eternal/article/details/122296375

标签:Android,旋转,动画
0
投稿

猜你喜欢

  • java IO流文件的读写具体实例

    2023-08-21 04:44:34
  • Android开发实现TextView超链接5种方式源码实例

    2022-12-10 16:50:32
  • Java后端Cookie实现(时间戳)代码实例

    2022-05-17 09:39:52
  • 浅谈Android Studio如何Debug对应so文件C/C++代码

    2023-11-20 03:23:35
  • C语言实现仓库物资管理系统

    2023-04-23 12:30:51
  • 使用JavaWeb webSocket实现简易的点对点聊天功能实例代码

    2023-10-29 00:14:17
  • Java类的定义以及执行顺序学习教程

    2023-01-14 10:44:29
  • Java使用Optional实现优雅避免空指针异常

    2023-06-05 15:35:39
  • AndroidStudio实现微信界面设计

    2022-09-16 22:45:40
  • C# Resources资源详解

    2021-10-13 02:49:32
  • Java GZip 基于内存实现压缩和解压的方法

    2023-05-24 12:47:29
  • IDEA:Git stash 暂存分支修改的实现代码

    2023-11-29 09:16:35
  • Android不显示开机向导和开机气泡问题

    2022-10-13 23:56:26
  • 详解Spring Boot的GenericApplicationContext使用教程

    2021-06-09 14:05:40
  • java配置多个过滤器优先级以及几个常用过滤器操作

    2023-12-17 01:52:10
  • Android XUtils3框架的基本使用方法(二)

    2021-08-03 16:32:45
  • 一篇文章带你使用C语言编写内核

    2022-01-12 12:57:48
  • HashMap原理及手写实现部分区块链特征

    2023-10-15 03:27:27
  • Java的Spring框架中bean的继承与内部bean的注入

    2023-06-17 18:50:44
  • java创建多级目录文件的实例讲解

    2023-11-27 09:29:02
  • asp之家 软件编程 m.aspxhome.com