DrawableAnimation 代表的动画默认是不播放的,必须在程序中启动动画播放才可以。
播放 start()
停止 stop()
实现:DrawableAnimation 通过把图片设置成ImageView的背景实现动画效果
代码通过获取tup的背景(就是anim里面的帧)获取到强转然后可以开启(start)关闭(stop)
AnimationDrawable drawable=(AnimationDrawable) tup.getBackground();
一旦在程序中通过通过AnimationUtils得到代表补间动画的Animation之后,接下来就可以调用View的startAnimation()方法开始对View执行动画了
Animation anim = AnimationUtils
.loadAnimation(context, R.anim.donghua);
view.startAnimation(anim);
注:imageView1.startAnimation(animation);当前动画没有执行完就会被下一个给替换掉
animator.start();方法可以一起同时用
来看代码补间动画
package com.example.tweenanimation;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
public class MainActivity extends Activity {
ImageView imageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView1 = (ImageView) findViewById(R.id.imageView1);
}
public void AlphaAnimation1(View v) {
// 创建AlphaAnimation(透明动画)的对象参数1是开始状态2时结束状态
AlphaAnimation animation = new AlphaAnimation(1, 0);
// 设置时间
animation.setDuration(3000);
// 设置循环次数
animation.setRepeatCount(1);
// 设置循环模式Animation.REVERSE是把循环第二个的AlphaAnimation参数反过来
animation.setRepeatMode(Animation.REVERSE);
// 开启动画
imageView1.startAnimation(animation);//给图片设置动画
}
public void ScaleAnimation1(View v) {
// 1是原始大小0是没有
ScaleAnimation scaleAnimation = new ScaleAnimation(1, 2, 1, 2,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
scaleAnimation.setDuration(2000);
imageView1.startAnimation(scaleAnimation);
}
public void TranslateAnimation1(View v) {
//0是坐标
TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100);
animation.setDuration(2000);
imageView1.startAnimation(animation);
}
public void RotateAnimation1(View v) {
RotateAnimation rotateAnimation = new RotateAnimation(1, 360, 1, 0.5f,
1, 0.5f);
rotateAnimation.setDuration(3000);
imageView1.startAnimation(rotateAnimation);
}
public void jihe(View v) {
// 创建集合对象
AnimationSet set = new AnimationSet(true);
AlphaAnimation animation = new AlphaAnimation(1, 0);
TranslateAnimation animation2 = new TranslateAnimation(0, 0, 0, 100);
set.addAnimation(animation);
set.addAnimation(animation2);
set.setDuration(3000);
imageView1.startAnimation(set);
}
public void caru(View v) {
TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100);
animation.setDuration(2000);
animation.setInterpolator(new AccelerateInterpolator());// 开始较慢后来快
animation.setInterpolator(new CycleInterpolator(2));// 正弦曲线改变
imageView1.startAnimation(animation);
}
}
xml
上面都是补间动画四个效果
帧动画
package com.example.frameanimation;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class MainActivity extends Activity {
AnimationDrawable drawable;
ImageView tup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tup=(ImageView) findViewById(R.id.tup);
drawable=(AnimationDrawable) tup.getBackground();
}
public void open(View v){
drawable.start();
}
public void close(View v){
drawable.stop();
}
}
xml写
在res下新建一个文件夹anim然后写xml文件
结合使用通过anim文件xml
在代码用
Animation anim=AnimationUtils.loadAnimation(this, R.anim.jiehe);得到对象
tup2.startAnimation(anim);设置图片的动画
切换Activity动画
startActivity(new Intent(this,Main2Activity.class));
overridePendingTransition(R.anim.enter, R.anim.tui);//先退后进
enter的xml代码
tui的xml代码
这就设置了开启另一个页面的动画
然后在设置一下另一个页面返回动画
当页面切换时就是页面暂停所以在onPause写,当页面快要被停止销毁了写就没用了
@Override
protected void onPause() {
// TODO Auto-generated method stub
overridePendingTransition(R.anim.enter2, R.anim.tui2);
super.onPause();
}
enter2
tui2
效果就是像Viewpager一样水平切换
属性动画
ObjectAnimator
ObjectAnimator object = ObjectAnimator.ofFloat(btObject, "RotationY", 360f);
object.setDuration(2000);
object.start();
属性动画也可以用AnimationSet动画集合来执行多个动画
package com.example.frameanimation;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
public class Main2Activity extends Activity {
ImageView imageView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
imageView1 = (ImageView) findViewById(R.id.imageView1);
}
public void zhi(View v) {
ValueAnimator ofFloat = ValueAnimator.ofFloat(0, 200);//可以穿多个0-200-360...
ofFloat.setTarget(imageView1);// 设置目标
ofFloat.setDuration(3000);// 延迟时间
ofFloat.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
float animatedValue = (Float) animation.getAnimatedValue();
imageView1.setTranslationX(animatedValue);// 移动
imageView1.setRotation(animatedValue);
}
});
ofFloat.start();// 开启
}
public void ob(View v) {
// 参数1:使用动画的对象,2是使用动画的属性名,3是更改的值Float..
// ObjectAnimator.ofFloat(imageView1, "alpha", 0,
// 1).setDuration(3000).start();
// 2如果是随便写的话不起任何效果
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView1, "aaa", 0,
1);
// 当你的动画发生改变时我们要实现的功能
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 动画运行时我们要拿到中间值animatedValue
float animatedValue = (Float) animation.getAnimatedValue();
// 当你的动画更改是我们要实现其他的功能
imageView1.setScaleX(animatedValue);// 设置了x的0-1缩放瘦正常
imageView1.setScaleY(animatedValue);
imageView1.setAlpha(animatedValue);// 设置了隐藏
}
});
animator.setDuration(3000);
animator.start();
}
}
xml
// AnimatorInflater.loadAnimator(context, id);//用来加载布局中属性动画
// 用他的对象调用settarget(控件)
android:oneshot="false"设置循环一次
set.setFillAfter(true);//设置最后一针为针
可以用setAnimationListener监听动画来监听动画的结束
Android Matrix动画详解
https://blog.csdn.net/flash129/article/details/8234599
除平移变换(Translate)外,旋转变换(Rotate)、缩放变换(Scale)和错切变换(Skew)都可以围绕一个中心点来进行,如果不指定,在默认情况下是围绕(0, 0)来进行相应的变换的
https://blog.csdn.net/zhanhong39/article/details/78956553
属性动画https://blog.csdn.net/u011200844/article/details/44594263
给动画设置监听setAnimationListener然后结束操作等
player.startAnimation(anim);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
// TODO Auto-generated method stub
finish();
}
});