Android move object along a path

后端 未结 5 1672
天涯浪人
天涯浪人 2020-12-14 18:33

I ave created a path a circle and displayed both of them on screen as follows:

public void onDraw(Canvas canvas){

        Path sPath = new Path();
        s         


        
相关标签:
5条回答
  • 2020-12-14 19:10

    The right way to do this is with ContraintLayout and then add a keyframe between the points on the path you want to animate, as described here: https://medium.com/google-developers/defining-motion-paths-in-motionlayout-6095b874d37.

    0 讨论(0)
  • 2020-12-14 19:12

    v21+: this creates a quadratic bezier curve on a path and animates myView along it.

    final Path path = new Path();
    path.quadTo(controlX, controlY, finalX, finalY);
    ObjectAnimator.ofFloat(myView, View.X, View.Y, path).start();
    
    0 讨论(0)
  • 2020-12-14 19:16

    Here are the animators I use:

    Purpose: Move View "view" along Path "path"

    v21+:

    ValueAnimator pathAnimator = ObjectAnimator.ofFloat(view, "x", "y", path)
    

    v11+:

    ValueAnimator pathAnimator = ValueAnimator.ofFloat(0.0f, 1.0f);
    
    pathAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    float[] point = new float[2];
    
    @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            float val = animation.getAnimatedFraction();
            PathMeasure pathMeasure = new PathMeasure(path, true);
            pathMeasure.getPosTan(pathMeasure.getLength() * val, point, null);
            view.setX(point[0]);
            view.setY(point[1]);
        }
    });
    
    0 讨论(0)
  • 2020-12-14 19:24

    You would need to move your circle a little bit each frame towards the next waypoint and detect once it gets there, then start moving toward the next. There is no built in system that I know of.

    0 讨论(0)
  • 2020-12-14 19:25

    Yes, it's possible to move image along path. I will provide simple solution to show the principle. The following code will animate the circle along the path.

    int iCurStep = 0;// current animation step
    
    @Override
    protected void onDraw(Canvas canvas) {
        PathMeasure pm = new PathMeasure(sPath, false);
        float fSegmentLen = pm.getLength() / 20;//we'll get 20 points from path to animate the circle
        float afP[] = {0f, 0f};
    
        if (iCurStep <= 20) {
            pm.getPosTan(fSegmentLen * iCurStep, afP, null);
            canvas.drawCircle(afP[0],afP[1],20,pathPaint);
            iCurStep++;
            invalidate();
        } else {
            iCurStep = 0;
        };
    };
    
    0 讨论(0)
提交回复
热议问题