摘要:本文将带你了解Android应用开发android 购物车小球掉落动画,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发android 购物车小球掉落动画,希望本文对大家学Android有所帮助。
先贴效果图
对自定义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
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;
}
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号