浅谈Android 动画,带你进入动画的世界

背景:

其实我们Android 中大家都知道就那些东西,什么四大组件,activity,service,content provider,当然还有其东西,今天我也去总结了下,来说说Android 中动画这一模块,可能会有许多遗漏,希望大家见谅,多多给予补充。

一:老规矩了,先上效果图,没图没真相

二:Android Animation 内容的介绍

主要的内容包括以下

1.Animation      ------------ 动画

2.tween Animation     ------------------ 补间动画

3.AnimationSet     ---------------------- 动画集

4.interpolator  ------------------- 插值器

5.Frame Animation  -----------  帧动画

(1)Animation 简介

Animation是Android 中一个实现了ui界面动画的一个api ,它自身一提供了很多动画效果,有淡入淡出,旋转,缩放等很多很炫的动画,在Android 的很多控件中,都是可以使用它们的动画效果,实现起来非常的棒。

(2)Animation 分类

其实在Animation中,大致可以分为三类,其中一类包括

①:Tween Animation 补间动画

1.alpha表示的是:淡入

2.rotate表示的是:选装

3.scale表示的是:缩放

4.translate表示的是:移动

②:Fram Animation 帧动画

什么是帧动画那,帧动画就是在一定的时间内,可以按照自己设定的时间,在规定的时间内执行自己想要执行的动画。例如:在Android中gif动态图,就是帧动画,或者还有平时发的qq表情也是帧动画。

(3)Animation 的使用方法

1.创建AnimationSet对象

2.创建相应的补间动画(RotateAnimation等)对象

3.对相应的补间动画(RotateAnimation等)设置属性

4.将补间动画(RotateAnimation等)添加到AnimationSet中

5.使用控件的对象启动AnimationSet

(4)Animation 的具体实施

AlphaAnimation的使用:淡入淡出

代码:

<span style="font-family:SimSun;">AnimationSet animationSet = new AnimationSet(true);
		AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
		alphaAnimation.setDuration(1000);
		animationSet.addAnimation(alphaAnimation);
		image.startAnimation(animationSet);</span>

ps:在AlphaAnimation中有两个参数,分别是float的类型,其中1.0f---0.0f这个表示的是冲完全的透明到完全的不透明,当然你也可以设置其他,比如:反过来,那么就是从完全不透明到透明,也就是所说的淡出,或者我想让它,刚出来看起来比较模糊,可以设置什么0.1等等,这个随意发挥,第2行代码,就是用一个imageview控件去启动这个动画。

第一行:AnimationSet 参数

false:表示使用Animation本身的interpolator

true:表示使用自身的

ScaleAnimation的使用:缩放

代码:

<span style="font-family:SimSun;">AnimationSet animationSet = new AnimationSet(true);
		ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 0, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		scaleAnimation.setDuration(1000);
		animationSet.addAnimation(scaleAnimation);
		image.startAnimation(animationSet);</span>

ps:在ScaleAnimation 中

参数1:x轴的初始值

参数2:x轴缩略后的值

参数3:y轴的初始值

参数4:y轴缩略后的值

参数5:确定x轴的坐标类型

参数6:x轴的值,0.5代表控件的一半长度

参数7:确定y轴的坐标类型

参数8:y轴的值,0.5代表控件的一半长度

RotateAnimation的使用:旋转

代码:

<span style="font-family:SimSun;">AnimationSet animationSet = new AnimationSet(true);
		RotateAnimation rotateAnimation = new RotateAnimation(0, 360);
		rotateAnimation.setDuration(1000);
		animationSet.addAnimation(rotateAnimation);
		image.startAnimation(animationSet);</span>

ps:RotateAnimation中

参数1:开始选择的位置

参数2:选择多少度

TranslateAnimation的使用:移动

代码:

<span style="font-family:SimSun;">AnimationSet animationSet = new AnimationSet(true);
		TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f,
				Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f);
		translateAnimation.setDuration(1000);
		animationSet.addAnimation(translateAnimation);
		image.startAnimation(animationSet);</span></span>

ps:TranslateAnimation 中

参数1:x轴的开始位置

参数2:y轴的开始位置

参数3:x轴的结束位置

参数4:y轴的结束位置

(5)Animation的通用属性设置

<span style="font-family:SimSun;">setDuration(long durationMills);  // 设置动画的时长
setFillAfter(Boolean fillAfter);  // 执行动画结束之后,停留在执行结束后的状态
setFillBefore(Boolean fillBefore);  //  执行动画结束之后,停留在执行之前的状态
setStartOffset(long startOffset); //  在执行动画之前,等待多少时间
setRepeatCount(int repeatCount); // 动画执行多少次</span>
<span style="font-family:SimSun;">repeatMode(Boolean mode): // 顺序重复/倒序重复
</span>

(7)示例代码

<span style="font-family:SimSun;">package com.example.testdemo;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
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;

/**
 * 动画演示
 * @author zengtao 2015年6月10日 下午4:02:13
 *
 */
public class MainActivity extends Activity {

	private ImageView image;
	private Button alpha, scale, rotate, translate, start;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		initLinstener();
	}

	private void initLinstener() {
		alpha.setOnClickListener(onClickListener);
		scale.setOnClickListener(onClickListener);
		rotate.setOnClickListener(onClickListener);
		translate.setOnClickListener(onClickListener);
		start.setOnClickListener(onClickListener);
	}

	private void initView() {
		image = (ImageView) findViewById(R.id.image);
		alpha = (Button) findViewById(R.id.alpha);
		scale = (Button) findViewById(R.id.scale);
		rotate = (Button) findViewById(R.id.rotate);
		translate = (Button) findViewById(R.id.trans);
		start = (Button) findViewById(R.id.start);
	}

	private void alpha() {
		AnimationSet animationSet = new AnimationSet(true);
		AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
		alphaAnimation.setDuration(1000);
		animationSet.addAnimation(alphaAnimation);
		image.startAnimation(animationSet);
	}

	private void scale() {
		AnimationSet animationSet = new AnimationSet(true);
		ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.1f, 0, 0.1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		scaleAnimation.setDuration(1000);
		animationSet.addAnimation(scaleAnimation);
		image.startAnimation(animationSet);
	}

	private void rotate() {
		AnimationSet animationSet = new AnimationSet(true);
		RotateAnimation rotateAnimation = new RotateAnimation(0, 360);
		animationSet.addAnimation(rotateAnimation);
		image.startAnimation(animationSet);
	}

	private void translate() {
		AnimationSet animationSet = new AnimationSet(true);
		TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f,
				Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0.5f);
		translateAnimation.setDuration(1000);
		animationSet.addAnimation(translateAnimation);
		image.startAnimation(animationSet);
	}

	private void start() {
		AnimationSet animationSet = new AnimationSet(true);
		AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
		alphaAnimation.setDuration(1000);
		animationSet.addAnimation(alphaAnimation);
		RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		rotateAnimation.setDuration(1000);
		animationSet.addAnimation(rotateAnimation);
		image.startAnimation(animationSet);
	}

	OnClickListener onClickListener = new OnClickListener() {
		@Override
		public void onClick(View v) {
			if (v == alpha) {
				alpha();
			} else if (v == scale) {
				scale();
			} else if (v == rotate) {
				rotate();
			} else if (v == translate) {
				translate();
			} else if (v == start) {
				start();
			}
		}
	};
}
</span>

ps:以上的动画都是在代码中实现的,其实我们也可以在xml文件使用,让后借助于Animation的工具类

xml文件---只写一个,看看,其他都差不多,都是用相应的属性,来设置的

<span style="font-family:SimSun;"><?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator">
   <!--
       起始x轴坐标
           止x轴坐标
           始y轴坐标
           止y轴坐标
           轴的坐标
           轴的坐标
     -->
   <scale
       android:fromXScale="1.0"
       android:toXScale="0.0"
       android:fromYScale="1.0"
       android:toYScale="0.0"
       android:pivotX="50%"
       android:pivotY="50%"
       android:duration="1000"/>
</set></span>

代码:

<span style="font-family:SimSun;"> Animation animation = AnimationUtils.loadAnimation(
                  Animation1Activity.this, R.anim.scale);
           image.startAnimation(animation);</span>

ps:loadAnimation 方法

参数1:上下文,不用说

参数2:id代表的是你自己所写的xml文件id

以上呢,其实都只执行的单个动画效果,那么,如何执行多个动画效果了呢?

三:答案是:AnimationSet

1.AnimationSet是Animation的子类;

2.一个AnimationSet包含了一系列的Animation;

3.针对AnimationSet设置一些Animation的常见属性(如startOffset,duration等),可以被包含在AnimationSet当中的Animation集成;

例:一个AnimationSet中有两个Animation,效果叠加

在上面的代码中,其实,我们也使用到了AnimationSet但是,我们都是只添加了一个动画,所以,多个动画效果的添加,也是非常容易的。

代码:

<span style="font-family:SimSun;">private void start() {
		AnimationSet animationSet = new AnimationSet(true);
		AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
		alphaAnimation.setDuration(1000);
		animationSet.addAnimation(alphaAnimation);
		RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		rotateAnimation.setDuration(1000);
		animationSet.addAnimation(rotateAnimation);
		image.startAnimation(animationSet);
	}</span>

ps:改方法中,就是实现了动画的组合,以及用到了动画的一些属性,看起来也是非常才简单。

四:Interpolator的具体使用方法

Interpolator定义了动画变化的速率,在Animations框架当中定义了一下几种

InterpolatorAccelerateDecelerateInterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候速率快。

AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速

CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线

DecelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始减速LinearInterpolator:动画以均匀的速率改变

代码:

<span style="font-family:SimSun;">AnimationSet animationSet = newAnimationSet(true);
animationSet.setInterpolator(new AccelerateInterpolator());</span>

ps:这样呢,就能够将Interpolator插值器放入动画中了,在开启动画的过程中,就会添加相应想动画速度效果。Google给我们准备的还是非常的充分的,你能想到的,他基本都想到的,你想不到的,或许他都实现了,只是没有发现用法而已。

五:Fram Animation 帧动画

对于帧动画,我使用的不是很多,所有了解也不深,Frame Animation是一针一针的显示,先也举例子了,例如QQ表情什么,老电影等,接下来看下动画效果

效果图:

 小猫咪

这种效果便是一帧一帧的动画gif图

六:总结

以上呢,便见简单的说明了下动画的一些基本功能和使用,并不是太深入,只针对于基础了解动画者适合。

时间: 2024-10-13 01:11:15

浅谈Android 动画,带你进入动画的世界的相关文章

安卓开发_浅谈Android动画(四)

Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属性动画类 方法 描述 setDuration(long duration) 设置动画持续时间的方法 setEvaluator(TypeEvaluator value) 设置插值计算的类型 setInterpolator(TimeInterpolator value) 设置时间插值器的类型 addUp

浅谈Android多屏幕的事

浅谈Android多屏幕的事 一部手机可以同时看片.聊天,还可以腾出一支手来撸!这么吊的功能(非N版本,非第三方也能实现,你不知道吧)摆在你面前,你不享用?不关注它是怎样实现的?你来,我就满足你的欲望! 一部手机可以同时看片.聊天,还可以腾出一支手来撸==!就像这样: 是时候告别来回切换应用屏幕的酸爽了,还可以在分屏模式下两Activity间直接拖放数据! 好高大上的样子!这是怎么实现的?别急,我们一一道来: kitkat(4.4)版本对多任务分屏的实现 由于相关的代码和功能被封装及隐藏起来,所

