本文主要是介绍tween和frame 动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Android中的动画类型有两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。下面将一一详细介绍:
本博客参考自网络,结合自己一点理解,实为学习之用,不为其他目的。
一,Tween动画
又称“补间动画”、“中间动画”,最早接触Tween类是在学习Flash时候,使用ActionScript做动画的时候,使用过类Tween。
Tween动画主要的功能是在绘制动画前设置动画绘制的轨迹,包括时间, 位置 ,等等。但是Tween动画的缺点是它只能设置起始点与结束点的两帧,中间过程全部由系统帮我们完成。所以在帧数比较多的游戏开发中是不太会用到它的。
Tween一共提供了4中动画的效果
Scale:缩放动画
Rotate:旋转动画
Translate:移动动画
Alpha::透明渐变动画
Tween与Frame动画类似都需要在res\anim路径下创建动画的 布局文件
1)Scale动画
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.Button;
- import android.widget.ImageView;
- public class ScaleActivity extends Activity {
- Button mButton0 = null;//缩小动画
- Button mButton1 = null;//放大动画
- ImageView mImageView = null; //显示动画
- Animation mLitteAnimation = null; //缩小动画
- Animation mBigAnimation = null; //放大动画
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.scale);
- mImageView = (ImageView)findViewById(R.id.imageView);
- /**加载缩小与放大动画**/
- mLitteAnimation = AnimationUtils.loadAnimation(this, R.anim.scalelitte);
- mBigAnimation = AnimationUtils.loadAnimation(this, R.anim.scalebig);
- mButton0 = (Button)findViewById(R.id.button0);
- mButton0.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- /**播放缩小动画**/
- mImageView.startAnimation(mLitteAnimation);
- }
- });
- mButton1 = (Button)findViewById(R.id.button1);
- mButton1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- /**播放放大动画**/
- mImageView.startAnimation(mBigAnimation);
- }
- });
- }
- }
- <scale>标签为缩放节点
- android:fromXscale="1.0" 表示开始时X轴缩放比例为 1.0 (原图大小 * 1.0 为原图大小)
- android:toXscale="0.0" 表示结束时X轴缩放比例为0.0(原图大小 *0.0 为缩小到看不见)
- android:fromYscale="1.0" 表示开始时Y轴缩放比例为 1.0 (原图大小 * 1.0 为原图大小)
- android:toYscale="0.0" 表示结束时Y轴缩放比例为0.0(原图大小 *0.0 为缩小的看不到了)
- android:pivotX="50%" X轴缩放的位置为中心点
- android:pivotY="50%" Y轴缩放的位置为中心点
- android:duration="2000" 动画播放时间 这里是2000毫秒也就是2秒
/anim/scalelitte.xml
- <?xml version="1.0" encoding="utf-8"?>
- <scale
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromXScale="0.0"
- android:toXScale="1.0"
- android:fromYScale="0.0"
- android:toYScale="1.0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="2000">
- </scale>
- <?xml version="1.0" encoding="utf-8"?>
- <scale xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromXScale="1.0"
- android:toXScale="0.0"
- android:fromYScale="1.0"
- android:toYScale="0.0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="2000">
- </scale>
如果在代码中,加载动画,而不用xml配置动画
- mLitteAnimation = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f,
- Animation.RELATIVE_TO_SELF, 0.5f,
- Animation.RELATIVE_TO_SELF, 0.5f);
- mLitteAnimation.setDuration(2000);
2)Rotate旋转动画
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.Button;
- import android.widget.ImageView;
- public class RotateActivity extends Activity {
- /**向左旋转动画按钮**/
- Button mButton0 = null;
- /**向右旋转动画按钮**/
- Button mButton1 = null;
- /**显示动画的ImageView**/
- ImageView mImageView = null;
- /**向左旋转动画**/
- Animation mLeftAnimation = null;
- /**向右旋转动画**/
- Animation mRightAnimation = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.retate);
- /**拿到ImageView对象**/
- mImageView = (ImageView)findViewById(R.id.imageView);
- /**加载向左与向右旋转动画**/
- mLeftAnimation = AnimationUtils.loadAnimation(this, R.anim.retateleft);
- mRightAnimation = AnimationUtils.loadAnimation(this, R.anim.retateright);
- mButton0 = (Button)findViewById(R.id.button0);
- mButton0.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- /**播放向左旋转动画**/
- mImageView.startAnimation(mLeftAnimation);
- }
- });
- mButton1 = (Button)findViewById(R.id.button1);
- mButton1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- /**播放向右旋转动画**/
- mImageView.startAnimation(mRightAnimation);
- }
- });
- }
- }
- <rotate>标签为旋转节点
- Tween一共为我们提供了3种动画渲染模式。
- android:interpolator="@android:anim/accelerate_interpolator" 设置动画渲染器为加速动画(动画播放中越来越快)
- android:interpolator="@android:anim/decelerate_interpolator" 设置动画渲染器为减速动画(动画播放中越来越慢)
- android:interpolator="@android:anim/accelerate_decelerate_interpolator" 设置动画渲染器为先加速在减速(开始速度最快 逐渐减慢)
- 如果不写的话 默认为匀速运动
- android:fromDegrees="+360"设置动画开始的角度
- android:toDegrees="0"设置动画结束的角度
- 这个动画布局设置动画将向左做360度旋转加速运动。
/anim/retateleft.xml
- <?xml version="1.0" encoding="utf-8"?>
- <rotate xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromDegrees="+360"
- android:toDegrees="0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="2000"
- />
- <?xml version="1.0" encoding="utf-8"?>
- <rotate xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/decelerate_interpolator"
- android:fromDegrees="0"
- android:toDegrees="+360"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="2000"
- />
- mLeftAnimation = new RotateAnimation(360.0f, 0.0f,
- Animation.RELATIVE_TO_SELF, 0.5f,
- Animation.RELATIVE_TO_SELF, 0.5f);
- mLeftAnimation.setDuration(2000);
3)Translate移动动画
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.ImageView;
- public class TranslateActivity extends Activity {
- /**显示动画的ImageView**/
- ImageView mImageView = null;
- /**移动动画**/
- Animation mAnimation = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.translate);
- /**拿到ImageView对象**/
- mImageView = (ImageView)findViewById(R.id.imageView);
- /**加载移动动画**/
- mAnimation = AnimationUtils.loadAnimation(this, R.anim.translate);
- /**播放移动动画**/
- mImageView.startAnimation(mAnimation);
- }
- }
- <?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"
- >
- <ImageView
- android:id="@+id/imageView"
- android:src="@drawable/images"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <translate xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromXDelta="0"
- android:toXDelta="320"
- android:fromYDelta="0"
- android:toYDelta="480"
- android:duration="2000"
- android:repeatCount="infinite"
- />
说明:
- <?xml version="1.0" encoding="utf-8"?>
- <translate xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromXDelta="0"
- android:toXDelta="320"
- android:fromYDelta="0"
- android:toYDelta="480"
- android:duration="2000"
- android:repeatCount="infinite"
- />
代码中加载动画:
- mAnimation = new TranslateAnimation(0, 320, 0, 480);
- mAnimation.setDuration(2000);
4 )Alpha:透明渐变动画
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.ImageView;
- public class AlphaActivity extends Activity {
- /**显示动画的ImageView**/
- ImageView mImageView = null;
- /**透明动画**/
- Animation mAnimation = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.translate);
- /**拿到ImageView对象**/
- mImageView = (ImageView)findViewById(R.id.imageView);
- /**加载透明动画**/
- mAnimation = AnimationUtils.loadAnimation(this, R.anim.alpha);
- /**播放透明动画**/
- mImageView.startAnimation(mAnimation);
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <alpha xmlns:android="http://schemas.android.com/apk/res/android"
- android:fromAlpha="1.0"
- android:toAlpha="0.0"
- android:repeatCount="infinite"
- android:duration="2000">
- </alpha>
说明:
- <alpha>标签为alpha透明度节点
- android:fromAlpha="1.0" 设置动画起始透明度为1.0 表示完全不透明
- android:toAlpha="0.0"设置动画结束透明度为0.0 表示完全透明
- 也就是说alpha的取值范围为0.0 - 1.0 之间
手动加载动画:
- mAnimation = new AlphaAnimation(1.0f, 0.0f);
- mAnimation.setDuration(2000);
5)综合动画
可以将上面介绍的4种动画设置在一起同时进行播放,那么就须要使用<set>标签将所有须要播放的动画放在一起。
这个动画布局设置动画同时播放移动、渐变、旋转。
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.animation.Animation;
- import android.view.animation.AnimationUtils;
- import android.widget.ImageView;
- public class AllActivity extends Activity {
- ImageView mImageView = null;
- Animation mAnimation = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.translate);
- mImageView = (ImageView)findViewById(R.id.imageView);
- mAnimation = AnimationUtils.loadAnimation(this, R.anim.all);
- mImageView.startAnimation(mAnimation);
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android">
- <rotate
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromDegrees="+360"
- android:toDegrees="0"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="2000"
- android:repeatCount="infinite"
- />
- <alpha android:fromAlpha="1.0"
- android:toAlpha="0.0"
- android:repeatCount="infinite"
- android:duration="2000">
- </alpha>
- <translate
- android:fromXDelta="0"
- android:toXDelta="320"
- android:fromYDelta="0"
- android:toYDelta="480"
- android:duration="2000"
- android:repeatCount="infinite"
- />
- </set>
二,AnimationDrable实现Frame动画(设计游戏专用,嘎嘎嘎)感谢宣教主分享
- import android.app.Activity;
- import android.graphics.drawable.AnimationDrawable;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.RadioButton;
- import android.widget.RadioGroup;
- import android.widget.SeekBar;
- import android.widget.SeekBar.OnSeekBarChangeListener;
- public class SimpleActivity extends Activity {
- /**播放动画按钮**/
- Button button0 = null;
- /**停止动画按钮**/
- Button button1 = null;
- /**设置动画循环选择框**/
- RadioButton radioButton0= null;
- RadioButton radioButton1= null;
- RadioGroup radioGroup = null;
- /**拖动图片修改Alpha值**/
- SeekBar seekbar = null;
- /**绘制动画View**/
- ImageView imageView = null;
- /**绘制动画对象**/
- AnimationDrawable animationDrawable = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.simple);
- /**拿到ImageView对象**/
- imageView = (ImageView)findViewById(R.id.imageView);
- /**通过ImageView对象拿到背景显示的AnimationDrawable**/
- animationDrawable = (AnimationDrawable) imageView.getBackground();
- /**开始播放动画**/
- button0 = (Button)findViewById(R.id.button0);
- button0.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- /**播放动画**/
- if(!animationDrawable.isRunning()) {
- animationDrawable.start();
- }
- }
- });
- /**停止播放动画**/
- button1 = (Button)findViewById(R.id.button1);
- button1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- /**停止动画**/
- if(animationDrawable.isRunning()) {
- animationDrawable.stop();
- }
- }
- });
- /**单次播放**/
- radioButton0 = (RadioButton)findViewById(R.id.checkbox0);
- /**循环播放**/
- radioButton1 = (RadioButton)findViewById(R.id.checkbox1);
- /**单选列表组**/
- radioGroup = (RadioGroup)findViewById(R.id.radiogroup);
- radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(RadioGroup radioGroup, int checkID) {
- if(checkID == radioButton0.getId()) {
- //设置单次播放
- animationDrawable.setOneShot(true);
- }else if (checkID == radioButton1.getId()) {
- //设置循环播放
- animationDrawable.setOneShot(false);
- }
- //发生改变后让动画重新播放
- animationDrawable.stop();
- animationDrawable.start();
- }
- });
- /**监听的进度条修改透明度**/
- seekbar = (SeekBar)findViewById(R.id.seekBar);
- seekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
- @Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean frameTouch) {
- /**设置动画Alpha值**/
- animationDrawable.setAlpha(progress);
- /**通知imageView 刷新屏幕**/
- imageView.postInvalidate();
- }
- });
- }
- }
/layout/simple.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"
- >
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- >
- <Button
- android:id="@+id/button0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="播放动画"
- />
- <Button
- android:id="@+id/button1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="停止动画"
- />
- </LinearLayout>
- <RadioGroup android:id="@+id/radiogroup"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <RadioButton
- android:id="@+id/checkbox0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:checked="true"
- android:text="单次播放"
- />
- <RadioButton
- android:id="@+id/checkbox1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="循环播放"
- />
- </RadioGroup>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="拖动进度条修改透明度(0 - 255)之间"
- />
- <SeekBar
- android:id="@+id/seekBar"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:max="256"
- android:progress="256"/>
- <ImageView
- android:id="@+id/imageView"
- android:background="@anim/animation"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
- <item android:drawable="@drawable/a" android:duration="100" />
- <item android:drawable="@drawable/b" android:duration="100" />
- <item android:drawable="@drawable/c" android:duration="100" />
- <item android:drawable="@drawable/d" android:duration="100" />
- <item android:drawable="@drawable/e" android:duration="100" />
- <item android:drawable="@drawable/f" android:duration="100" />
- <item android:drawable="@drawable/g" android:duration="100" />
- <item android:drawable="@drawable/h" android:duration="100" />
- <item android:drawable="@drawable/i" android:duration="100" />
- <item android:drawable="@drawable/j" android:duration="100" />
- </animation-list>
这是一个比较简单的布局文件,应该都能看懂吧。 我主要说一下 最后的这个 ImageView, 它就是用来显示我们的动画。 这里使用android:background="@anim/animation"设置这个ImageView现实的背景为一个动画,动画资源的路径为res/anim/animation.xml ,当然 设置background同样也可以在代码中设置。
- imageView.setBackgroundResource(R.anim.animation);
通过getBackground方法就可以拿到这个animationDrawable对象。
- /**拿到ImageView对象**/
- imageView = (ImageView)findViewById(R.id.imageView);
- /**通过ImageView对象拿到背景显示的AnimationDrawable**/
- animationDrawable = (AnimationDrawable) imageView.getBackground();
AnimationDrawable 就是用来控制这个帧动画,这个类中提供了很多方法。
animationDrawable.start(); 开始这个动画
animationDrawable.stop(); 结束这个动画
animationDrawable.setAlpha(100);设置动画的透明度, 取值范围(0 - 255)
animationDrawable.setOneShot(true); 设置单次播放
animationDrawable.setOneShot(false); 设置循环播放
animationDrawable.isRunning(); 判断动画是否正在播放
animationDrawable.getNumberOfFrames(); 得到动画的帧数。
宣教主警戒:拖动进度条设置Alpha值的时候 一定要使用 imageView.postInvalidate(); 方法来通知UI线程重绘屏幕中的imageView 否则会看不到透明的效果 。这里切记切记~~
谢谢CSDN博主宣雨松,牛人一枚。以后还会多多向他学习。
这篇关于tween和frame 动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!