美文网首页
6. Android 100行代码搞定 淘宝加入购物车动

6. Android 100行代码搞定 淘宝加入购物车动

作者: 鹏城十八少 | 来源:发表于2021-06-19 23:42 被阅读0次

请问:简书怎么可以把代码格式调整?我贴出来换格式了。你们直接去Github下载工程!

动画描述:点击按钮,一个控件往左下的位置走的曲线

分析:

通过自定义估值器。得到控制点,然后设置控件的坐标就可以

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

https://www.jianshu.com/p/d9a3ae9e806d

https://www.codesocang.com/gn-animation/32888.html

相关文章

网友评论

      本文标题:6. Android 100行代码搞定 淘宝加入购物车动

      本文链接:https://www.haomeiwen.com/subject/btkjyltx.html