属性动画Animator的使用方法
public class MainActivity extends AppCompatActivity {
private ImageView showIv;
private RelativeLayout relativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showIv = (ImageView) findViewById(R.id.showIv);
relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
showIv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//调用使用ValueAnimator的方法完成动画
// useValueAnimator();
//调用使用ObjectAnimator的方法完成动画
// useObjectAnimator();
//调用使用ViewPropertyAnimator的方法完成动画
// useViewPropertyAnimator();
//调用使用AnimatorSet的方法完成组合动画
// useAnimatorSet();
//调用使用ObjectAnimator完成组合动画
// useObjectAnimatorSet();
//调用使用ValueAnimator完成组合动画
// useValueAnimatorSet();
//调用通过引用ValueAnimation的xml文件完成动画
// useValueAnimatorXml();
//调用通过引用ObjectAnimator的xml文件完成动画
// useObjectAnimatorXml();
//调用通过引用AnimatorSet的xml文件完成动画
// useAnimatorSetXml();
//调用通过值动画来改变背景颜色
// ValueAnimatorSetBackgrundColor();
}
});
//通过ValueAnimator完成对自定义View对象的动画效果
ValueAnimatorOfObject();
}
//使用ValueAnimator的方法完成动画
private void useValueAnimator() {
// 属性动画 ValueAnimator 的用法 ,属性动画本质是值动画
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
valueAnimator.setDuration(3000);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
//设置透明
// showIv.setAlpha(animatedValue);
ViewGroup.LayoutParams layoutParams = showIv.getLayoutParams();
layoutParams.width = (int) (animatedValue * 500);
layoutParams.height = (int) (animatedValue * 500);
showIv.setLayoutParams(layoutParams);
}
});
valueAnimator.start();
}
//使用ObjectAnimator的方法完成动画
private void useObjectAnimator() {
//透明度变化
// ObjectAnimator alphaObjectAnimator = ObjectAnimator.ofFloat(showIv,"alpha",0,1);
// alphaObjectAnimator.setDuration(3000).start();
//平移动画
// ObjectAnimator translationXObjectAnimator = ObjectAnimator.ofFloat(showIv, "translationX", 0, 1000);
// translationXObjectAnimator.setDuration(3000).start();
//旋转动画
// ObjectAnimator rotateObjectAnimator = ObjectAnimator.ofFloat(showIv, "rotation", 0, 360);
// rotateObjectAnimator.setDuration(3000).start();
//缩放动画
ObjectAnimator scaleObjectAnimator = ObjectAnimator.ofFloat(showIv, "scaleX", 0f, 2f);
scaleObjectAnimator.setDuration(3000);
//重复3次
scaleObjectAnimator.setRepeatCount(3);
scaleObjectAnimator.setRepeatMode(ValueAnimator.REVERSE);
scaleObjectAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
scaleObjectAnimator.start();
}
//使用ViewPropertyAnimator的方法完成动画
private void useViewPropertyAnimator() {
showIv.animate().alpha(0.5f)
.translationX(300)
.scaleX(2)
.scaleY(2)
.rotation(360f)
.setDuration(3000)
//延迟两秒执行
.setStartDelay(2000)
.start();
}
//使用AnimatorSet的方法完成组合动画
private void useAnimatorSet() {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator alpha = ObjectAnimator.ofFloat(showIv, "alpha", 0f, 1f);
ObjectAnimator translationX = ObjectAnimator.ofFloat(showIv, "translationX", 0f, 200f);
animatorSet.playTogether(alpha, translationX);
animatorSet.setDuration(3000);
animatorSet.start();
}
//使用ObjectAnimator完成组合动画
private void useObjectAnimatorSet() {
PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1f);
PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 0f, 200f);
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(showIv, alpha, translationX);
objectAnimator.setDuration(3000);
objectAnimator.start();
}
//使用ValueAnimator完成组合动画
private void useValueAnimatorSet() {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = showIv.getLayoutParams();
layoutParams.width = (int) (animatedValue * 300);
layoutParams.height = (int) (animatedValue * 300);
showIv.setLayoutParams(layoutParams);
showIv.setAlpha(animatedValue);
}
});
valueAnimator.setDuration(3000);
valueAnimator.start();
}
//通过引用ValueAnimation的xml文件完成动画
private void useValueAnimatorXml() {
ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.value_animator);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
showIv.setAlpha(animatedValue);
}
});
animator.setDuration(3000);
animator.start();
}
//value_animator的XML类 <animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:valueFrom="0f"
android:valueTo="0.5f"
android:valueType="floatType">
</animator>
//通过引用ObjectAnimator的xml文件完成动画 private void useObjectAnimatorXml() { ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.object_animator); animator.setTarget(showIv); animator.start(); }
//object_animator的XML类
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:valueFrom="0f"
android:valueTo="0.5f"
android:valueType="floatType"
android:propertyName="alpha">
</objectAnimator>
//通过引用AnimatorSet的xml文件完成动画 private void useAnimatorSetXml() { AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.set_animator); animator.setTarget(showIv); animator.start(); }
//set_animator的XML的类 <set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:ordering="sequentially">
<objectAnimator
android:duration="3000"
android:valueFrom="0f"
android:valueTo="0.5f"
android:valueType="floatType"
android:propertyName="alpha">
</objectAnimator>
<objectAnimator
android:duration="3000"
android:valueFrom="0f"
android:valueTo="200f"
android:valueType="floatType"
android:propertyName="translationX">
</objectAnimator>
</set>
//通过值动画来改变背景颜色
private void ValueAnimatorSetBackgrundColor() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ValueAnimator valueAnimator = ValueAnimator.ofArgb(0xffff0000, 0xff0000ff, 0xff00ff00);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue();
relativeLayout.setBackgroundColor(animatedValue);
}
});
valueAnimator.setDuration(2000);
valueAnimator.start();
}
}
//通过ValueAnimator完成对自定义View对象的动画效果
private void ValueAnimatorOfObject() {
Point startPoint = new Point(0, 0);
Point endPoint = new Point(1000, 1000);
//fraction是一个从0到1变化的值
ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<Point>() {
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
float startX = startValue.getX();
float endX = endValue.getX();
float currentX = startX + fraction * (endX - startX);
float startY = startValue.getY();
float endY = endValue.getY();
float currentY = startY + fraction * (endY - startY);
return new Point(currentX, currentY);
}
}, startPoint, endPoint);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point point = (Point) animation.getAnimatedValue();
}
});
}
}
自定义ViewMyCircleView类
public class MyCircleView extends View {
Paint paint;
float radius = 100;
Point currentPoint;
public MyCircleView(Context context) {
super(context);
init();
}
public MyCircleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLUE);
}
//根据currentPoint的x和y确定圆心的位置,去画圆
private void drawCirle(Canvas canvas) {
//只执行一次动画
if (currentPoint == null) {
startPointAnimation();
}
canvas.drawCircle(currentPoint.getX(), currentPoint.getY(), radius, paint);
}
//开始执行对Point对象操作的动画
private void startPointAnimation() {
Point startPoint = new Point(radius, radius);
Point endPoint = new Point(getWidth() - radius, getHeight() - radius);
currentPoint = startPoint;
//fraction是一个从0到1变化的值
ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<Point>() {
@Override
public Point evaluate(float fraction, Point startValue, Point endValue) {
float startX = startValue.getX();
float endX = endValue.getX();
float currentX = startX + fraction * (endX - startX);
float startY = startValue.getY();
float endY = endValue.getY();
float currentY = startY + fraction * (endY - startY);
Log.e("tag", "===== " + currentY);
return new Point(currentX, currentY);
}
}, startPoint, endPoint);
//设置监听,获取当前的监听对象
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
//重新绘制, (改变了currentPoint之后去重新绘制圆)
invalidate();
}
});
//设置动画插值器,改变动画变化速率 , 加速,先加速后减速,弹跳效果
valueAnimator.setInterpolator(new BounceInterpolator());
valueAnimator.setDuration(2000);
valueAnimator.start();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//去画圆
drawCirle(canvas);
}
}
Point类
public class Point {
float x;
float y;
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
public Point(float x, float y) {
this.x = x;
this.y = y;
}
}
在XML布局文件中引用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/relativeLayout"
tools:context="com.hgz.test.animator.MainActivity">
<ImageView
android:id="@+id/showIv"
android:layout_width="130dp"
android:layout_height="130dp"
android:layout_centerInParent="true"
android:src="@drawable/ic_stub"
android:visibility="gone"/>
<com.hgz.test.animator.MyCircleView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>