您的位置:首页 > 移动开发 > Android开发

android 购物车小球掉落动画

2018-03-06 09:39 363 查看
先贴效果图



对自定义View小红球的绘制public class BallView extends TextView implements ValueAnimator.AnimatorUpdateListener {

public static final int VIEW_SIZE = 20;

protected Context mContext;
protected Paint mPaint4Circle;
protected int radius;

protected Point startPosition;
protected Point endPosition;

public BallView(Context context) {
this(context, null);
}

public BallView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public BallView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;

//初始化画笔
mPaint4Circle = new Paint();
mPaint4Circle.setColor(Color.RED);
mPaint4Circle.setAntiAlias(true);

setGravity(Gravity.CENTER);
setText("1");
setTextColor(Color.WHITE);
setTextSize(12);
}

public void setStartPosition(Point startPosition) {
startPosition.y -= 10;
this.startPosition = startPosition;
}

public void setEndPosition(Point endPosition) {
this.endPosition = endPosition;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int pxSize = (int) convertDpToPixel(VIEW_SIZE, mContext);
//绘制大小
setMeasuredDimension(pxSize, pxSize);
//求出半径
radius = pxSize / 2;
}

@Override
protected void onDraw(Canvas canvas) {
//画一个园
canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, radius, mPaint4Circle);
super.onDraw(canvas);
}

public void startBeizerAnimation() {
if (startPosition == null || endPosition == null){
return;
}

//绘制一个贝塞尔曲线的控制点 默认每个往上飞100
int pointX = (startPosition.x + endPosition.x) / 2;
int pointY = (int) (startPosition.y - convertDpToPixel(100, mContext));
Point controllPoint = new Point(pointX, pointY);

BezierEvaluator bezierEvaluator = new BezierEvaluator(controllPoint);
ValueAnimator anim = ValueAnimator.ofObject(bezierEvaluator, startPosition, endPosition);
anim.addUpdateListener(this);
anim.setDuration(400);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
ViewGroup viewGroup = (ViewGroup) getParent();
//动画完成后移除view
viewGroup.removeView(BallView.this);
}
});
anim.setInterpolator(new AccelerateDecelerateInterpolator());
anim.start();
}

@Override
public void onAnimationUpdate(ValueAnimator animation) {
Point point = (Point) animation.getAnimatedValue();
setX(point.x);
setY(point.y);
invalidate();
}

public class BezierEvaluator implements TypeEvaluator<Point> {

private Point controllPoint;

public BezierEvaluator(Point controllPoint) {
this.controllPoint = controllPoint;
}

@Override
public Point evaluate(float t, Point startValue, Point endValue) {
//计算小球运动轨迹(贝塞尔曲线二次方公式)
int x = (int) ((1 - t) * (1 - t) * startValue.x + 2 * t * (1 - t) * controllPoint.x + t * t * endValue.x);
int y = (int) ((1 - t) * (1 - t) * startValue.y + 2 * t * (1 - t) * controllPoint.y + t * t * endValue.y);
return new Point(x, y);
}
}

//dp转换px
public static float convertDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();

float px = dp * (metrics.densityDpi / 160f);
return px;
}
}listview的代码我就不贴了 代码已经上传到我的github上~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: