`

《Ophone应用开发权威指南》学习:Android 图形用户界面 之 动画(一)

阅读更多
直接贴上今天写的一些小Demo代码,供以后学习:2011 - 05 - 25 
MainActivity.java
package com.anim;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.CycleInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
	ImageView imageView1;
	ImageView imageView2;
	ImageView imageView3;
	ImageView imageView4;
	ImageView imageView5;
	Handler handler;
	
	Animation translateAnimation;
	Animation alphaAnimation;
	Animation scaleAnimation;
	Animation rotateAnimation;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        		WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        imageView1 = (ImageView)findViewById(R.id.imageview1);
        imageView2 = (ImageView)findViewById(R.id.imageview2);
        imageView3 = (ImageView)findViewById(R.id.imageview3);
        imageView4 = (ImageView)findViewById(R.id.imageview4);
        imageView5 = (ImageView)findViewById(R.id.imageview5);
        
        handler = new Handler(){
        	public void handleMessage(android.os.Message msg) {
        		switch (msg.what) {
				case 1:
					// 平移动画
					// 1.代码实现
//					Animation translateAnimation = new TranslateAnimation(0, 50.0f, 0, 100.0f);
//					translateAnimation.setDuration(2000);
					// 2.加载xml文件
					translateAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.animation_translate);
					
						// 添加动画播放的加速/减速,即缓冲效果
						// 1.线性播放,即匀速播放,这个是动画的默认效果
//						LinearInterpolator linearInterpolator = new LinearInterpolator();
//						translateAnimation.setInterpolator(linearInterpolator);// 添加到动画中
						// 2.加速播放,参数值越大,加速效果越明显,即开始时慢,结束时快
						Interpolator accelerateInterpolator = new AccelerateInterpolator(2.0f);
						translateAnimation.setInterpolator(accelerateInterpolator);
						// 3.减速播放,与上类似
//						Interpolator decelerateInterpolator = new DecelerateInterpolator(0.8f);
//						translateAnimation.setInterpolator(decelerateInterpolator);
						// 4.开始和结束较慢,在动画播放中间时段会先加速后减速
//						Interpolator accelerateDecelerateInterpolator = new AccelerateDecelerateInterpolator();
//						translateAnimation.setInterpolator(accelerateDecelerateInterpolator);
						// 5.实现循环播放的动画效果
//						Interpolator cycleInterpolator = new CycleInterpolator(2.0f);
//						translateAnimation.setInterpolator(cycleInterpolator);
						
					imageView1.startAnimation(translateAnimation);
			        handler.sendEmptyMessageDelayed(2, 3000);
					break;
				case 2:
					// 渐变动画
					// 1.代码实现(实现效果是从完全不透明变成完全透明,在1秒钟内完成)
//					Animation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
//					animation2.setDuration(1000);
					// 2.加载xml文件
					alphaAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.animation_alpha);
					imageView2.startAnimation(alphaAnimation);
			        handler.sendEmptyMessageDelayed(3, 2000);
					break;
				case 3:
					// 缩放动画
					// 1.代码实现
//					Animation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, Animation.ABSOLUTE,10.0f,Animation.ABSOLUTE, 10.0f);
//					scaleAnimation.setDuration(1000);
					// 2.加载xml文件
					scaleAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.animation_scale);
					imageView4.startAnimation(scaleAnimation);
			        handler.sendEmptyMessageDelayed(4, 2000);
					break;
				case 4:
					// 旋转动画(实现效果是以(10.0f,10.0f)为旋转轴心点,将组件从0度旋转到270度)
					// 1.代码实现 (正数表示顺时针旋转)
//					Animation rotateAnimation = new RotateAnimation(0.0f, 270.0f, Animation.ABSOLUTE, 10.0f, Animation.ABSOLUTE, 10.0f);
//					rotateAnimation.setDuration(3000);
					// 2.加载xml文件
					rotateAnimation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.animation_rotate);
					rotateAnimation.setRepeatCount(Animation.INFINITE);// 设置播放次数:传入一个负数即可实现无限次播放
					rotateAnimation.setRepeatMode(Animation.REVERSE);// 设置播放模式:这里设置为播放完毕后,从后向前反过来播放,还有一个是RESTART,即从头播放
					rotateAnimation.setStartTime(AnimationUtils.currentAnimationTimeMillis()+2000);// 设置播放的开始时间:这里通过工具类获取当前系统时间,然后再1000,即延迟1秒,如果传入的值为负数,则立即播放,可以用系统的变量:Animation.START_ON_FIRST_FRAME(-1)
					rotateAnimation.setStartOffset(3000);// 设置播放偏移时间,即动画开始播放之前延时多少毫秒,加上上面的2秒,则动画首次播放被延迟了5秒,之后重复播放过程中,每次播放都会被延迟3秒
					imageView4.startAnimation(rotateAnimation);
					handler.sendEmptyMessageDelayed(5, 6000);
					/**
					 * 另外这里讲解一下其他几个方法:
					 * 1.setFillBefore(boolean fillBefore);当设置为true时,那么在动画开始播放之前就会进行动画变换操作,默认为true
					 * 2.setFillAfter(boolean fillAfter);当设置为true时,那么在动画结束之后(只有一帧)仍会进行动画变换操作,默认为false
					 * 3.setFillEnabled(boolean fillEnabled);只有将其设置为true,上述的两个属性才有意义,否则无论是开始还是结束都会进行动画变换操作,默认为false
					 */
					break;
				case 5:
					// 将各种动画效果集合到一块,应用到组件上
					// 1.代码实现
//					AnimationSet animationSet = new AnimationSet(false);// 参数说明:true表示应用AnimationSet的Interpolator效果,false表示应用各个动画对象自己的Interpolator效果
//					animationSet.addAnimation(new TranslateAnimation(0, 50.0f, 0, 50.0f));
//					animationSet.addAnimation(new AlphaAnimation(1.0f, 0.0f));
//					animationSet.setDuration(3000);
//					animationSet.setRepeatCount(Animation.INFINITE);
//					animationSet.setRepeatMode(Animation.RESTART);
					// 2.加载xml文件
					Animation animationSet = AnimationUtils.loadAnimation(MainActivity.this, R.anim.animation_set);
					imageView3.setAnimation(animationSet);
//					handler.sendEmptyMessageDelayed(6, 1000);
					// 设置背景
					MainActivity.this.getWindow().setBackgroundDrawableResource(R.drawable.blue);
					break;
				case 6:
					Animation animation3D = new My3DAnimation(0.0f, 360.0f, 100, 180, 100.0f, true);
					animation3D.setDuration(3000);
					imageView5.startAnimation(animation3D);
					if (m == -1) {
				        handler.sendEmptyMessageDelayed(1, 3000);
				        m++;
					}
			        handler.sendEmptyMessageDelayed(6, 3000);
					break;
				}
        	};
        };
        
        handler.sendEmptyMessageDelayed(6, 1000);
        
    }
    private int m = -1;
}

 

My3DAnimation.java

 

package com.anim;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Animation;
import android.view.animation.Transformation;

public class My3DAnimation extends Animation {
	
	private final float mFromDegrees;// 动画旋转的起始角度
	private final float mToDegrees;//动画旋转的结束角度
	private final float mCenterX;// 动画旋转原点的x坐标
	private final float mCenterY;// 动画旋转原点的y坐标
	private final float mDepthZ;// 在动画旋转时,在z轴上有一个来回的效果,该值表示在z轴上平移的最大距离
	private final boolean mReverse;// 如果为true,则动画反向旋转
	private Camera mCamera = new Camera();
	
	public My3DAnimation(float fromDegrees,float toDegrees,float centerX,float centerY,
			float depthZ,boolean reverse){
		mFromDegrees = fromDegrees;
		mToDegrees = toDegrees;
		mCenterX = centerX;
		mCenterY = centerY;
		mDepthZ = depthZ;
		mReverse = reverse;
	}
	
	// 该方法指定了动画每一帧的变换效果
	@Override
	protected void applyTransformation(float interpolatedTime, Transformation t) {
		// 参数说明:
		// interpolatedTime:代表动画执行的进度,为一个大于等于0,小雨等于1的浮点数
		// t:为动画变换的载体,该载体即为每一帧变换信息的载体,主要包含两个属性,
		//  1.Alpha:即该帧的透明度值  2. Matrix:图形变换信息,包含旋转,缩放,平移等信息
//		super.applyTransformation(interpolatedTime, t);
		final float fromDegrees = mFromDegrees;
		// 根据当前动画进度计算出当前转动的角度
		float degrees = fromDegrees+(mToDegrees - fromDegrees)*interpolatedTime;
		
		final float centerX = mCenterX;
		final float centerY = mCenterY;
		final Camera camera = mCamera;
		
		final Matrix matrix = t.getMatrix();
		camera.save();
		if (mReverse) {
			camera.translate(0.0f, 0.0f, mDepthZ*interpolatedTime);
		} else {
			camera.translate(0.0f, 0.0f, mDepthZ*(1.0f - interpolatedTime));
		}
		camera.rotateY(degrees);
		camera.getMatrix(matrix);
		camera.restore();
		// 根据对pre和post的理解(分别将变换效果置于变换最前和最后),
		// 结合Canvas变换中缩放原点的实现原理,即该动画会以(centerX,centerY)为原点在y轴上产生旋转效果
		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
	}
	
	/**
	 * Matrix介绍
	 * Matrix可以方便的设置各种图形 变换信息,使用Canvas的concat()方法将Matrix设置的
	 * 变换信息作用于Canvas上,实现变换效果,主要方法如下:
	 * setTranslate(float x, float y);设置平移信息,x和y分别表示在x轴和y轴上平移的距离
	 * setScale(float sx, float sy, float px, float py);设置缩放信息,sx和sy分别表示在x轴和y轴上的缩放倍数,px和py表示一个坐标,即缩放原点
	 * setRotate(float degrees, float px, float px);设置旋转信息,degrees为旋转角度,后两个参数表示旋转原点坐标
	 * setSinCos(float sinValue , float cosValue , float px , float py);利用sin或cos的值来表示转动的角度,后两位表示转动原点(z轴上的转动)
	 * setSkew(float kx, float ky, float px, float py);设置倾斜信息,kx和ky表示在x轴和y轴上想倾斜度,后两位为倾斜原点
	 * setConcat(Matrix a,Matrix b);将两个矩阵信息合并
	 * 每种变换方法都对应有pre和post两种方法,因为在Matrix中设置各种变换信息是有顺序的。
	 * 如:	preTranslate()是将该平移操作放置在最开始执行
	 * 		    postTranslate()是将该平移操作放置在最后执行
	 *
	 * Camera介绍
	 * Camera主要实现了三维的平移和旋转,主要方法如下:
	 * translate(float x,float y,float z);设置旋转信息,参数分别是在x,y,z轴上平移的角度
	 * rotateX(float degrees);以x轴为轴心旋转degrees角度
	 * rotateY(float degrees);以y轴为轴心旋转degrees角度
	 * rotateZ(float degrees);以z轴为轴心旋转degrees角度
	 * save(),restore(),用于保存和恢复变换的状态,当Camera变换完毕后,可将其变换值作用于Matrix上,使用Camera.getMatrix()方法
	 */
}

 

 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:background="#40ffffff">
	<ImageView
		android:id="@+id/imageview1"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/icon"></ImageView>
	<ImageView
		android:id="@+id/imageview2"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/icon" />
	<ImageView
		android:id="@+id/imageview3"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/icon" />
	<ImageView
		android:id="@+id/imageview4"
		android:layout_gravity="center"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/chat_input" />
	<ImageView
		android:id="@+id/imageview5"
		android:layout_gravity="center"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:src="@drawable/chat_input" />
</LinearLayout>

 

 

res/anim目录下的xml文件:

 

animation_alpha.xml

 

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
	android:fromAlpha="0.0"
	android:toAlpha="1.0"
	android:duration="1000" />

 

animation_roate.xml

 

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
	android:fromDegrees="0.0" android:toDegrees="-360.0"
	android:pivotX="50%" android:pivotY="50%"
	android:duration="3000" />
	<!-- 正数表示顺时针旋转 -->

 

animation_scale.xml

 

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
	android:fromXScale="2.0" android:toXScale="1.0"
	android:fromYScale="2.0" android:toYScale="1.0"
	android:pivotX="50%" android:pivotY="50%"
	android:duration="1000" />
	<!-- android:pivotX="" android:pivotY=""
		当我们用xml文件来定义缩放动画的时候,pivotX的值为浮点数时,缩放类型
		为Animation.ABSOLUTE,即缩放的轴心点为相对组件左上角的距离值,
		为百分比时,缩放类型为Animation.RELATIVE_TO_SELF,即相对组件本身大小的比例
		之来表示,,如上面的50%,当在后面加上一个p字母时,如50%p,
		则为Animation.RELATIVE_TO_PARENT ,以父组件的总长度来计算-->

 

animation_translate.xml

 

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
	android:fromXDelta="0.0" android:toXDelta="200.0"
	android:fromYDelta="0.0" android:toYDelta="200.0"
	android:duration="2000" />

 

animation_set.xml

 

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
	android:interpolator="@android:anim/accelerate_interpolator" >
	<alpha 
		android:fromAlpha="0.0"
		android:toAlpha="1.0"
		android:duration="1000" />
	<translate
		android:fromXDelta="0.0" android:toXDelta="200.0"
		android:fromYDelta="0.0" android:toYDelta="200.0"
		android:duration="1000" />
	<scale 
		android:fromXScale="2.0" android:toXScale="1.0"
		android:fromYScale="2.0" android:toYScale="1.0"
		android:pivotX="50%" android:pivotY="50%"
		android:duration="1000" />
</set>

 

 

 图片自己添加吧!

分享到:
评论

相关推荐

    Ophone应用开发权威指南 光盘源码

    总的来说,《Ophone应用开发权威指南》结合光盘源码,为开发者提供了一个全面的学习路径,从基础知识到高级技巧,从理论到实践,帮助开发者在Ophone平台上构建高效、稳定且用户体验优秀的应用。

    OPhone应用开发权威指南

    全书结合30多个经典案例,阐述了OPhone平台的运行环境、应用程序模型、用户界面与图形引擎、数据持久化存储方案、移动多媒体框架、Service、联网接口、高级通信技术以及访问硬件层能力等内容。在介绍OPhone这一崭新...

    ophone应用开发权威指南-光盘源码

    《Ophone应用开发权威指南》是一本专注于Ophone平台应用开发的专业书籍,其附带的光盘源码为读者提供了丰富的实践素材。Ophone是基于Android操作系统进行深度定制的一个中国移动主导的智能手机平台,它保留了Android...

    OPhone应用开发权威指南(黄晓庆)

    《OPhone应用开发权威指南》2010 黄晓庆 博文视点 broadview 第1章 OPhone平台概述 1 1.1 OPhone的架构 1 1.1.1 Linux内核 2 1.1.2 本地库 2 1.1.3 OPhone运行环境 3 1.1.4 Widget运行环境 3 1.1.5 应用程序框架 4 ...

    Android/OPhone 开发完全讲义源代码(2)

    1. **Activity管理**(可能在ch13中):Android应用程序的基本构建块之一,Activity代表用户界面的一个屏幕。开发者会学习如何创建、启动、暂停和销毁Activity,以及如何处理Activity间的切换。 2. **Intent使用**...

    Android OPhone 开发完全讲义

    《Android OPhone 开发完全讲义》不仅涵盖了Android和OPhone开发的基础知识,还深入介绍了各种高级技术,是一本非常全面且实用的开发指南。无论是对于初学者还是经验丰富的开发者而言,本书都具有很高的参考价值。

    OPhone应用开发权威指南第7,8章.pdf

    ### OPhone应用开发权威指南第7章:移动多媒体编程 #### 7.1 多媒体文件格式与编码 ##### 7.1.1 多媒体文件格式 在多媒体开发过程中,理解不同文件格式是非常关键的一步。文件格式定义了文件在物理存储上的组织...

    Android/Ophone开发完全讲义源码

    在Android和Ophone开发领域,源码是学习与探索系统工作原理、优化应用性能以及创新技术实践的关键资源。这份"Android/Ophone开发完全讲义源码"为开发者提供了丰富的学习材料,涵盖了Android和Ophone平台的基础到高级...

    Android/Ophone开发完全讲义

    在本讲义中,作者旨在帮助开发者从零基础开始,逐步掌握Android和Ophone应用开发的各个方面。 1. **Android系统概述**:Android是由Google领导的开放手机联盟开发的一款开源移动操作系统,以其丰富的功能和开放性...

    Android/OPhone开发完全讲义 Android 完整开放源代码

    《Android/OPhone开发完全讲义》是一本深入探讨Android和OPhone开发的综合性教材,主要针对想要在Android平台上进行应用程序开发的工程师和技术爱好者。这本书不仅涵盖了Android的基础知识,还涉及了OPhone这一中国...

    《Android/OPhone开发完全讲义》(上)

    《Android/OPhone开发完全讲义》...以上内容只是《Android/OPhone开发完全讲义》(上)的部分概览,实际书籍中会更详细地讲解每个知识点,并结合实例进行深入解析,帮助读者掌握Android和OPhone应用开发的全方位技能。

    《Android/OPhone开发完全讲义》(下)

    通过这本书的学习,读者不仅可以掌握Android和OPhone开发的基础知识,还能深入了解这两个平台的特性和最佳实践,从而成为一名出色的移动应用开发者。同时,开放源代码的特性意味着读者可以随时查阅和参考书中示例...

    《Android/OPhone开发完全讲义》源代码(ch02-ch10).zip

    3. 用户界面设计:Android使用XML来定义用户界面,例如使用LinearLayout、RelativeLayout、ConstraintLayout等布局管理器。源代码中可能会包含多种布局示例,展示如何组织和设计用户友好的界面。 4. 数据存储:...

    Android/Ophone开发完全讲义(中)

    《Android/Ophone开发完全讲义》是一本由著名IT教育专家李宁老师编著的专业教程,专注于Android和Ophone的移动应用开发。该教程详细涵盖了Android与Ophone平台的开发技术,旨在帮助开发者全面理解并掌握这两种操作...

    《Android应用开发揭秘》源码

     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...

    Android/Ophone开发完全讲义.rar

    《Android/Ophone开发完全讲义》是一份深入探讨Android与Ophone平台开发的综合性学习资料,其中包含了丰富的源码示例,旨在帮助开发者全面掌握这两种操作系统上的应用开发技能。源码是学习编程语言和理解软件架构的...

    《Android/OPhone开发完全讲义》一书的所有源代码

    通过这些源代码,读者不仅能学习到Android应用开发的基本概念,还能接触到实际项目中可能遇到的各种问题和解决方案。每个章节的代码都是精心设计的实验,旨在帮助开发者加深理解,并提升实际开发能力。对于初学者来...

    ophone应用开发

    在"OPhone 专题第二季v1.1.1.pdf"这个文件中,可能包含了更深入的教程和案例,涵盖了以上知识点的详细讲解,对于想要深入ophone应用开发的读者来说是一份宝贵的资源。通过系统学习和实践,开发者能够掌握ophone平台...

    android/ophone开发完全讲义

    《Android/Ophone开发完全讲义》是一本专为Android初学者设计的教程,全面涵盖了从基础到高级的Android应用开发知识。在第25章中,我们将会深入探讨如何利用Google GTalk服务来构建机器人应用,同时也会涉及到获取和...

    OPhone图形用户界面设计

    OPhone图形用户界面设计用户界面设计原则、用户界面设计核心概念、对话框 菜单、通知

Global site tag (gtag.js) - Google Analytics