0

私が持っているのは何かなので、ビットマップをクリックしてドラッグすると指に追従しますが、実際には右に移動することしかできません。必要に応じて、左に少し下向きの角度を付けることもできます。しかしそれ以外は、物を動かすことはほぼ不可能です。私はそれをすべての方向に動かすことができる必要があります、あなたは私を助けてくれますか?これは私のコードです:

@Override
    protected void onDraw(Canvas canvas) 
    {
        super.onDraw(canvas);
        clear.setARGB(0, 0, 0, 0);
        AndroidDudeHitbox.set(AndroidX, AndroidY, AndroidX + AndroidDude.getWidth(), AndroidY + AndroidDude.getHeight());
        canvas.drawRect(AndroidDudeHitbox, clear);
        canvas.drawBitmap(AndroidDude, AndroidX - (AndroidDude.getWidth()/2), AndroidY - (AndroidDude.getHeight()/2), null);
        if (AndroidX > canvas.getWidth() || AndroidX < 0 || AndroidY > canvas.getHeight() || AndroidY < 0) {AndroidX = 30; AndroidY = canvas.getHeight()/2;} 
        invalidate();
    }
@Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        try {
            Thread.sleep(30);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (AndroidDudeHitbox.contains((int)event.getX(), (int) event.getY()))
        {
            switch (event.getAction())
            {
            case MotionEvent.ACTION_MOVE:
                AndroidX = (int) event.getX();
                AndroidY = (int) event.getY();
                break;
            }
        }

        return true;
    }

編集:ビットマップを直接右に移動できないことがわかりました。直接上下左右に動かすことができます。しかし、他にはありませんでした。

4

2 に答える 2

0

AndroidDudeHitboxに触れた場合のポイントが含まれているかどうかを確認しますが、その上にAndroidDudeを描画します。以下の if ステートメントを削除するか、AndroidDude の上にヒットボックスを描画します。

if (AndroidDudeHitbox.contains((int)event.getX(), (int) event.getY())){

于 2012-06-02T15:59:59.730 に答える
0

まず第一に: onTouch メソッドで「スリープ」呼び出しを行わないでください。これはトラブルを求めています。

まず、一時的に AndroidDudeHitbox.contains((int)event.getX(), (int) event.getY()) をチェックする if ステートメントを削除します。AndroidX と AndroidY は常に event.getX() と event.getY() で更新してください。

そして最後に、最も重要なことは、onTouch で AndroidX や AndroidY の値を変更した後に「 invalidate() 」を呼び出すことです。「invalidate()」への呼び出しのみが、後で onDraw が再度呼び出される原因となります。

public boolean onTouch(View v, MotionEvent event) 
{
    if (true /*AndroidDudeHitbox.contains((int)event.getX(), (int) event.getY())*/)
    {
        switch (event.getAction())
        {
        case MotionEvent.ACTION_MOVE:
            AndroidX = (int) event.getX();
            AndroidY = (int) event.getY();
            invalidate(); // important!!!
            break;
        }
    }

    return true;
}

「invalidate()」への呼び出しの追加が機能する場合は、一時的に削除した「if」ステートメントを再度追加し、すべてがまだ機能するかどうかを確認します。

于 2013-02-06T23:54:54.473 に答える