Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Android画布将图像从一个点移动到另一个点_Java_Android_Android Canvas - Fatal编程技术网

Java 如何使用Android画布将图像从一个点移动到另一个点

Java 如何使用Android画布将图像从一个点移动到另一个点,java,android,android-canvas,Java,Android,Android Canvas,我正在开发一个游戏,在这个游戏中,我必须将画布上的图像从一个点向另一个点任意方向移动,而不仅仅是垂直或水平移动 如何以这种方式移动该图像 看看这个库。它应该可以帮助你移动,我认为可以拖动像图像这样的物体。在这里你可以看到两个方向的移动-X,Y。如果你想移动包括Z,只有一种方法来实现它,你应该使用简单的缩放 如果您想要更多的东西,有很多功能强大且非常好的框架、环境 在上了一堂数学课之后,发现这个问题很容易解决。首先,我们需要得到目标移动的角度 float deltaX = targetX - st

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


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

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

如果您想要更多的东西,有很多功能强大且非常好的框架、环境


在上了一堂数学课之后,发现这个问题很容易解决。首先,我们需要得到目标移动的角度

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);
   (...)
}

我不明白你到底想要什么,但我已经试过了

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

这里的目标是让它从当前位置直线移动到目标位置。看着它就像穿过一个正方形的交叉口。这是一种游戏行为,不需要任何插件或插件就可以实现。我想说的是,这个答案考虑了与运动相关的物理问题,但不是如何在画布上进行自动导航。我仍然试图理解)例如,使用View.java-setTranslationX(float x)中的方法,获取坐标并使用画布重新绘制。您想实现基于位置的绘制画布吗?问题是以尽可能短的方式将画布从点A移动到点B。直接指向目标。这不是实际视图。它正在使用surfaceview和bitmap.com来执行此操作