android 流星动画,android动画Rotate

该博客介绍了如何通过XML动画实现一个刷新按钮上的旋转加载效果。首先,创建一系列不同旋转角度的图片来模拟旋转过程,然后在XML中定义动画,设置旋转角度、速度和重复次数。在代码中,当用户点击按钮时启动动画,实现了加载图标连续旋转的效果。这种方法相较于使用多张图片,可以减少文件体积,但需要正确设置动画参数以达到循环旋转。
摘要由CSDN通过智能技术生成

项目有一个需求,有一个刷新按钮,上面放着一个常见的静止的刷新圆圈,如下图:

e77de1924e4898c5590cfd06f886fc76.png

一旦用户按了刷新按钮,需要让这个刷新圆圈转动起来,让用户感觉到程序还在运行着,而不是卡死了。

有两个思路,一是将这个图按照旋转时间不同旋转成不同旋转角度的图片,就像要做一张gif图片一样,例如我要每次旋转30度,就需要360\30=12张图片,然后再anim文件夹下新建xml文件,内容如下:

Xml代码

6947f17bc6069ba1ecfc6d1cd5322b07.gif 

dfb3d43958554d0a5c7893c42f89bba9.png

42aa4ff86cfe0e0522c5f2afc4e27190.gif

android:oneshot="true">

android:oneshot="true">

在代码中这样写:

Java代码

6947f17bc6069ba1ecfc6d1cd5322b07.gif 

dfb3d43958554d0a5c7893c42f89bba9.png

42aa4ff86cfe0e0522c5f2afc4e27190.gif

AnimationDrawable rocketAnimation;

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);

rocketImage.setBackgroundResource(R.anim.rocket_thrust);

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

}

publicbooleanonTouchEvent(MotionEvent event) {

if(event.getAction() == MotionEvent.ACTION_DOWN) {

rocketAnimation.start();

returntrue;

}

returnsuper.onTouchEvent(event);

}

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);

rocketImage.setBackgroundResource(R.anim.rocket_thrust);

rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

}

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

rocketAnimation.start();

return true;

}

return super.onTouchEvent(event);

}

这种做法其实就是将每一帧图片都显示了一次,但是由于需要更多图片,文件体积会上升。

但是作者没能实现循环旋转,我尝试了下,修改了下anim文件的格式,成功了

Xml代码

6947f17bc6069ba1ecfc6d1cd5322b07.gif 

dfb3d43958554d0a5c7893c42f89bba9.png

42aa4ff86cfe0e0522c5f2afc4e27190.gif

android:fromDegrees="0"android:toDegrees="+360"android:duration="1000"

android:pivotX="50%"android:pivotY="50%"android:repeatCount="infinite"/>

android:fromDegrees="0" android:toDegrees="+360" android:duration="1000"

android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" />

其中android:duration="1000"表示旋转速率是1秒钟。

代码:

Java代码

6947f17bc6069ba1ecfc6d1cd5322b07.gif 

dfb3d43958554d0a5c7893c42f89bba9.png

42aa4ff86cfe0e0522c5f2afc4e27190.gif

packageinfo.wegosoft;

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.view.animation.Animation;

importandroid.view.animation.AnimationUtils;

publicclassLoadingAnimationTestextendsActivity {

/** Called when the activity is first created. */

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Animation anim = AnimationUtils.loadAnimation(this, R.anim.round_loading);

findViewById(R.id.loadingBtn).startAnimation(anim);

}

}

package info.wegosoft;

import android.app.Activity;

import android.os.Bundle;

import android.view.animation.Animation;

import android.view.animation.AnimationUtils;

public class LoadingAnimationTest extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

Animation anim = AnimationUtils.loadAnimation(this, R.anim.round_loading);

findViewById(R.id.loadingBtn).startAnimation(anim);

}

}

布局文件:

Java代码

6947f17bc6069ba1ecfc6d1cd5322b07.gif 

dfb3d43958554d0a5c7893c42f89bba9.png

42aa4ff86cfe0e0522c5f2afc4e27190.gif

android:orientation="vertical"android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_height="wrap_content"android:background="@drawable/refresh_normal">

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:layout_height="wrap_content" android:background="@drawable/refresh_normal">

工程见附件。

注意其中的匀速插值器LinearInterpolator似乎不能设置速率,我在这浪费了很多时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>