Android绘制旋转动画方法详解

目录
  • 1、准备工作
  • 2、加速减速原理
  • 3、初始化
  • 4、开始
  • 5、加速
  • 6、减速
  • 7、停止
  • 8、项目源码
    • Layout部分
    • MainActivity部分

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旋转动画的资料请关注我们其它相关文章!

时间: 2022-01-06

Android酷炫动画效果之3D星体旋转效果

在Android中,如果想要实现3D动画效果一般有两种选择:一是使用Open GL ES,二是使用Camera.Open GL ES使用起来太过复杂,一般是用于比较高级的3D特效或游戏,并且这个也不是开源的,像比较简单的一些3D效果,使用Camera就足够了. 一些熟知的Android 3D动画如对某个View进行旋转或翻转的 Rotate3dAnimation类,还有使用Gallery( Gallery目前已过时,现在都推荐使用 HorizontalScrollView或 RecyclerVi

Android编程实现RotateAnimation设置中心点旋转动画效果

本文实例讲述了Android编程实现RotateAnimation设置中心点旋转动画效果.分享给大家供大家参考,具体如下: 在xml设置: <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="800" // 设置动画

Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码

利用Android的ApiDemos的Rotate3dAnimation实现了个图片3D旋转的动画,围绕Y轴进行旋转,还可以实现Z轴的缩放.点击开始按钮开始旋转,点击结束按钮停止旋转. 代码如下:: Rotate3dAnimation.java public class Rotate3dAnimation extends Animation { private final float mFromDegrees; private final float mToDegrees; private fi

Android补间动画基本使用(位移、缩放、旋转、透明)

本文讲述了Android补间动画基本使用(位移.缩放.旋转.透明).分享给大家供大家参考,具体如下: 补间动画 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画 位移.旋转.缩放.透明 位移: 参数10指的是X的起点坐标,但不是指屏幕x坐标为10的位置,而是imageview的 真实X + 10 参数150指的是X的终点坐标,它的值是imageview的 真实X + 150 //创建为位移动画对象,设置动画的初始位置和结束位置 TranslateAnimation ta = new T

Android旋转、平移、缩放和透明度渐变的补间动画

android实现旋转.平移.缩放和透明度渐变的补间动画,具体实现如下: 1.在新建项目的res目录中,创建一个名为anim的目录,并在该目录中创建实现旋转.平移.缩放和透明度渐变的动画资源文件. 透明度渐变的动画资源文件anim_alpha.xml(完全不透明->完全透明->完全不透明) <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://sch

Android自定义动画根据控件Y轴旋转动画(仿红包)

这里给正在学安卓的小白们分享一个动画吧,用处挺多,代码也不多,还望各位大佬不要打击. 进入正题,先看看效果 效果很炫酷很美好 好了 来看代码吧    该说的都在代码注释里面  这个不用多说 代码极其简单 //自定义一个类继承Animation(android.view.animation.Animation)抽象类 public class MyAnimation extends Animation { // 先定义成员变量 //X轴的中心坐标 int center_X; //Y轴的中心坐标 i

Android实现旋转动画的两种方式案例详解

目录 练习案例 效果展示 前期准备 自定义 View java代码编写 方法一 方法二 易错点总结: 练习案例 视差动画 - 雅虎新闻摘要加载 效果展示 前期准备 第一步:准备好颜色数组 res => values => colors.xml <color name="orange">#FF9600</color> <color name="aqua">#02D1AC</color> <color n

Android 3D旋转动画效果实现分解

这篇文章主要介绍一下如何实现View的3D旋转效果,实现的主要原理就是围绕Y轴旋转,同时在Z轴方面上有一个深入的缩放. 演示的demo主要有以下几个重点: 1,自定义旋转动画 2,动画做完后,重置ImageView 先看一下程序的运行效果:  1,自定义动画类 这里实现了一个Rotate3dAnimation的类,它扩展了Animation类,重写applyTransformation()方法,提供指定时间的矩阵变换,我们在这个方法里,就可以利用Camera类得得到一个围绕Y轴旋转的matrix

Android实现3D翻转动画效果

Android中并没有提供直接做3D翻转的动画,所以关于3D翻转的动画效果需要我们自己实现,那么我们首先来分析一下Animation 和 Transformation. Animation动画的主要接口,其中主要定义了动画的一些属性比如开始时间,持续时间,是否重复播放等等.而Transformation中则包含一个矩阵和alpha值,矩阵是用来做平移,旋转和缩放动画的,而alpha值是用来做alpha动画的,要实现3D旋转动画我们需要继承自Animation类来实现,我们需要重载getTrans

Android仿Flipboard动画效果的实现代码

1.上原图 前几天在 Hencoder 征稿看到的Filpboard 里的的动画效果: Filipboard.gif 先bb一句:在看本文的同时,如果觉得我写的模糊看不太懂的可以直接拉到文末,配合完整代码再一步一步看. 2.实现 整体思路: 用手机拍下来,逐帧观看了许久,恍然大悟,就是一张纸,折起一边之后,让其对折线绕中心点旋转. 关联自定义 View : Camera 来控制对折幅度, canves 控制旋转. 具体: 每当对折线旋转的时候,图标总是一边是折起来的,一边是平铺的,且中心对称,所

jQuery实现炫丽的3d旋转星空效果

本文实例讲述了jQuery实现炫丽的3d旋转星空效果.分享给大家供大家参考,具体如下: 该特效也是在Jquery插件库中找到的,感觉效果不错,说不定以后项目中要有绚丽的星空背景,拿来即用,收藏了下. 下载解压后的目录结构 index.html页面代码: <!doctype html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta http-equiv=&

Android自定义带动画效果的圆形ProgressBar

本文实例为大家分享了Android自定义带动画效果的圆形ProgressBar,供大家参考,具体内容如下 最近有个需求显示进度,尾部还要有一标示,像下边这样 使用自定义View的方式实现,代码如下,很简单注释的很清楚 文章最后我们拓展一下功能,实现一个带动画效果的进度条 package com.example.fwc.allexample.progressbar; import android.animation.ValueAnimator; import android.annotation.

jQuery实现图像旋转动画效果

废话不多说了,直接给大家贴代码了,具体代码如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <tit

Android实现带动画效果的可点击展开TextView

本文为大家分享了Android实现带动画效果的可点击展开TextView 制作代码,效果图: 收起(默认)效果: 点击展开后的效果: 源码: 布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/activity_main" xmlns:android="http://schemas.android.com/apk/res/a

Android GridView实现动画效果实现代码

 Android GridView实现动画效果 项目中用到的一些动画,GridView的Item依次从屏幕外飞入到相应位置,附上相关代码: MainActivity.Java package com.mundane.gridanimationdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.an