【问题标题】:Moving Bitmaps in all directions向各个方向移动位图
【发布时间】:2012-06-02 13:59:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: android bitmap touch-event


    【解决方案1】:

    您检查 AndroidDudeHitbox 是否包含点(如果它被触摸),但您的绘图 AndroidDude 在它上面。要么去掉下面的 if 语句,要么在 AndroidDude 上绘制 hitbox。

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

    【讨论】:

    • 这并不能解决我的问题,但我可以说它不会因为移动首先绘制的内容不应该有所作为,但我的陈述只是询问我是否在命中框的像素内触及了这个已经起作用了,我需要知道为什么它只会让我把他拖下来或拖到右边。但感谢您的回复。
    【解决方案2】:

    首先:不要在 onTouch 方法中进行“睡眠”调用。这是自找麻烦。

    首先,暂时删除检查 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”语句,看看一切是否仍然有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多