`
貌似掉线
  • 浏览: 260077 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

android程序开启动画封装

阅读更多
本文及代码原创,转载请注明出处:http://maosidiaoxian.iteye.com/blog/1682616

许多程序在开启的时候都会有一个LOGO的展示,然后才进入。参考一个师兄的写法,我自己也对这样的行为进行了封装。代码如下:
/*
 * @(#)IntroActivity.java		       Project:com.sinaapp.msdxblog.androidkit
 * Date:2012-9-10
 *
 * Copyright (c) 2011 CFuture09, Institute of Software, 
 * Guangdong Ocean University, Zhanjiang, GuangDong, China.
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.sinaapp.msdxblog.androidkit.ui;

import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AlphaAnimation;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;

/**
 * @author Geek_Soledad (66704238@51uc.com)
 */
public abstract class IntroActivity extends Activity {
	private static final String FLAG_RESOURCE = "FLAG_RESOURCE";
	/**
	 * 后台任务完成的标志。
	 */
	private static final int BACKGROUND_FINISH = 0x01;
	/**
	 * 前台任务完成的标志。
	 */
	private static final int FRONTGROUND_FINISH = 0x10;
	/**
	 * 表示要播放开场动画。
	 */
	private static final int INTRO_PLAY = 0;
	/**
	 * 开场动画的资源。
	 */
	private List<IntroImgResource> mResources = new ArrayList<IntroImgResource>();
	/**
	 * 图片背景颜色。默认为白色。
	 */
	private int mBackgroundColor = 0xFFFFFFFF;
	/**
	 * UI线程。
	 */
	private Handler mUiHandler;
	/**
	 * 用来显示动画。
	 */
	private ImageView mIntroImage;
	/**
	 * 屏幕方向。
	 */
	private int mOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		init();
		runOnMainThread();
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		this.setRequestedOrientation(mOrientation);
		this.setContentView(createLayout());
		setIntroResources(mResources);
		startOnBackground();
		showIntro();
	}

	private void init() {
		mUiHandler = new UIHandler(this);
	}

	/**
	 * 设置开场动画的图片资源。
	 * 
	 * @param resources
	 *            开场动画的图片资源。
	 */
	protected abstract void setIntroResources(List<IntroImgResource> resources);

	/**
	 * 返回下一个要启动的Activity。
	 * 
	 * @return 下一个要启动的Activity。
	 */
	protected abstract Class<?> nextActivity();

	/**
	 * 显示开场动画。
	 */
	protected void showIntro() {
		int delayTime = 0;
		for (final IntroImgResource resource : mResources) {
			Message msg = new Message();
			msg.what = INTRO_PLAY;
			Bundle data = new Bundle();
			data.putSerializable(FLAG_RESOURCE, resource);
			msg.setData(data);
			mUiHandler.sendMessageDelayed(msg, delayTime);
			delayTime += resource.playerTime;
		}
		mUiHandler.sendEmptyMessageDelayed(FRONTGROUND_FINISH, delayTime);

	}

	/**
	 * 执行耗时的操作。
	 */
	private void startOnBackground() {
		HandlerFactory.getNewHandlerInOtherThread("intro_bg").post(
				new Runnable() {
					@Override
					public void run() {
						runOnBackground();
						mUiHandler.sendEmptyMessage(0x1);
					}
				});
	}

	/**
	 * 创建启动时的界面Layout。
	 * 
	 * @return 返回创建的界面Layout.
	 */
	private View createLayout() {
		FrameLayout layout = new FrameLayout(this);
		ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
		layout.setLayoutParams(layoutParams);
		layout.setBackgroundColor(getBackgroundColor());
		mIntroImage = new ImageView(this);
		FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
				FrameLayout.LayoutParams.WRAP_CONTENT,
				FrameLayout.LayoutParams.WRAP_CONTENT);
		params.gravity = Gravity.CENTER;
		layout.addView(mIntroImage, params);

		return layout;
	}

	/**
	 * 获取图片背景。
	 * 
	 * @return
	 */
	public int getBackgroundColor() {
		return mBackgroundColor;
	}

	/**
	 * 设置图片背景。
	 * 
	 * @param backgroundColor
	 */
	public void setBackgroundColor(int backgroundColor) {
		this.mBackgroundColor = backgroundColor;
	}

	/**
	 * 返回屏幕方向。
	 * 
	 * @return
	 */
	public int getmOrientation() {
		return mOrientation;
	}

	/**
	 * 设置屏幕的方向。默认是竖屏。
	 * 
	 * @param mOrientation
	 *            屏幕方向。ActivityInfo.SCREEN_ORIENTATION_PORTRAIT或者是ActivityInfo.
	 *            SCREEN_ORIENTATION_LANDSCAPE。
	 */
	public void setmOrientation(int mOrientation) {
		this.mOrientation = mOrientation;
	}

	/**
	 * 在前台中执行的代码。如需对界面进行横屏的重新设置,请此在执行setmOrientation()方法。
	 */
	protected void runOnMainThread() {
	}

	/**
	 * 在后台中执行的代码。在此进行比较耗时的操作。
	 */
	protected void runOnBackground() {
	}

	protected static class UIHandler extends Handler {
		/**
		 * 是否需要等待。
		 */
		private int isWaiting = 0;
		private WeakReference<IntroActivity> activity;
		
		public UIHandler(IntroActivity activity ){
			this.activity = new WeakReference<IntroActivity>(activity);
		}

		public void handleMessage(android.os.Message msg) {
			if (msg.what == INTRO_PLAY) {
				IntroImgResource resource = (IntroImgResource) msg.getData()
						.getSerializable(FLAG_RESOURCE);
				AlphaAnimation animation = new AlphaAnimation(
						resource.startAlpha, 1f);
				animation.setDuration(resource.playerTime);
				activity.get().mIntroImage.setImageResource(resource.mResId);
				activity.get().mIntroImage.startAnimation(animation);
				return;
			}
			
			if (msg.what == BACKGROUND_FINISH || msg.what == FRONTGROUND_FINISH) {

				isWaiting |= msg.what;
				// 当后台或前台的任务未完成时,不执行Activity的跳转。
				if (isWaiting == (BACKGROUND_FINISH | FRONTGROUND_FINISH)) {
					activity.get().startActivity(new Intent(activity.get(), activity.get().nextActivity()));
					activity.get().finish();
					return;
				}
			}
		};
	};

	/**
	 * 开场动画的图片资源类。封装了图片、播放时间、开始时的透明程度。
	 * 
	 * @author msdx
	 * 
	 */
	protected class IntroImgResource implements Serializable {
		/**
		 * 序列化ID。
		 */
		private static final long serialVersionUID = -2257252088641281804L;
		/**
		 * 资源图片ID.
		 */
		private int mResId;
		/**
		 * 播放时间,单位为毫秒。
		 */
		private int playerTime;
		/**
		 * 开始时的透明程度。0-1之间。
		 */
		private float startAlpha;

		/**
		 * 开场动画资源的构造方法。
		 * 
		 * @param mResId
		 *            图片资源的ID。
		 * @param playerTime
		 *            图片资源的播放时间,单位为毫秒。。
		 * @param startAlpha
		 *            图片资源开始时的透明程度。0-255之间。
		 */
		public IntroImgResource(int mResId, int playerTime, float startAlpha) {
			super();
			this.mResId = mResId;
			this.playerTime = playerTime;
			this.startAlpha = startAlpha;
		}

		/**
		 * 获取资源图片ID。
		 * 
		 * @return 资源图片ID。
		 */
		public int getmResId() {
			return mResId;
		}

		/**
		 * 设置资源图片ID.
		 * 
		 * @param mResId
		 *            要设置的资源图片ID.
		 */
		public void setmResId(int mResId) {
			this.mResId = mResId;
		}

		/**
		 * 返回资源图片的播放时间。
		 * 
		 * @return 资源图片的播放时间。
		 */
		public int getPlayerTime() {
			return playerTime;
		}

		/**
		 * 设置资源图片的播放时间。
		 * 
		 * @param playerTime
		 *            资源图片的播放时间。
		 */
		public void setPlayerTime(int playerTime) {
			this.playerTime = playerTime;
		}

		/**
		 * 得到资源开始时的透明程度。
		 * 
		 * @return
		 */
		public float getStartAlpha() {
			return startAlpha;
		}

		/**
		 * 设置资源开始时的透明程度。
		 * 
		 * @param startAlpha
		 */
		public void setStartAlpha(float startAlpha) {
			this.startAlpha = startAlpha;
		}
	}

}


使用时继承上面的类,主要重写里面的以下两个抽象方法:
1、nextActivity(),在这里返回下一个Activity。
2、setIntroResources(List<IntroImgResource> resources),在这里添加要展示的图片资源(包括展示时间)。这里仅支持图片,不支持动画、影片等。展示的效果是渐变显示。

如果有耗时的操作,重写runOnBackground()方法,它会在一个非UI线程中运行。
如果要进行横屏等的设置,重写runOnMainThread()方法,它在主线程中运行。设置横屏等行为,请使用代码中提供的方法。

以上代码来自我的开源项目cfuture-androidkit,目前托管在谷歌上,网址为:http://code.google.com/p/cfuture-androidkit/
2
0
分享到:
评论
1 楼 wakikyou320 2013-07-03  
拜读中5个字

相关推荐

    Android动画效果的强悍框架

    通过深入理解这个库,开发者能够轻松地为应用程序注入生动有趣的动画元素,提升用户体验。无论是简单的过渡效果还是复杂的交互设计,BaseAnimation1.3都能帮助开发者实现目标,让应用更具吸引力。在实践中,不断探索...

    Android-用于android中打开pdf文件

    `Android-用于android中打开pdf文件`这个项目提供了一种解决方案,它基于开源的MuPDF-1.6版本,将其编译打包成Android可用的动态链接库(libmupdf.so),这样开发者就可以在自己的应用程序中集成PDF阅读功能。...

    android程序启动时的缓冲界面源码

    下面我们将深入探讨Android程序启动时缓冲界面的相关知识点。 1. **启动屏幕的作用**: - 提升用户体验:当应用程序正在初始化或加载资源时,启动屏幕可避免用户看到空白屏幕或长时间等待。 - 品牌展示:启动屏幕...

    仿微信开门动画

    在IT行业中,用户体验是至关重要的,而动画效果作为提升用户交互体验的重要手段,常常被用于各种应用程序中。本文将深入探讨“仿微信开门动画”的实现,这是一个模仿微信启动时的引导UI和开门动画的设计,旨在带给...

    AndroidAPP程序引导页面

    总的来说,Android APP程序的引导页面设计和实现是一个融合了UI/UX设计、动画效果和编程技术的综合性任务。通过合理利用ViewPager和相关组件,开发者可以创建出既美观又实用的引导流程,提升应用的整体体验。

    yolov8模型集成到android端demo

    在本文中,我们将深入探讨如何将YOLOv8模型集成到Android端的Demo应用程序中,以便实现图像识别功能。YOLO(You Only Look Once)是一种实时目标检测系统,以其高效和准确性而闻名。YOLOv8是YOLO系列的最新版本,它...

    android天气预报相关程序

    在Android平台上开发天气预报应用程序是一项常见的任务,它涉及到多种技术和组件的综合运用。这个压缩包文件"ctWeather"很可能包含了实现这样一个程序的各种源代码、资源文件以及可能的库。下面,我们将深入探讨与...

    最新Android旋转圆盘

    `RotateAnimation`是Android提供的基础动画类,可以设置起始角度、结束角度和旋转方向;而`ObjectAnimator`则属于属性动画系统,能更流畅地控制动画过程。 为了实现平滑的旋转效果,开发者需要考虑到触摸事件的处理...

    Android源码——条码扫描程序源码.7z

    这个压缩包文件“Android源码——条码扫描程序源码.7z”包含了与Android平台上的条码扫描功能相关的源代码。条码扫描是移动应用中常见的一种功能,它允许用户通过手机摄像头读取和解析条形码或二维码,从而获取产品...

    新版Android开发教程.rar

    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...

    android应用开发框架

    在Android应用开发中,框架的选择和使用至关重要,它能够帮助开发者高效、规范地构建应用程序。...在实际开发过程中,合理地组织和封装代码,遵循最佳实践,将有助于创建稳定、高效且易于维护的Android应用程序。

    Android 仿Mac的Dock

    【Android 仿Mac Dock】是Android平台上实现的一种模仿Mac电脑底部Dock栏效果的应用程序开发案例。Dock栏在Mac操作系统中是不可或缺的一部分,它提供了一种快速启动应用、切换任务和管理打开窗口的方式。在Android...

    scrollview实现app登陆前的动画界面

    在移动应用开发中,用户首次打开应用时,为了提供更好的用户体验和展示应用特色,往往会设计一个登录前的动画界面,也称为引导页或欢迎页。本文将深入探讨如何使用ScrollView来实现这样的功能,以适用于各种应用程序...

    闪动的文字效果Android

    此外,为了使代码更加模块化,可以考虑将动画逻辑封装到一个自定义TextView扩展类中,这样可以直接在XML布局文件中使用这个控件,简化代码。 总结,实现Android平台上的闪动文字效果,主要涉及自定义动画、属性动画...

    Android应用源码之初初级记事本程序,直接写文件.zip

    在Android平台上,开发一个初级的记事本程序是学习Android应用程序开发的良好起点。这个程序涉及到的基本概念和技术包括用户界面设计、文件操作以及Android系统服务的使用。以下是对这些知识点的详细解释: 1. **...

    Android-Goldfinger-简化了指纹认证实现的Android库

    `Android-Goldfinger`是一个开源库,旨在简化Android应用程序中指纹认证的集成过程,提供了一种更加便捷的方式来实现这一功能。本篇文章将深入探讨`Goldfinger`库的核心特性、使用方法以及它如何提升Android应用的...

    Android源码

    9. **UI框架**:Android的用户界面由View和 ViewGroup构成,源码中详细解释了布局绘制、事件处理和动画实现的细节。 10. **测试框架**:Android提供了JUnit,Espresso等测试框架,用于编写和执行单元测试和UI测试。...

    Android技术面试整理附有详细答案

    Android程序运行时权限是指应用程序请求访问敏感功能或数据的权限,如相机、联系人等。文件系统权限则是指应用程序对文件和目录的读写权限,它决定了应用程序能否访问特定的文件和目录。 #### 27. 指定浏览器访问...

    基于Android的WiF单片机连接源码.zip

    1. Android Wi-Fi通信:Android系统提供了丰富的API来处理Wi-Fi连接,如WifiManager类,它允许开发者获取Wi-Fi状态、打开/关闭Wi-Fi、扫描可用网络并连接到指定的Wi-Fi热点。在本项目中,可能使用了这些API来建立...

Global site tag (gtag.js) - Google Analytics