转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992
今天给大家一个使用View Animation实现动画加载界面的实现。
首先先看一下实现效果。
下面是实现代码
- package com.example.animationloading;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.annotation.SuppressLint;
- import android.app.Dialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.animation.Animation;
- import android.view.animation.RotateAnimation;
- import android.widget.ImageView;
- /**
- *
- * @ClassName: com.example.animationloading.LoadingDialog
- * @Description: 动画加载Dialog
- * @author zhaokaiqiang
- * @date 2014-10-27 下午4:42:52
- *
- */
- public class LoadingDialog extends Dialog {
- protected static final String TAG = "LoadingDialog";
- // 动画间隔
- private static final int DURATION = 800;
- // 前景图片
- private ImageView img_front;
- // 定时器,用来不断的播放动画
- private Timer animationTimer;
- // 旋转动画
- private RotateAnimation animationL2R;
- @SuppressLint("HandlerLeak")
- private Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- img_front.setAnimation(animationL2R);
- animationL2R.start();
- };
- };
- public LoadingDialog(Context context) {
- super(context, R.style.dialog);
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.dialog_loading);
- img_front = (ImageView) findViewById(R.id.img_front);
- animationTimer = new Timer();
- // 从左到右的旋转动画,设置旋转角度和旋转中心
- animationL2R = new RotateAnimation(0f, -90f,
- Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
- 0.5f);
- // 设置动画的运行时长
- animationL2R.setDuration(DURATION);
- // 动画运行结束之后,保存结束之后的状态
- animationL2R.setFillAfter(true);
- // 设置重复的次数
- animationL2R.setRepeatCount(1);
- //设置重复模式为逆运动
- animationL2R.setRepeatMode(Animation.REVERSE);
- // 执行间隔任务,开始间隔是0,每隔DURATION * 2执行一次
- animationTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- handler.sendEmptyMessage(1);
- }
- }, 0, DURATION * 2);
- }
- @Override
- protected void onStop() {
- super.onStop();
- animationTimer.cancel();
- }
- }
当然,除了这种直接使用代码的硬编码方式,哦们还可以使用xml的方式,和硬编码基本类似,把需要的属性在xml里面定义好即可,下面的代码实现。
- <?xml version="1.0" encoding="utf-8"?>
- <rotate xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="800"
- android:fillAfter="true"
- android:fromDegrees="0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:repeatCount="1"
- android:repeatMode="reverse"
- android:toDegrees="-90" >
- </rotate>
如果使用这种方式,那么,上面的代码就要变成下面这种了。
- package com.example.animationloading;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.annotation.SuppressLint;
- import android.app.Dialog;
- import android.content.Context;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.ImageView;
- /**
- *
- * @ClassName: com.example.animationloading.LoadingDialog
- * @Description: 动画加载Dialog
- * @author zhaokaiqiang
- * @date 2014-10-27 下午4:42:52
- *
- */
- public class LoadingDialog extends Dialog {
- protected static final String TAG = "LoadingDialog";
- // 动画间隔
- private static final int DURATION = 800;
- // 前景图片
- private ImageView img_front;
- // 定时器,用来不断的播放动画
- private Timer animationTimer;
- private Animation animation;
- private Context context;
- @SuppressLint("HandlerLeak")
- private Handler handler = new Handler() {
- public void handleMessage(Message msg) {
- img_front.setAnimation(animation);
- animation.start();
- };
- };
- public LoadingDialog(Context context) {
- super(context, R.style.dialog);
- this.context = context;
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.dialog_loading);
- img_front = (ImageView) findViewById(R.id.img_front);
- animationTimer = new Timer();
- animation = AnimationUtils.loadAnimation(context,
- R.anim.anim_load_dialog);
- // 执行间隔任务,开始间隔是0,每隔DURATION * 2执行一次
- animationTimer.schedule(new TimerTask() {
- @Override
- public void run() {
- handler.sendEmptyMessage(1);
- }
- }, 0, DURATION * 2);
- }
- @Override
- protected void onStop() {
- super.onStop();
- animationTimer.cancel();
- }
- }
下面是dialog的样式
- <style name="dialog" parent="android:style/Theme.Dialog">
- <!-- 背景颜色及透明程度 -->
- <item name="android:windowBackground">@android:color/transparent</item>
- <item name="android:windowFrame">@null</item>
- <item name="android:windowNoTitle">true</item>
- <!-- 是否浮现在activity之上 -->
- <item name="android:windowIsFloating">true</item>
- <item name="android:windowContentOverlay">@null</item>
- </style>
github的项目地址:https://github.com/ZhaoKaiQiang/LoadingDialog