浅谈 Android Service

 浅谈Android Service的基本用法: 关于Service最基本的用法自然是启动和停止操作. 启动Service有两种方式: 1.通过startService(Intent intent)方式启动,启动时会自动执行onCreate(),onStartCommand()方法. 2.通过bindService(Intent intent,ServiceConnection connection,int flag) 第一个参数是一个Intent对象,第二个参数是连接Service的实例,

浅谈Android五大布局

Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLayout(线性布局).FrameLayout(单帧布局).RelativeLayout(相对布局).AbsoluteLayout(绝对布局)和TableLayout(表格布局). LinearLayout: LinearLayout按照垂直或者水平的顺序依次排列子元素,每一个子元素都位于前一个元素之后

浅谈Android五大布局(二)——RelativeLayout和TableLayout

在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局RelativeLayout(相对布局)和TableLayout(表格布局)相对之前布局结构稍显复杂一点,所以这里另起篇幅进行介绍. RelativeLayout: RelativeLayout按照各子元素之间的位置关系完成布局.在此布局中的子元素里与位置相关的属性将生效.例如android:layout_be

浅谈Android onClick与onLongClick事件触发的问题

之前做按钮的点击事件一直没有注意一些细节,今天做了一个按钮需要有点击和长点击触发不同效果,直接让Activity implements OnClickListener, OnLongClickListener然后添加了相应的处理函数. @Override public void onClick(View v) { // TODO Auto-generated method stub } @Override public boolean onLongClick(View v) { // TODO

浅谈Android保护技术__代码混淆

浅谈Android保护技术__代码混淆 代码混淆 代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为.将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字.比如改写成单个字母,或是简短的无意义字母组合,甚至改写成"__"这样的符号,使得阅读的人无法根据名字猜测其用途.对于支持反射的语言,代码混淆有可能与反射发生冲突.代码混淆并不能真正阻止反向工程,只能增大其难度.因此,对于对安全性要求很高的场合,仅仅

浅谈Android五大布局(二)——RelativeLayout和TableLayout【转】

http://www.cnblogs.com/wisekingokok/archive/2011/08/24/2152004.html 在浅谈Android五大布局(一)中已经描述了LinearLayout(线性布局).FrameLayout(单帧布局)和AbsoulteLayout(绝对布局)三种布局结构,剩下的两种布局RelativeLayout(相对布局)和TableLayout(表格布局)相对之前布局结构稍显复杂一点,所以这里另起篇幅进行介绍. RelativeLayout: Relat

浅谈Android应用保护(二):Anti-Analysis的方法和工具

本文内容翻译自国外文献,原文链接请参看文章底部 之前讲到过,应用开发者为了保护自己的应用不被别人分析和篡改,会将应用的安全性寄托在某个(些)机制上.可以被用来保护应用的机制有很多,效果和实现难度也是各有特点.有这样一类应用保护方法,叫做针对逆向工具的对抗(Anti-Analysis). 针对逆向工具的对抗,简单来讲就是利用逆向工具自身的缺陷或者是Android特有的机制,使应用逆向分析工具在工作过程中失效或者报错崩溃,分析过程无法继续实施.从而达到保护应用的目的. 这种保护应用的方式的优点就是实

浅谈Android 事件分发机制(一)

在上一篇文章中,浅谈Android 事件分发机制(一),简要分析了一下事件分发机制的原理,总结一下就是事件层层传递,直到被消费,原理看似简单,但是在实际使用过程中,场景各不相同,复杂程度也就因产品而异,这篇文章就通过给view加移动来模拟事件分发. 触摸事件 这里涉及到几个与手指触摸相关的常见事件: 坐标系对于单指触控移动来说,一次简单的交互流程是这样的:手指落下(ACTION_DOWN) -> 移动(ACTION_MOVE) -> 离开(ACTION_UP) 坐标系 Android坐标系以手