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

进入程序的动画IntroActivity增强版

阅读更多
这是对上一次谈到的android程序进入前的动画的封装(详见:http://maosidiaoxian.iteye.com/blog/1682616)的增加版。
在上一个版本中,如果图片太小,只是在中间显示,而无法占满整个屏幕。而在QQ,网易新闻的客户端中,它们的图片都是占满整个屏幕的,所以我又修改了一下,使得可以选择是否让图片填充整个屏幕。
使用的代码如下:
/*
 * @(#)IntroActivitySample.java		       Project:com.sinaapp.msdxblog.andoridkit.sample
 * Date:2012-9-12
 *
 * 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.sample.ui;

import java.util.List;

import com.lurencun.cfuture09.androidkit.ui.IntroActivity;
import com.sinaapp.msdxblog.androidkit.sample.GameActivity;
import com.sinaapp.msdxblog.androidkit.sample.R;

/**
 * @author Geek_Soledad (66704238@51uc.com)
 */
public class IntroActivitySample extends IntroActivity{

	@Override
	protected Class<?> nextActivity() {
		return GameActivity.class;
	}

	@Override
	protected void setIntroResources(List<IntroImgResource> arg0) {
		IntroImgResource resource = new IntroImgResource(R.drawable.nav1, 2000, 0.4f, true);
		arg0.add(resource);
		IntroImgResource resource2 = new IntroImgResource(R.drawable.nav2, 2500, 0.4f, false);
		arg0.add(resource2);
	}

	@Override
	protected void runOnBackground() {
		// do the loading here
	}
}
在IntroImgResource的构造方法中,增加了一个boolean参数,表示是否让图片填充整个屏幕。在上面的例子中,第一张图片会填充整个屏幕,而第二张图片只是居中显示。

改进后的IntroActivity源代码如下:
/*
 * @(#)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.lurencun.cfuture09.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 android.widget.ImageView.ScaleType;

import com.lurencun.cfuture09.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 byte BACKGROUND_FINISH = 0x01;
	/**
	 * 前台任务完成的标志。
	 */
	private static final byte FRONTGROUND_FINISH = 0x10;
	/**
	 * 表示要播放开场动画。
	 */
	private static final int INTRO_PLAY = 0;
	/**
	 * 开场动画的资源。
	 */
	private List<IntroImgResource> mResources;
	/**
	 * 图片背景颜色。默认为白色。
	 */
	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() {
		mResources = new ArrayList<IntroImgResource>();
		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.newHandlerInOtherThread("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.FILL_PARENT,
				FrameLayout.LayoutParams.FILL_PARENT);
		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);
				IntroActivity intro = activity.get();
				if (intro != null) {
					if (resource.isExpand) {
						intro.mIntroImage.setScaleType(ScaleType.FIT_XY);
					} else {
						intro.mIntroImage.setScaleType(ScaleType.CENTER);
					}
					intro.mIntroImage.setImageResource(resource.mResId);
					intro.mIntroImage.startAnimation(animation);
				}
				return;
			}

			if (msg.what == BACKGROUND_FINISH || msg.what == FRONTGROUND_FINISH) {

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

	/**
	 * 开场动画的图片资源类。封装了图片、播放时间、开始时的透明程度。
	 * 
	 * @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;

		/**
		 * 图片是否扩展。
		 */
		private boolean isExpand;

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

		/**
		 * 获取资源图片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;
		}

		/**
		 * 返回图片是否设置扩展。
		 * 
		 * @return
		 */
		public boolean isExpand() {
			return isExpand;
		}

		/**
		 * 设置图片是否扩展。
		 * 
		 * @param isExpand
		 *            如果为true,则图片会被拉伸至全屏幕大小进行展示,否则按原大小展示。
		 */
		public void setExpand(boolean isExpand) {
			this.isExpand = isExpand;
		}
	}

}
0
0
分享到:
评论

