簡體   English   中英

如何使用Android Canvas將圖像從一個點移動到另一個點

[英]How can I move an image from one point to another using Android Canvas

我正在開發一款游戲,在這款游戲中,我必須將Canvas上的圖像從一個點移動到另一個點,而不僅僅是垂直或水平。

如何以這種方式移動圖像?

我無法理解你真正想要的東西,但這是我嘗試過的東西。

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

}

你可以將它從一個位置拖到另一個位置,或者你可以使用Translate移動它......像這樣,

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

看看這個圖書館。 它應該可以幫助你移動,我想拖動像圖像等物體 - PhysicsLayout 在這里你可以看到兩個方向移動 - 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);
   (...)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM