欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android实现旋转动画

程序员文章站 2022-06-01 20:30:04
...

本文实例为大家分享了Android实现旋转动画的具体代码,供大家参考,具体内容如下

旋转动画(可加速、减速)

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

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

6、减速
`decelerate.setOnClickListener(new View.OnClickListener() {
@Override

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

});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>

  1. <LinearLayout
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"
  4. android:layout_alignParentBottom="true"
  5. android:layout_centerHorizontal="true"
  6. android:layout_marginBottom="150dp">
  7. <Button
  8. android:id="@+id/start"
  9. android:layout_width="60dp"
  10. android:layout_height="60dp"
  11. android:background="@mipmap/border"
  12. android:text="开始"
  13. tools:layout_editor_absoluteX="525dp"
  14. tools:layout_editor_absoluteY="596dp" />
  15. <Button
  16. android:id="@+id/accelerate"
  17. android:layout_marginLeft="100dp"
  18. android:layout_width="60dp"
  19. android:layout_height="60dp"
  20. android:background="@mipmap/border"
  21. android:text="加速"
  22. tools:layout_editor_absoluteX="650dp"
  23. tools:layout_editor_absoluteY="596dp" />
  24. <Button
  25. android:layout_marginLeft="100dp"
  26. android:id="@+id/decelerate"
  27. android:layout_width="60dp"
  28. android:layout_height="60dp"
  29. android:background="@mipmap/border"
  30. android:text="减速"
  31. tools:layout_editor_absoluteX="795dp"
  32. tools:layout_editor_absoluteY="596dp" />
  33. <Button
  34. android:id="@+id/stop"
  35. android:layout_marginLeft="100dp"
  36. android:layout_width="60dp"
  37. android:layout_height="60dp"
  38. android:background="@mipmap/border"
  39. android:text="结束"
  40. tools:layout_editor_absoluteX="950dp"
  41. tools:layout_editor_absoluteY="596dp" />
  42. </LinearLayout>
  43. <ImageView
  44. android:layout_centerVertical="true"
  45. android:layout_marginLeft="90dp"
  46. android:id="@+id/imageView"
  47. android:layout_width="261dp"
  48. android:layout_height="527dp"
  49. app:srcCompat="@mipmap/title"
  50. tools:layout_editor_absoluteX="141dp"
  51. 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 {

  1. private ImageView fan;
  2. private Button start;
  3. private Button stop;
  4. private Button accelerate;
  5. private RotateAnimation rotate;
  6. private Button decelerate;
  7. private int duration=2000;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. fan = findViewById(R.id.fan);
  13. start = findViewById(R.id.start);
  14. stop = findViewById(R.id.stop);
  15. accelerate = findViewById(R.id.accelerate);
  16. decelerate = findViewById(R.id.decelerate);
  17. }
  18. @Override
  19. protected void onStart() {
  20. super.onStart();
  21. rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  22. rotate.setInterpolator(new LinearInterpolator());

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

  1. start.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. fan.startAnimation(rotate);
  5. }
  6. });
  7. accelerate.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. if (duration>10){
  11. duration/=2;}
  12. rotate.setDuration(duration);
  13. fan.startAnimation(rotate);
  14. }
  15. });
  16. decelerate.setOnClickListener(new View.OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  19. if (duration<10000){
  20. duration*=2;}
  21. rotate.setDuration(duration);
  22. fan.startAnimation(rotate);
  23. }
  24. });
  25. /*
  26. fan.setOnClickListener(new View.OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
  30. dialog.setTitle("点我没用");
  31. dialog.setIcon(R.drawable.fan);
  32. dialog.setPositiveButton("OK",null);
  33. dialog.setMessage("这是普通对话框");
  34. View view=View.inflate(MainActivity.this,R.layout. activity_main1, null);
  35. dialog.setView(view);
  36. dialog.create();
  37. dialog.show();
  38. }
  39. });
  40. */
  41. stop.setOnClickListener(new View.OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. fan.clearAnimation();
  45. }
  46. });
  47. }

}`
需要有三个图片:

​ fan.png 风扇扇叶
​ border.png 风扇边框
​ title.png 贴图
(随便找一个能看就行)