【问题标题】:Android move object along a pathAndroid沿路径移动对象
【发布时间】:2011-09-03 12:08:15
【问题描述】:

我创建了一个圆形路径,并在屏幕上显示如下:

public void onDraw(Canvas canvas){

        Path sPath = new Path();
        sPath.moveTo(100, 100);
        sPath.lineTo(300, 100);
        sPath.lineTo(300, 300);
        sPath.lineTo(100,300);
        sPath.lineTo(100,100);
        sPath.close();

        Paint ballPaint = new Paint();
        ballPaint.setColor(Color.GREEN);
        Paint pathPaint = new Paint();
        pathPaint.setColor(Color.BLUE);

        canvas.drawPath(sPath, ballPaint);
        canvas.drawCircle(100,100,20,pathPaint);
    }

我想让圆圈沿着路径移动,我该怎么做?

【问题讨论】:

    标签: android animation path geometry


    【解决方案1】:

    正确的方法是使用ContraintLayout,然后在要设置动画的路径上的点之间添加一个关键帧,如下所述:https://medium.com/google-developers/defining-motion-paths-in-motionlayout-6095b874d37

    【讨论】:

      【解决方案2】:

      以下是我使用的动画师:

      目的:沿路径“路径”移动视图“视图”

      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]);
          }
      });
      

      【讨论】:

      • 如何在每个轮廓之后旋转我的视图。我有4分。我只是使用 lineto 创建路径。现在我想在这 4 个点上旋转我的观点。我该怎么做?
      【解决方案3】:

      v21+:这会在路径上创建二次贝塞尔曲线并沿其动画 myView。

      final Path path = new Path();
      path.quadTo(controlX, controlY, finalX, finalY);
      ObjectAnimator.ofFloat(myView, View.X, View.Y, path).start();
      

      【讨论】:

        【解决方案4】:

        是的,可以沿路径移动图像。我将提供简单的解决方案来展示原理。下面的代码将沿着路径为圆圈设置动画。

        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;
            };
        };
        

        【讨论】:

          【解决方案5】:

          您需要每帧将您的圆圈移动一点点朝向下一个航路点,并在到达那里后进行检测,然后开始向下一个航路点移动。据我所知,没有内置系统。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-26
            • 2019-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多