【问题标题】:How can I move an image from one point to another using Android Canvas如何使用 Android Canvas 将图像从一个点移动到另一个点
【发布时间】:2010-10-14 05:45:37
【问题描述】:

我正在开发一款游戏,在这个游戏中,我必须将 Canvas 上的图像从一个点沿任意方向移动到另一个点,而不仅仅是垂直或水平方向。

如何以这种方式移动该图像?

【问题讨论】:

    标签: java android android-canvas


    【解决方案1】:

    上完数学课后,发现这很容易解决。首先,我们需要获取目标移动的角度。

    float deltaX = targetX - startX;
    float deltaY = targetY - startY;
    float angle = Math.atan2( deltaY, deltaX );
    

    startX/Y 可以是当前 X/Y。

    现在我们已经计算了角度,我们可以将它应用到当前坐标:

    currentX += speed * Math.cos(angle);//Using cos
    currentY += speed * Math.sin(angle);//or sin
    

    处理 X 和 Y 将增加多少的计算。 如果您还需要设置自定义速度,请使用速度作为自定义变量。如果您不需要更高的速度,请删除该变量。

    要移动对象,请将 X/Y 应用于对象:

    c.drawBitmap(bm, x, y, null);
    

    示例:

    int speed = 10;
    int x, y;
    int targetX = 100, targetY = 600;
    int startX = 900, startY = 100;
    public void render(Canvas c){
        super.draw(c);
        float deltaX = targetX - startX;
        float deltaY = targetY - startY;
        float angle = Math.atan2( deltaY, deltaX );
        x += speed * Math.cos(angle);//Using cos
        y += speed * Math.sin(angle);//or sin
        c.drawBitmap(bm, x, y, null);
       (...)
    }
    

    【讨论】:

      【解决方案2】:

      我不明白你真正想要什么,但这是我尝试过的。

          interface coordinateListener
      {
          public void currentPosition(float x,float y);
      }
      
      public class ImageView extends View{
          int width;
          int height;
          RectF rect = new RectF();
          float x=0f,y=0f;
          float dX,dY;
          float mStartX,mStartY;
          float mEndX,mEndY;
          Paint paint = new Paint();
          Bitmap mBitmap;
          TranslateAnimation anim;
          View view;
          coordinateListener mListener;
          public ImageView(Context context) {
              super(context);
              init();
          }
      
          public ImageView(Context context, AttributeSet attrs) {
              super(context, attrs);
              init();
          }
      
          public ImageView(Context context, AttributeSet attrs, int defStyleAttr) {
              super(context, attrs, defStyleAttr);
              init();
          }
      
      public void init()
      {
          view = this;
      }
      @Override
      protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec)
      {
          super.onMeasure(widthMeasureSpec,heightMeasureSpec);
          width = getMeasuredWidth();
          height = getMeasuredHeight();
          rect.set(0,0,width,height);
      }
      
      @Override
      protected void onDraw(Canvas canvas)
      {
          super.onDraw(canvas);
          if(mBitmap!=null) {
              canvas.drawBitmap(mBitmap,0,0,paint);
          }
      }
      
      @Override
      public boolean onTouchEvent(MotionEvent event)
      {
          int action = event.getAction() & MotionEvent.ACTION_MASK;
      
          switch (action)
          {
              case MotionEvent.ACTION_DOWN:
                  dX = this.getX() - event.getRawX();
                  dY = this.getY() - event.getRawY();
                  break;
              case MotionEvent.ACTION_MOVE:
                  y = event.getRawY();
                  x = event.getRawX();
                  y += dY;
                  x+=dX;
      
                  this.setY(y);
                  this.setX(x);
      
                  mListener = (coordinateListener)getContext(); 
                  mListener.currentPosition(x,y);
      
                  invalidate();
                  break;
          }
          return true;
      }
      
      public void startCoordinates(float x,float y)
      {
          mStartX = x;
          mStartY = y;
      }
      
      public void endCoordinates(float x,float y)
      {
          mEndX = x;
          mEndY = y;
      }
      
      public void startTranslation(long duration)
      {
          anim = new TranslateAnimation(mStartX,mEndX,mStartY,mEndY);
          anim.setDuration(duration);
          anim.setFillAfter(true);
      
          anim.setAnimationListener(new Animation.AnimationListener() {
              @Override
              public void onAnimationStart(Animation animation) {
      
              }
      
              @Override
              public void onAnimationEnd(Animation animation) {
                  view.setX((int)mEndX);
                  view.setY((int)mEndY);
                  animation.setFillAfter(false);
              }
      
              @Override
              public void onAnimationRepeat(Animation animation) {
      
              }
          });
      
          this.startAnimation(anim);
      }
      
      }
      

      您可以将它从一个位置拖动到另一个位置,也可以使用翻译来移动它...像这样,

      view.startCoordinates(0f,0f);
      view.endCoordinates(500f,0f);
      view.startTranslation(3000);
      

      【讨论】:

      • 这不是一个实际的视图。它正在使用surfaceview和bitmap.to做到这一点
      【解决方案3】:

      看看这个库。它应该可以帮助您移动,我认为拖动图像等对象 - PhysicsLayout。在这里你可以看到两个方向的移动 - X,Y。如果你想移动包括 Z,只有单一的方法来实现它,你应该使用简单的缩放。

      如果你想要更多的东西,这里有很多强大而漂亮的框架、环境。

      【讨论】:

      • 这里的目标是让它从当前位置直线移动到目标位置。看它就像穿过一个正方形。这是一种游戏行为,无需任何插件或附加组件即可实现
      • 我想说的是,这个答案关注与运动相关的物理,而不是如何在画布上自动导航的意义上做到这一点。
      • 我还在努力理解)例如,使用 View.java 中的方法 - setTranslationX(float x),获取坐标并使用 Canvas 重绘。你想实现基于位置的画布吗?
      • 问题是以尽可能短的方式将其从 A 点移动到 B 点。通过直接前往目标。
      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 2017-03-20
      • 2017-11-25
      • 2011-08-26
      相关资源
      最近更新 更多