`

Animation四种动画效果的了解

 
阅读更多

 

  Android JDK为我们提供了4种动画效果,分别是:

           AlphaAnimation         透明度动画效果 
           ScaleAnimation         缩放动画效果 
           TranslateAnimation   位移动画效果 
           RotateAnimation       旋转动画效果 

以下对四种效果做测试:

   1 Activity 代码

   

package com.example.layoutproperty;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * 动画测试 的Activity 
 * @author root
 * 问题:1 每次动画执行完成image会回到原来位置  需要设置: setFillAfter(true);
 *     2 动画停留在了结束位置的时候会闪一下子: 解决:需要每次执行完成清除动画,并且用layout重新布局image 
 *     3 2中的方法处理的时候动画结束,image还会闪一下才停留:解决:需要单独开启一个线程来处理 
 *     4 主线程中调用clearAnimation和cancelAnimation都会调用监听器中的动画End方法导致这个方法调用两次:解决:用handler来处理就不会执行两次,原因不知道为什么
 *     5 按钮执行动画的时候,如果每次new一个动画去执行,则会导致一次执行多个动画 
 *     
 *     
 */
public class AnimationActivity extends Activity {
	
	AnimationSet animationSet  = new AnimationSet(true); 
	ImageView image ;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_animation);
		
		Button startBtn  = (Button) findViewById(R.id.startBtn);
		Button endBtn  = (Button) findViewById(R.id.endBtn);
		
		image  = (ImageView) findViewById(R.id.img);
		
		startBtn.setOnClickListener(new BtnListener());
		endBtn.setOnClickListener(new BtnListener());
		
//		/取得屏幕信息 
		getScreen() ;
		
//		addTranslateAnimation();
//		addAlphaAnimation();
//		addScaleAnimation();
//		addRotateAnimation();
//		
//		Log.i("Animation==","执行动画开始");
//		animationSet.setDuration(3000);               //设置动画持续时间  
//		animationSet.setRepeatCount(2);               //设置重复次数  
//		animationSet.setRepeatMode(Animation.REVERSE);    //反方向执行  
//        image.setAnimation(animationSet);             //设置动画效果  
//        animationSet.setFillAfter(true);
//        animationSet.startNow();                      //启动动画  
//        animationSet.getAnimations().size();
        
	}
	
	public void getScreen(){
   		DisplayMetrics dm = new DisplayMetrics();
		this.getWindowManager().getDefaultDisplay().getMetrics(dm);
	 
		Log.i("Animation==",  "屏幕的宽高:"+dm.widthPixels+"  "+dm.heightPixels) ;
	}
	
	/**
	float fromXDelta 动画开始的点离当前View X坐标上的差值 
	float toXDelta 动画结束的点离当前View X坐标上的差值 
	float fromYDelta 动画开始的点离当前View Y坐标上的差值 
	float toYDelta 动画开始的点离当前View Y坐标上的差值 
	 */
	private void  addTranslateAnimation(){
		TranslateAnimation  translateAnimation=new TranslateAnimation(0,100,0,0);
//		translateAnimation.setDuration(1000);
//		image.setAnimation( translateAnimation );
//		translateAnimation.startNow();
		
		animationSet.addAnimation(translateAnimation );

	}

	// 透明度的变化
	/**
		fromAlpha:开始时刻的透明度,取值范围0~1。
		toAlpha:结束时刻的透明度,取值范围0~1。
		0.0是完全透明,1.0完全不透明。
	 */
	private void  addAlphaAnimation(){
		AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
		animationSet.addAnimation(alphaAnimation );
	}

	/**
	fromX:起始X坐标上的伸缩尺寸。 个人理解值为X方向从原来对象的几倍变化到几倍大小 ,如(0.5f, 3f)从0.5倍大小变化到3倍大小
	toX:结束X坐标上的伸缩尺寸。
	fromY:起始Y坐标上的伸缩尺寸。个人理解值为Y方向从原来对象的几倍变化到几倍大小 ,如(1, 0.5f)从1倍大小变化到0.5倍大小
	toY:结束Y坐标上的伸缩尺寸。
	pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
	pivotXValue:X坐标的伸缩值。   
	pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
	pivotYValue:Y坐标的伸缩值
	pivotXValue和pivotYValue:个人理解就是X和Y以哪个轴为中心变化,值的取值范围都为0-1 
	如:RELATIVE_TO_SELF: X 0为最左边  1为最右边  0.5为对象中直线 变化  ,Y的变化一样   0为最上面     0.5 为对象Y方向的中心 
	   ABSOLUTE:绝对位置  :当X值为100f时候,则变化的x轴为100f,Y值为20f则变化的Y轴为20f的位置  
	   RELATIVE_TO_PARENT 
	 */
	private void  addScaleAnimation(){
		ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 2f, 1, 2f,
				Animation.RELATIVE_TO_PARENT, 0.2f,
				Animation.RELATIVE_TO_PARENT, 0f);
		 
		animationSet.addAnimation(scaleAnimation );
	}
	//旋转特效
	/**
		fromDegrees:旋转的开始角度。
		toDegrees:旋转的结束角度。
		pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
		pivotXValue:X坐标的伸缩值。
		pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
		pivotYValue:Y坐标的伸缩值。
	 */
	
	private void  addRotateAnimation(){
		RotateAnimation rotateAnimation = new RotateAnimation(0, 360,
				Animation.RELATIVE_TO_PARENT, 0f,
				Animation.RELATIVE_TO_PARENT, 0.3f);
		animationSet.addAnimation(rotateAnimation );
	}
	
	class BtnListener implements View.OnClickListener{

		@Override
		public void onClick(View v) {
			 switch (v.getId()) {
					case R.id.startBtn:
						
						if(animationSet.getAnimations().size()==0){
//							addTranslateAnimation();
//							addAlphaAnimation();
//							addScaleAnimation();
							addRotateAnimation();
				 
							Log.i("Animation==","执行动画开始");
							animationSet.setDuration(2000);               //设置动画持续时间  
							//animationSet.setRepeatCount(1);               //设置重复次数  
							//animationSet.setRepeatMode(Animation.REVERSE);    //反方向执行  
				            image.setAnimation(animationSet);              
				            animationSet.setFillAfter(true);   // 则会停留在动画结束的状态 
							image.setAnimation(animationSet);   	//设置动画效果 
							animationSet.setAnimationListener( new MyAnimationListener() );	
						}
						image.startAnimation(animationSet);
			            //animationSet.startNow();           	//启动动画  
			           Log.i( "Animation==", "动画个数:"+ animationSet.getAnimations().size() );
			           
			           LinearLayout layout = (LinearLayout) image.getParent();
			           
			           Log.i( "Animation==", "父容器的宽高:"+ layout.getWidth()+"   "+layout.getHeight()  );
						break;
					case R.id.backBtn:
						Log.i("Animation==","执行动画返回");                      //启动动画  
			            
						break;
					default:
						Log.i("Animation==","执行动画结束按钮");
						//结束动画按钮
						animationSet.cancel();                        //取消动画执行 
						break;
			}
			
		}
		
	}
	
	
	
	
	class MyAnimationListener implements AnimationListener{

		@Override
		public void onAnimationStart(Animation animation) {
			// TODO Auto-generated method stub
//            int[] position = new int[2];
//            image.getLocationInWindow(position);
            
            Log.i("Animation: ", "getLocationInWindow start1 :" + image.getLeft() + "," + image.getTop()  );
//            Log.i("Animation: ", "getLocationInWindow start2:" + position[0] + "," + position[1] );
            
		}

		@Override
		public void onAnimationEnd(Animation animation) {
 
            Log.i("Animation: ", "getLocationInWindow end3======== :"  );
			
			  new Thread(){
					@Override
					public void run() {
						//handler.sendEmptyMessage(1);
					}
			  }.start();
		}

		@Override
		public void onAnimationRepeat(Animation animation) {
			
		}
		
	}
	//平移动画结束时,让对象停留在平移的位置 
	Handler handler = new Handler(){
		public void handleMessage(Message msg) {
            Log.i("Animation: ", "getLocationInWindow end2 :" + image.getLeft() + "," + image.getTop()  );
			 
            int left = image.getLeft() +100;//+(int)(p2-p1); 100 为每次平移的距离
            int top = image.getTop() ;
            int width = image.getWidth();
            int height = image.getHeight();
            image.clearAnimation();
            image.layout(left, top, left+width, top+height); 
		}
	};
}

  

2 xml代码 

  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
	<Button android:id="@+id/startBtn" android:layout_width="match_parent" 
	    android:layout_height="wrap_content" android:text="开始动画"/>
	<Button  android:id="@+id/endBtn" android:layout_width="match_parent" 
	    android:layout_height="wrap_content" android:text="结束动画"/>
	<Button  android:id="@+id/backBtn" android:layout_width="match_parent" 
	    android:layout_height="wrap_content" android:text="返回动画"/> 
	<ImageView android:id="@+id/img" 
	    android:layout_height="wrap_content" android:layout_width="wrap_content"
	    android:src="@drawable/ic_launcher"/>
	
</LinearLayout>

 

 

分享到:
评论

相关推荐

    一种使用Unity Animation的简单动画混合

    总的来说,Unity的Animation系统结合自定义的动画节点和控制逻辑,可以实现复杂而流畅的动画效果。这种简单动画混合的技术不仅可以提升游戏的视觉表现力,还能提高游戏开发的灵活性和可扩展性。开发者可以根据具体...

    android四种动画效果

    本文将详细介绍Android中的四种主要动画效果:旋转、淡入淡出、收缩以及更多其他类型的动画实例。 一、旋转动画(Rotation Animation) 旋转动画允许我们指定一个View在一定时间内围绕其轴线进行旋转。在Android中...

    LoadingAnimation 动画 加载动画

    在Android开发中,加载动画(Loading Animation)是一种常见的用户界面元素,它在应用程序进行后台处理或数据加载时向用户提供反馈,提升用户体验。本资源“LoadingAnimation 动画 加载动画”提供了一个加载动画实例...

    android的四种动画效果

    本文将深入探讨安卓系统的四种主要动画效果,它们分别是:属性动画(Property Animation)、视图动画(View Animation)、帧动画(Frame Animation)和过渡动画(Transition Animation)。这四种动画机制各有特点,...

    ASP.NET窗体动画效果

    标题中的"ASP.NET窗体动画效果"指的是在ASP.NET Web Forms中创建动态的、视觉吸引人的动画效果。描述中的源码演示了如何利用ASP.NET来实现这样的动画。 在ASP.NET Web Forms中,我们通常使用服务器控件和客户端脚本...

    Animation动画实例源代码

    本资源“Animation动画实例源代码”提供了一系列详细实例,帮助开发者深入了解和实践Android中的动画技术。这些实例适用于ADT(Android Development Toolkit)版本10及ECLIPSE JUNO开发环境。 Android动画主要包括...

    动画包_animation动画效果_源码

    "动画包_animation动画效果_源码"这个资源包,显然是为了帮助开发者理解和实现各种动画效果而准备的。它可能包含了一系列使用了Android内置的animation库编写的示例代码。下面将详细讨论Android中的动画技术及其重要...

    CSS3 animation超酷网页Loading加载进度条动画效果

    本文将深入探讨如何利用CSS3的animation属性制作出超酷的网页Loading加载进度条动画效果。 首先,我们需要了解CSS3的animation属性。CSS3的animation属性是一组属性的简写形式,包括`animation-name`、`animation-...

    css3 animation酷炫的文字动画特效

    在这个主题中,我们将关注如何将这些技术应用于文字,创造出引人入目的动画效果。 首先,我们需要了解CSS3 Animation的基础。这包括定义关键帧(@keyframes)规则,设置动画属性(如duration、delay、iteration-...

    动画animation

    要深入学习和理解这些动画,你需要解压文件并查看其中的内容,包括HTML、CSS和JavaScript文件,以了解它们如何协同工作来创建动画效果。同时,也可以分析GIF图片,观察其帧序列,进一步理解动画原理。

    继承Animation自定义动画

    此外,使用`ObjectAnimator`或`ValueAnimator`等属性动画API,可以更方便地创建复杂的动画效果,虽然这不是基于`Animation`的,但它们可以与`Animation`结合使用,丰富我们的动画库。 总结,继承`Animation`自定义...

    Android项目源码BaseAnimation数百种动画效果集合_androidanimation_disappeard64_

    "Android项目源码BaseAnimation数百种动画效果集合" 是一个专门针对Android平台的动画库,它包含了大量预设的动画效果,帮助开发者快速集成到自己的应用程序中,提升应用的交互性和视觉吸引力。 首先,我们要了解...

    animation的4种效果

    本文将详细探讨标题中提到的四种动画效果:淡入淡出、左右移动进入和退出、图片切换以及内存管理。 首先,我们来了解一下“淡入淡出”效果。在Android中,我们可以使用`AlphaAnimation`类来实现这种效果。`...

    动画 线程 花瓣飘落的效果 animation

    在提供的"AnimationThread"文件中,可能包含了实现这种动画效果的具体代码示例。通常,线程在这里的作用是避免UI线程被长时间占用,通过在后台线程进行计算,然后将结果同步到UI线程显示,确保应用的流畅运行。 ...

    android动画介绍之 自定义Animation动画

    `Animation`类并不直接改变View的状态,而是计算出每个时刻View应该具有的属性值,然后通过重绘来实现动画效果。 二、创建自定义Animation 要创建自定义`Animation`,首先需要继承`Animation`类,并重写以下几个...

    Animation 动画详解

    本文将详细解析Android中的Animation机制,包括alpha、scale、translate、rotate四种基本动画类型以及set的XML属性和用法。 首先,我们来了解**alpha动画**,它主要用于控制视图的透明度。在XML中,我们可以设置`...

    CSS3 animation属性制作逼真的大风车旋转动画

    CSS3的Animation属性是现代网页设计中的一个重要工具,它使得开发者能够创建复杂的动态效果,如平滑的过渡、动画序列等,而无需依赖JavaScript或者其他外部库。在本案例中,我们将深入探讨如何使用CSS3的animation...

    使用animation实现魔方动画

    通过这个实践,你不仅能够掌握CSS3的`animation`属性,还能了解到如何通过HTML和CSS创建3D效果,这对于提升前端开发技能非常有帮助。在不断探索和实践中,你将能够创造出更加生动、有趣的网页动画。

    Android中数百种动画效果源码

    "Android中数百种动画效果源码"这个项目,无疑是一个宝贵的资源库,包含了大量预设的动画效果,为开发者提供了丰富的参考和学习素材。 首先,我们来了解一下Android中的动画类型。Android动画主要分为两种:属性...

    android动画例子:tween animation and property animation

    在实际开发中,Tween Animation更适合简单的视图变换,而Property Animation则适合复杂且高度定制的动画效果。了解并熟练掌握这两种动画机制,可以极大地提高Android应用的视觉吸引力和用户体验。通过示例项目...

Global site tag (gtag.js) - Google Analytics