相关推荐

    微信小程序 全屏动画滚动 (源码)

    微信小程序 全屏动画滚动 (源码)微信小程序 全屏动画滚动 (源码)微信小程序 全屏动画滚动 (源码)微信小程序 全屏动画滚动 (源码)微信小程序 全屏动画滚动 (源码)微信小程序 全屏动画滚动 (源码)微信小程序 全屏动画...

    Java SE程序 动画效果

    Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果Java SE程序 动画效果...

    微信小程序 帧动画 源码程序

    微信小程序帧动画源码程序详解 在移动应用开发领域,微信小程序因其轻量级、无需安装的特点,成为了许多开发者和企业青睐的平台。帧动画是一种常见的动态效果展示方式,尤其适用于游戏、图标动效或者过渡效果。本篇...

    c#程序启动动画

    在C# WinForm应用开发中,为程序添加启动动画可以提升用户体验,使用户在等待程序加载时有一种视觉上的反馈,从而感觉程序启动更快。本文将详细介绍如何在C# WinForm项目中实现一个漂亮的启动动画。 首先,我们需要...

    小动画代码 小程序源代码

    小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小程序源代码小动画代码 小...

    微信小程序动画折叠面板.7z

    真正的微信小程序动画折叠面板,css动画实现 真正的微信小程序动画折叠面板,css动画实现 真正的微信小程序动画折叠面板,css动画实现 真正的微信小程序动画折叠面板,css动画实现

    微信小程序开发之录音机 音频播放 动画 (真机可用)(源代码+截图)

    微信小程序开发之录音机 音频播放 动画 (真机可用)(源代码+截图)微信小程序开发之录音机 音频播放 动画 (真机可用)(源代码+截图)微信小程序开发之录音机 音频播放 动画 (真机可用)(源代码+截图)微信小程序开发之录音...

    微信小程序-加载及完成动画-loadingAnim.rar

    在微信小程序中,加载和完成动画是提升用户体验的重要组成部分。加载动画可以缓解用户在等待内容加载时的不耐烦感,而完成动画则可以给用户一个明确的反馈,表明某个操作已经成功执行。本资源“微信小程序-加载及...

    小程序 收起展开动画效果

    在小程序开发中,实现“收起展开动画效果”是一个常见的需求,这通常涉及到用户界面(UI)的交互性和用户体验(UX)的优化。这个效果在菜单、侧滑抽屉、折叠面板等组件中广泛运用,使得用户能以平滑、自然的方式探索...

    微信小程序animatecss插件界面切换动画

    标题中的“微信小程序animatecss插件界面切换动画”指的是将Animate.css这个库应用到微信小程序中,用于控制页面间的过渡动画。Animate.css包含了多种预设的动画效果,如淡入淡出、滑动、旋转等,开发者可以根据自己...

    微信小程序,H5翻书动画效果

    微信小程序和H5技术在现代数字媒体中广泛应用,其中一种吸引用户注意力的创新设计就是“翻书动画效果”。这种效果可以模拟真实的书籍翻页过程,为用户带来更沉浸式的阅读体验。本文将深入探讨如何在微信小程序和H5中...

    Unity3D教程:动画融合、动画层、动画混合、附加动画、程序动画、动画重放和取样2

    本教程主要讲解了几个关键概念,包括动画融合、动画层、动画混合、附加动画、程序动画以及动画重放和取样。 首先,**动画融合**(Animation Blending)是确保游戏动画流畅过渡的关键技术。动画师通常会制作如行走、...

    直播点赞动画 小程序

    这类小程序通过动态视觉效果增强了直播的互动性和趣味性,让观众可以通过点击按钮触发各种酷炫的点赞动画,提升直播体验。下面我们将深入探讨与这个主题相关的多个IT知识点。 1. **微信小程序开发**: 微信小程序...

    数据结构教程程序动画演示

    各种数据的动画操作,如链表,二叉树的动画各种数据的动画操作,如链表,二叉树的动画各种数据的动画操作,如链表,二叉树的动画各种数据的动画操作,如链表,二叉树的动画各种数据的动画操作,如链表,二叉树的动画...

    小程序加入购物车动画效果(飞入购物车)

    在微信小程序开发中,为了提升用户体验,经常需要添加各种交互效果,其中“飞入购物车”的动画效果是一种常见的设计,可以使得用户在将商品添加到购物车时有更直观、生动的感受。本教程将详细讲解如何在小程序中实现...

    微信小程序-渐变发光加载动画.zip

    在微信小程序开发中,创建吸引用户的交互体验是至关重要的,其中加载动画就是一种常见的提升用户体验的方式。本资源包“微信小程序-渐变发光加载动画.zip”聚焦于如何在微信小程序中实现这种动态效果,旨在帮助...

    微信小程序制作音乐跳动动画样例源码

    在微信小程序开发中,制作音乐跳动动画是一项有趣且实用的技术。这个样例源码提供了一个实际项目的实现,它涉及到音频处理、服务器交互以及客户端动画的创建。下面将详细讲解这些知识点。 首先,我们要理解微信小...

    Wpf界面动画进入退出效果

    WPF界面动画的进入和退出效果就是这样的一个关键点,它可以让应用看起来更加专业且吸引人。本文将深入探讨如何在Wpf中实现界面的进入和退出动画效果。 **一、动画基础** WPF的动画系统基于Timeline类,它允许...

    c语言动画程序,实例

    在C语言中创建动画程序是一项挑战性的任务,但通过熟练运用特定的库和函数,可以实现生动有趣的视觉效果。这个“c语言动画程序”实例很可能包含了一系列用于绘制和更新图形的代码,使得图像能够在屏幕上动态地变化,...

Global site tag (gtag.js) - Google Analytics