向各个方向移动位图

时间:2012-06-02 13:59:13

标签: android bitmap ontouchevent

我所拥有的是这样的东西所以当我点击并拖动我的位图时它会跟随你的手指,但它实际上只让我向右移动它,我可以向左倾斜一点向左,如果我想但除此之外几乎不可能让事情发生。我需要能够在所有方向移动它,你能帮助我吗?这是我的代码:

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

编辑: 我发现我不能直接将位图移动到右边。我可以直接向下和向右移动它。但没有其他人。

2 个答案:

答案 0 :(得分:0)

您是否检查 AndroidDudeHitbox 是否包含点数(如果已触及),而您的绘图 AndroidDude 就在其上方。删除下面的if语句或在AndroidDude上绘制hitbox。

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

答案 1 :(得分:0)

首先:不要在onTouch方法中进行'sleep'调用。这是在寻找麻烦。

首先,暂时删除检查AndroidDudeHitbox.contains((int)event.getX(),(int)event.getY())的if语句。只需使用event.getX()和event.getY()更新AndroidX和AndroidY。

最后,我认为最重要的是,在更改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”语句,暂时删除,并查看是否所有内容仍然有效。