我自定义了一个View,在鼠标点击处画一个小球,利用ObjectAnimator和PropertyValuesHolder设置动画效果,为什么设置x,y属性动画正常,小球能沿着坐标轴一定,设置
alpha和scale就不起作用,这玩意是怎么知道我写的X,Y就是让他在坐标轴上移动,但是他为什么不认识alpha和scale,还是我写的有问题,代码如下
package com.example.mrwuchao.newballtest;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.Button;
import android.widget.RelativeLayout;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private float BALL_SIZE = 50f;
ArrayList arrayList = new ArrayList<>();
// Button button;
/*出现问题
objectAnimator是怎么识别这些属性的,写出一个字符串,他是怎么判断要执行什么动画的?*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout re = (RelativeLayout)findViewById(R.id.re);
re.addView(new MyView(this));
// button = (Button)findViewById(R.id.button);
}
public class MyView extends View implements ValueAnimator.AnimatorUpdateListener {
public MyView(Context context) {
super(context);
setBackgroundColor(Color.WHITE);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN &&
event.getAction() != MotionEvent.ACTION_MOVE) {
return false;
}
ShapeHolder newBall = addBall(event.getX(), event.getY());
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("x",event.getX(),600f,200f);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("alpha",1.0f,0f);
ObjectAnimator oa = ObjectAnimator.ofPropertyValuesHolder(newBall,p1,p2);
oa.setDuration(2000);
// oa.setInterpolator(new AccelerateInterpolator());
oa.addUpdateListener(this);
oa.start();
// ObjectAnimator oa = ObjectAnimator.ofFloat(newBall,"x",600f);
// ObjectAnimator ob = ObjectAnimator.ofFloat(newBall,"y",600f);
//
// ob.addUpdateListener(this);
//
// AnimatorSet animatorSet = new AnimatorSet();
// animatorSet.play(oa).with(ob);
// animatorSet.setDuration(2000);
// animatorSet.start();
return true;
}
private ShapeHolder addBall(float x, float y) {
OvalShape circle = new OvalShape();
circle.resize(BALL_SIZE, BALL_SIZE);
ShapeDrawable drawable = new ShapeDrawable(circle);
ShapeHolder shapeHolder = new ShapeHolder(drawable);
shapeHolder.setX(x-BALL_SIZE/2);
shapeHolder.setY(y-BALL_SIZE/2);
shapeHolder.setAlpha(1.0f);
Paint paint = drawable.getPaint();
int[] color = new int[]{Color.GRAY, Color.BLUE};
RadialGradient gradient = new RadialGradient(40f, 15f, BALL_SIZE, color, null, Shader.TileMode.CLAMP);
paint.setShader(gradient);
//paint.setColor(Color.RED);
shapeHolder.setPaint(paint);
arrayList.add(shapeHolder);
return shapeHolder;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (ShapeHolder sh : arrayList) {
canvas.save();
canvas.translate(sh.getX(),sh.getY());
sh.getD().draw(canvas);
canvas.restore();
}
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
this.invalidate();
}
}
}
包装类
package com.example.mrwuchao.newballtest;
import android.graphics.Paint;
import android.graphics.drawable.ShapeDrawable;
/**
Created by Mr.wuchao on 2016/6/8.
*/
public class ShapeHolder {
public void setDrawable(ShapeDrawable drawable) {
this.d = drawable;
}
ShapeDrawable d;
Paint paint;
float alpha = 1.0f;
float x,y;
public ShapeHolder(ShapeDrawable drawable) {
this.d = drawable;
}
public ShapeDrawable getD() {
return d;
}
public void setD(ShapeDrawable d) {
this.d = d;
}
public float getAlpha() {
return alpha;
}
public void setAlpha(float alpha) {
this.alpha = alpha;
}
public float getX() {
return x;
}
public void setX(float x) {
this.x = x;
}
public Paint getPaint() {
return paint;
}
public void setPaint(Paint paint) {
this.paint = paint;
}
public float getY() {
return y;
}
public void setY(float y) {
this.y = y;
}
}