1、构造平移动画
(1)构造方法一
// 下面的效果是将标题栏titleBar向上平移自身高度的距离,即隐藏 // 每两个为一组参数,相对于本身控件的X起始位置、x结束位置、y起始位置、y结束位置 TranslateAnimation translate = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, -1.0f); // 设置动画执行多少次,如果是-1的话就是一直重复 translate.setRepeatCount(Animation.INFINITE); ; // 设置重复模式,RESTART为结束后重新开始,REVERSE为按原来的轨迹逆向返回 translate.setRepeatMode(Animation.RESTART); translate.setDuration(1000);// 毫秒单位,5s // 设为true之后,界面会停留在动画播放完时的界面。 translate.setFillAfter(true); titleBar.startAnimation(translate);
(2)构造方法二:沿竖直方向向下移动50个坐标(PX)
TranslateAnimation translate = new TranslateAnimation(0,0,0,50);
float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;
float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;
float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;
float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;
2、关于加速减速执行动画
//根据用户在Spinner的选择设置target的进入的方式 switch (position) { case 0: //加速进入 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.accelerate_interpolator)); break; case 1: //减速进入 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator)); break; case 2: //加速进入.与第一个的区别为当repeatMode为reverse时,仍为加速返回原点 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.accelerate_decelerate_interpolator)); break; case 3: //先往后退一点再加速前进 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.anticipate_interpolator)); break; case 4: //减速前进,冲过终点前再后退 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.overshoot_interpolator)); break; case 5: //case 3,4的结合体 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.anticipate_overshoot_interpolator)); break; case 6: //停止前来回振几下 a.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.bounce_interpolator)); break; }
3、动画监听器,不是在startAnimation后面的语句就是在动画结束后才执行
translate.setAnimationListener(new AnimationListener() { @Override public void onAnimationStart(Animation arg0) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animation arg0) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animation arg0) { // TODO Auto-generated method stub marginParams=(MarginLayoutParams) getLayoutParams(); Log.i("动画结束", "gmarginBottom"+marginParams.bottomMargin); } });
4、特别注意:
(1)view在动画执行后位置变化了,其layoutparams的值并没有改变;
包括其点击事件的监听区域也没变。
(2)为避免动画执行后再执行布局改动的时候出现闪动,需要在动画监听器的END中clear+设置应该处于的布局
@Override public void onAnimationEnd(Animation arg0) { // TODO Auto-generated method stub view1.clearAnimation(); params1.width = 0; view1.setLayoutParams(params1); }
Done!