针对对象的某个属性做不断的改变 ( 刷新 ) 产生的效果,就是属性动画
1、要操作的属性必须有 get 和 set 方法,如果没有那么需要去添加
2、可以使用一个类来封装原始的对象,间接的提供 get 个 set 方法来改变它属性
class ViewHolder{
//原始的视图对象
View view;
private LinearLayout.LayoutParams lp;
public ViewHolder(View view){
this.view = view;
lp = (LinearLayout.LayoutParams) view.getLayoutParams();
}
public void setWidth(int width){
lp.width= width;
view.requestLayout();
}
public int getWidth(){
return lp.width;
}
public void setHeight(int height){
lp.height= height;
view.requestLayout();
}
public int getHeight(){
return lp.height;
}
}
// 使用属性动画
ViewHolder holder = new ViewHolder(view);
// 对宽属性产生 int 类型的值,改变宽度
//( 对象 , 属性名称 , 变化的数值 可以多个 )
ObjectAnimator.ofInt(holder,"width",view.getMeasuredWidth(),500)
.setDuration(2000).start();
使用动画速率
ViewHolder holder = new ViewHolder(view);
ObjectAnimator animator = ObjectAnimator.ofInt(holder, "width", view.getMeasuredWidth(), 500);
// 设置动画速率
animator.setInterpolator(new AccelerateDecelerateInterpolator());
// 设置动画时间,启动动画
animator.setDuration(2000).start();
动画速率中的 PathInterpolator 是 api21(android5.0) 才加上来的,低版本使用的话可以用 v4 包的 PathInterpolatorCompat 来代替
//透明度
case R.id.btn_view_alpha:
ObjectAnimator alphAnim = ObjectAnimator.ofFloat(view,View.ALPHA,1,0.5f);
alphAnim.setDuration(2000).start();
break;
//平移
case R.id.btn_view_tran:
//x方向
ObjectAnimator tranAnim = ObjectAnimator.ofFloat(view,View.TRANSLATION_X,100);
tranAnim.setDuration(2000).start();
//y方向
ObjectAnimator.ofFloat(view,View.TRANSLATION_Y,300).setDuration(1000).start();
break;
//缩放
case R.id.btn_view_scale:
//宽方向
ObjectAnimator.ofFloat(view,View.SCALE_X,1,1.5f).setDuration(1000).start();
//高方向
ObjectAnimator.ofFloat(view,View.SCALE_Y,1,1.5f).setDuration(2000).start();
break;
//旋转
case R.id.btn_view_rotate:
// 沿着X轴旋转(上下翻转)
ObjectAnimator.ofFloat(view,View.ROTATION_X,45).setDuration(1000).start();
// 沿着 Y 轴旋转 ( 左右翻转 )
ObjectAnimator.ofFloat(view,View.ROTATION_Y,45).setDuration(1000).start();
// 沿着 Z 轴旋转 ( 平面旋转 )
ObjectAnimator.ofFloat(view,View.ROTATION,45).setDuration(1000).start();
break;
ValueAnimator
描述的时值变化过程的类,是 ObjectAnimator 的父类,一般要结合 AnimatorUpdateListener 一起使用监听值的变化
private void startValueAnimator(final int startWidth, final int endWidth) {
// 整数的因子计算对象
final IntEvaluator mEvaluator = new IntEvaluator();
// 值变化对象 ( 起始值 , 结束值 )
ValueAnimator anim = ValueAnimator.ofInt(1, 100);
anim.setDuration(2000);
anim.setInterpolator(new LinearInterpolator());
// 监听数值变化
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前产生的数值
int currentValue = (Integer) animation.getAnimatedValue();
float fraction = currentValue / 100f;
int w = mEvaluator.evaluate(fraction,startWidth,endWidth);
// Log.e("m_tag", "value:" + currentValue);
// 新的宽度
// int w = orginWidth + currentValue;
view.getLayoutParams().width = w;
view.requestLayout();
}
});
anim.start();
}