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

Android绘制旋转动画方法详解

程序员文章站 2022-06-09 19:50:02
目录1、准备工作2、加速减速原理3、初始化4、开始5、加速6、减速7、停止8、项目源码layout部分mainactivity部分1、准备工作首先需要有一个用于旋转的图片需要考虑如何开始、结束、加速、...

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