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旋转动画的资料请关注其它相关文章!
推荐阅读
-
Android编程解析XML文件的方法详解【基于XmlPullParser】
-
Android绘图之Paint的使用方法详解
-
Android7.0开发实现Launcher3去掉应用抽屉的方法详解
-
Android控件Tween动画(补间动画)实现方法示例
-
详解Android(共享元素)转场动画开发实践
-
基于linux与windows平台下 如何下载android sdk源代码的方法详解
-
解析Android资源文件及他们的读取方法详解
-
Android工程:引用另一个Android工程的方法详解
-
解析Android获取系统cpu信息,内存,版本,电量等信息的方法详解
-
Android编程实现ImageView图片抛物线动画效果的方法