请问:简书怎么可以把代码格式调整?我贴出来换格式了。你们直接去Github下载工程!
![](https://img.haomeiwen.com/i11218161/968b0f08d104a651.gif)
动画描述:点击按钮,一个控件往左下的位置走的曲线
分析:
通过自定义估值器。得到控制点,然后设置控件的坐标就可以
1.添加控件
2.得到起点坐标和终点坐标
3.估值器,得到pointF
4.设置x,y的值。重绘
起点坐标;recyclewView的y值。
终点坐标:确定了。
控制点坐标:x=(起点+终点/2) y=起点y-100
备注:
如何得到一个控件的坐标?
int position[] =new int[2];
view.getLocationInWindow(position);
二次方公式
二次方贝兹曲线的路径由给定点P0、P1、P2的函数B(t)追踪:
动画很像:点赞动画和购物车动画。
public class FoodActivityextends AppCompatActivityimplements FoodAdapter.FoodActionCallback {
ListViewlv_main;
TextViewtv_good_fitting_num;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_foods);
lv_main = (ListView) findViewById(R.id.lv_main);
tv_good_fitting_num = (TextView) findViewById(R.id.tv_good_fitting_num);
lv_main.setAdapter(new FoodAdapter(this, AppConfig.factoryFoods(), this));
}
public static void startActiivty(Context context) {
context.startActivity(new Intent(context, FoodActivity.class));
}
@Override
public void addAction(View view) {
NXHooldeView nxHooldeView =new NXHooldeView(this);
int position[] =new int[2];
view.getLocationInWindow(position);
nxHooldeView.setStartPosition(new Point(position[0], position[1]));//得到起始点的x,y
ViewGroup rootView = (ViewGroup)this.getWindow().getDecorView();
rootView.addView(nxHooldeView);
int endPosition[] =new int[2];
tv_good_fitting_num.getLocationInWindow(endPosition);//通过这么方法,可以得到屏幕的x,y值
nxHooldeView.setEndPosition(new Point(endPosition[0], endPosition[1]));
nxHooldeView.startBeizerAnimation();
}
}
public class NXHooldeViewextends TextViewimplements ValueAnimator.AnimatorUpdateListener {
public static final int VIEW_SIZE =20;
protected ContextmContext;
protected PaintmPaint4Circle;
protected int radius;
protected PointstartPosition;
protected PointendPosition;
public NXHooldeView(Context context) {
this(context, null);
}
public NXHooldeView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public NXHooldeView(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 controlX = (startPosition.x +endPosition.x) /2;//(起点+终点/2)
int controlY = (int) (startPosition.y -convertDpToPixel(100, mContext));//起点y-100
Point controllPoint =new Point(controlX, controlY);//控制点
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();
viewGroup.removeView(NXHooldeView.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 BezierEvaluatorimplements TypeEvaluator {
private PointcontrollPoint;
public BezierEvaluator(Point controllPoint) {
this.controllPoint = controllPoint;
}
@Override
public Pointevaluate(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;
}
}
demo地址:https://github.com/pengcaihua123456/shennandadao
参考:
https://www.jianshu.com/p/5fe9ee2859d2
网友评论