Android自定义视图动画(二)

一)混合动画效果

一个视图可以混合多种动画类型形成新的混合效果,使用AnimationSet类实现,与单个动画不同的是,AnimationSet()的参数要指定是否共用动画补间,动画补间是指一个动画在执行过程的属性,比如匀速执行或者加速执行,减速执行这些属性;然后使用AnimationSet类的addAnimation()添加视图动画。这里以一个按钮视图为例,在代码里和在资源文件里实现的效果是一样的

1)在代码中实现

          private AnimationSet as;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	
		as=new AnimationSet(true);//参数为是否共用动画补间
		as.setDuration(2000);
		
		AlphaAnimation aa=new AlphaAnimation(0, 1);
		aa.setDuration(2000);
		as.addAnimation(aa);
		
		TranslateAnimation ta=new TranslateAnimation(0, 50, 0,50);
		ta.setDuration(2000);
		as.addAnimation(ta);
		
		findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
                	//v.startAnimation(as);		
				v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,
						R.anim.as));
			}
		});
			
		
	}


2)在xml里实现

新建xml文件,Root Element选择set,Resourced Typed选择Tween Animation

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="true"
    android:duration="2000" >
    
    <alpha
        android:fromAlpha="0"
        android:toAlpha="1" />
    
    <translate 
        android:fromXDelta="0"
        android:toXDelta="50"
        android:fromYDelta="0"
        android:toYDelta="50"/>
</set>

然后再代码里添加一行

v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.as));


二)动画效果侦听

我们可以给动画效果设置监听事件,监听事件里会重写三个方法,可以监听到动画的不同时期,通过重写这些方法,动画的不同时期可以进行操作,比如下面在动画结束的时候弹出一个Toast,同理也可以在开始的时候或者重复的时候执行一些操作

findViewById(R.id.btn).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
               //v.startAnimation(as);		
				
				Animation a=AnimationUtils.loadAnimation(MainActivity.this,R.anim.as);
				v.startAnimation(a);
				
				a.setAnimationListener(new AnimationListener() {
					
					@Override
					public void onAnimationStart(Animation animation) {
					}
					
					@Override
					public void onAnimationRepeat(Animation animation) {
					}
					
					@Override
					public void onAnimationEnd(Animation animation) {
 						Toast.makeText(MainActivity.this, "动画结束",Toast.LENGTH_SHORT).show();
					}
				});
				
				
			}
		});
			


三)自定义动画效果

新建类custom继承Aniamtion

在视图动画的执行过程里,有一个方法会一直执行,就是applyTransformation(float interpolatedTime, Transformation t) ,参数interpolatedTime是补间时间,在动画效果的执行过程里,从0到最后动画执行完成变为1;参数Transformation是变化对象,通过它改变一些动画效果显示出来,是个目标组件的意思。

public class CustomAnim extends Animation {

	@Override
	public void initialize(int width, int height, int parentWidth, int parentHeight) {
		// TODO Auto-generated method stub
		super.initialize(width, height, parentWidth, parentHeight);//获取目标对象的宽高
	}
	
	@Override
	protected void applyTransformation(float interpolatedTime, Transformation t) {
		
	//	System.out.println(interpolatedTime);
	//	t.setAlpha(interpolatedTime);//透明度从0渐变到1
		
	//	t.getMatrix().setTranslate(200*interpolatedTime, 200*interpolatedTime);
		
		t.getMatrix().setTranslate((float)Math.sin(interpolatedTime*20)*50, 0);
		super.applyTransformation(interpolatedTime, t);
	}
}


利用interpolatedTime的随动画执行过程的渐变性,可以制作很多自定义的效果。比如上面代码里的设置透明度的变化:t.setAlpha(interpolatedTime);自定义的移动方式:t.getMatrix().setTranslate(200*interpolatedTime, 200*interpolatedTime);

在这里想制作一个控件在水平方向上摇头的动画效果,把Y轴的移动像素设置为0,这样控件就只能在水平方向移动,然后在X轴上进行周期性移动,就可以实现摇头的效果。在X轴的移动可以通过 interpolatedTime来实现,周期性可以通过Math.sin()这样的周期方法,传入interpolatedTime作为移动周期,也就是控件的移动频率快慢,整个参数的值是移动振幅,也就是移动距离长短。

sin()里的数值乘的倍数越大,移动的越快;Math的值乘的倍数越大,控件移动距离越长。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值