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

京东到家,美团外卖等加入购物车的贝塞尔曲线view动画

2017-03-17 15:49 525 查看
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.TextView;

/**
* 加入购物车的贝塞尔曲线view
*/
public class BezierView extends TextView implements ValueAnimator.AnimatorUpdateListener {

public static final int VIEW_SIZE = 20;
public static final int DURATION = 600;//动画时长

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

protected Point startPosition;
protected Point endPosition;

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

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

public BezierView(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 PX4SIZE = (int) convertDpToPixel(VIEW_SIZE, mContext);
setMeasuredDimension(PX4SIZE, PX4SIZE);
radius = PX4SIZE / 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;
int pointX = (startPosition.x + endPosition.x) / 2;
int pointY = (int) (startPosition.y - convertDpToPixel(200, mContext));
Point controllPoint = new Point(poin
d1d6
tX, pointY);
BezierEvaluator bezierEvaluator = new BezierEvaluator(controllPoint);
endPosition.offset(50,0);
ValueAnimator anim = ValueAnimator.ofObject(bezierEvaluator, startPosition, endPosition);
anim.addUpdateListener(this);
anim.setDuration(DURATION);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
ViewGroup viewGroup = (ViewGroup) getParent();
viewGroup.removeView(BezierView.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);
}
}

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

float px = dp * (metrics.densityDpi / 160f);
return px;
}
}
动画的使用
int startPosition[] = new int[2];v.getLocationInWindow(startPosition);playAnimation(startPosition);
/**
 * 点击加号的跳动添加动画*/public void playAnimation(int[] start_location) {BezierView bezierView = new BezierView(activity);bezierView.setStartPosition(new Point(start_location[0], start_location[1]));ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView();rootView.addView(bezierView);int endPosition[] = new int[2];((MainActivity)activity).getBtnBottomCart().getLocationInWindow(endPosition);bezierView.setEndPosition(new Point(endPosition[0], endPosition[1]));bezierView.startBeizerAnimation();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息