Android三种动画的基本实现总结
来源:互联网 发布:淘宝互刷安全么 编辑:程序博客网 时间:2024/06/07 13:46
编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/76036753
前言
总的来说,Android动画可以分为两类,最初的传统动画和Android3.0 之后出现的属性动画(Property Animation);传动动画又分为两类,帧动画(Frame Animation)和补间动画(Tweened Animation)
Demo展示图片
布局代码
// (layout)activity_main.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/></RelativeLayout>----------------------------------------------------------------------------------------// (menu)main.xml<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/frameAnimation" android:showAsAction="never" android:title="FrameAnim"/> <item android:id="@+id/tweenAnimation_alpha" android:showAsAction="never" android:title="TweenAnim_alpha"/> <item android:id="@+id/tweenAnimation_rotate" android:showAsAction="never" android:title="TweenAnim_rotate"/> <item android:id="@+id/tweenAnimation_set" android:showAsAction="never" android:title="TweenAnim_set"/> <item android:id="@+id/propertyAnimation" android:showAsAction="never" android:title="PropertyAnim"/></menu>----------------------------------------------------------------------------------------// (drawable)frame_anim.xml 帧动画的xml文件<animation-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/pic1" android:duration="100"/> <item android:drawable="@drawable/pic2" android:duration="100"/> <item android:drawable="@drawable/pic3" android:duration="100"/> <item android:drawable="@drawable/pic4" android:duration="100"/> <item android:drawable="@drawable/pic5" android:duration="100"/> <item android:drawable="@drawable/pic6" android:duration="100"/> <item android:drawable="@drawable/pic7" android:duration="100"/> <item android:drawable="@drawable/pic8" android:duration="100"/> <item android:drawable="@drawable/pic9" android:duration="100"/> <item android:drawable="@drawable/pic10" android:duration="100"/> <item android:drawable="@drawable/pic11" android:duration="100"/> <item android:drawable="@drawable/pic12" android:duration="100"/> <item android:drawable="@drawable/pic13" android:duration="100"/> <item android:drawable="@drawable/pic14" android:duration="100"/> <item android:drawable="@drawable/pic15" android:duration="100"/></animation-list>----------------------------------------------------------------------------------------// (anim)anim_alpha.xml 补间动画的xml文件<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromAlpha="0.0" android:toAlpha="1.0" android:repeatCount="infinite" android:repeatMode="reverse" android:duration= "3000" android:fillAfter= "true"/><!--android:fillAfter= "true" 动画结束后,是否保留这个动画的最后一帧效果--><!--android:repeatCount="infinite" 表示重复次数为无限重复--><!--android:repeatMode="reverse" 表示倒序回放-->----------------------------------------------------------------------------------------// (anim)anim_rotate.xml 补间动画的xml文件<rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fillAfter="true" android:fromDegrees="0" android:pivotX="30%" android:pivotY="70%" android:repeatCount="infinite" android:repeatMode="reverse" android:toDegrees="120" android:interpolator="@android:anim/overshoot_interpolator"/><!--pivotX 设置动画执行的参考位置 默认是以左上角为中心进行旋转--><!--设置android:pivotX="50%" android:pivotY="50%" 表示沿中心旋转--><!--android:interpolator 设置系统中提供的动画插值器-->
activity代码
import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.content.Context;import android.graphics.drawable.AnimationDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.Menu;import android.view.MenuItem;import android.view.animation.AccelerateDecelerateInterpolator;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.AnimationUtils;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;public class MainActivity extends AppCompatActivity { private Context mContext = MainActivity.this; private ImageView mImageView; private AnimatorSet mAnimSet; private AnimationSet mAnimationSet; private Animation mAnimationRotate; private Animation mAnimationAlpha; private AnimationDrawable mDrawable; /** * 1,属性动画是真正实现了View的移动,补间动画对View的移动只是在不同地方绘制了一个影子,实际的对象还是处于原来的地方 * 2,使用帧动画需要注意,不要使用过多大图,容易导致内存不足 * 3,xml文件实现的补间动画,复用率极高.在Activity切换,窗口弹出时等情景中有着很好的效果 * 4,把动画的repeatCount设置为无限循环,如果在Activity退出时没有及时将动画停止,属性动画会导致Activity无法释放而导致内存泄漏, * 因此,使用属性动画时切记在Activity执行 onStop 方法时顺便将动画停止 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImageView = (ImageView) findViewById(R.id.imageView); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main , menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // 帧动画(用xml方式定义) case R.id.frameAnimation: mImageView.setImageResource(R.drawable.frame_anim); mDrawable = (AnimationDrawable) mImageView.getDrawable(); // 重复执行 mDrawable.setOneShot(false); // 开始帧动画 mDrawable.start(); break; // 单个补间动画(用xml方式定义) case R.id.tweenAnimation_alpha: // 4种形式: alpha(淡入淡出)translate(位移)scale(缩放大小)rotate(旋转) mAnimationAlpha = AnimationUtils.loadAnimation(mContext, R.anim.anim_alpha); mImageView.setImageResource(R.drawable.pic_1); mImageView.startAnimation(mAnimationAlpha); break; // 单个补间动画(用xml方式定义) // 用xml方式定义 方便代码复用 case R.id.tweenAnimation_rotate: // 4种形式: alpha(淡入淡出)translate(位移)scale(缩放大小)rotate(旋转) mAnimationRotate = AnimationUtils.loadAnimation(mContext, R.anim.anim_rotate); mImageView.setImageResource(R.drawable.pic_1); mImageView.startAnimation(mAnimationRotate); break; // 补间动画集合(用代码方式定义) // 用代码方式定义 方便属性值的动态调整 case R.id.tweenAnimation_set: mImageView.setImageResource(R.drawable.pic_1); mAnimationSet = new AnimationSet(mContext , null); ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.5f, 1.0f, 0.5f); scaleAnimation.setDuration(2000); // 设置动画插值器 控制动画的快慢节奏 scaleAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); scaleAnimation.setRepeatMode(Animation.REVERSE); scaleAnimation.setRepeatCount(Animation.INFINITE); TranslateAnimation translateAnimation = new TranslateAnimation(0f, 800f, 0f, 0f); translateAnimation.setDuration(3000); // 设置动画插值器 控制动画的快慢节奏 scaleAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); translateAnimation.setRepeatMode(Animation.REVERSE); translateAnimation.setRepeatCount(Animation.INFINITE); mAnimationSet.addAnimation(scaleAnimation); mAnimationSet.addAnimation(translateAnimation); mImageView.startAnimation(mAnimationSet); break; case R.id.propertyAnimation: mImageView.setImageResource(R.drawable.pic_1); // 更改旋转中心点位置 mImageView.setPivotX(mImageView.getWidth() / 2); mImageView.setPivotY(mImageView.getHeight()); // 沿(250 , 250)方向移动 旋转360度 ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(mImageView, "translationY", 0.0f, 250.0f, 0.0f); ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(mImageView, "translationX", 0.0f, 250.0f, 0.0f); ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(mImageView, "rotationY", 0.0f, 360.0f); objectAnimator1.setRepeatCount(ObjectAnimator.INFINITE); objectAnimator1.setRepeatMode(ObjectAnimator.REVERSE); objectAnimator2.setRepeatCount(ObjectAnimator.INFINITE); objectAnimator2.setRepeatMode(ObjectAnimator.REVERSE); objectAnimator3.setRepeatCount(ObjectAnimator.INFINITE); objectAnimator3.setRepeatMode(ObjectAnimator.REVERSE); // set 只设置播放方式,播放时间和开始播放 是否重复播放不受set控制 // 组合动画 mAnimSet = new AnimatorSet(); // 1 2先一同执行,3再执行(复杂动画需要分开一点点写) mAnimSet.play(objectAnimator1).with(objectAnimator2); mAnimSet.play(objectAnimator2).before(objectAnimator3); // 同时执行 // animSet.playTogether(objectAnimator1 , objectAnimator2 , objectAnimator3); // 依次执行 // animSet.playSequentially(objectAnimator1 , objectAnimator2 , objectAnimator3); mAnimSet.setDuration(3000); mAnimSet.setInterpolator(new AccelerateDecelerateInterpolator()); mAnimSet.start(); break; default: break; } return super.onOptionsItemSelected(item); } @Override protected void onStop() { super.onStop(); mImageView.clearAnimation(); mAnimSet.cancel(); mAnimationSet.cancel(); mAnimationRotate.cancel(); mAnimationAlpha.cancel(); mDrawable.stop(); }}
Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9909089
———-因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!———-
阅读全文
0 0
- Android三种动画的基本实现总结
- Android 三种动画的总结
- Android三种动画的实现
- Android三种动画的实现
- android三大动画的基本使用
- android三大动画的基本使用
- 三种基本动画
- 三种实现android加载进度条的动画效果
- Android 弹性动画的三种实现方式
- Android 弹性动画的三种实现方式
- Android 弹性动画的三种实现方式
- Android 弹性动画的三种实现方式
- Android的三种动画
- 基本动画的实现
- Android CircularReveal揭露动画三种实现
- Android动画的几种实现方式总结
- 基本的android 动画
- ios 三种基本动画
- @resource、@Autowired、@Service在一个接口多个实现类中的应用
- [LeetCode] 39. Combination Sum
- Elasticsearch 概括
- SIFT特征提取分析
- yuv转bmp说明
- Android三种动画的基本实现总结
- RecyclerView 添加header footer------(2)
- 搭建Linux环境的Java开发(Eclipse + maven)
- AtCoder Grand Contest 018
- HDU 1465 不容易系列之一
- 练习:运算符(水仙花数,个人所得税)
- RANSAC的系统介绍(1)——翻译
- 剖析整数,浮点数在内存中的存储
- socket网络编程ftp