手势onSingleTap确认了奇怪的行为

时间:2014-03-02 15:42:46

标签: android

我相信你聪明的头脑和强大的安卓技能。我有点卡住了。

我有以下情况。我已经创建了用于学习如何使用手势和画布的应用程序。

当我单击屏幕时,想法很简单,我点击的地方应该出现气泡(R.drawable.bubble)。如果已经有一些泡泡应用程序应该删除它(空白区域)。

但是,我有一些困难。我拍摄的地方和实际出现气泡的位置有一些显着不同的位置。

请给我一些建议。我错过了什么?

提前致谢。下面我提供我的代码。

public class BubbleActivity extends Activity {

// Main view
RelativeLayout mFrame;

// Bubble image
private Bitmap mBitmap;

// gesture detector
GestureDetector mGestureDetector;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_bubble);

    // setup user interface
    mFrame = (RelativeLayout) findViewById(R.id.frame);

    // load basic bubble Bitmap
    mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.b128);
}




@Override
protected void onResume() {
    super.onResume();

    // init gesture detector
    setupGestureDetector();

}




private void setupGestureDetector() {

    mGestureDetector = new GestureDetector(this, 
            new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {


            if(mFrame.getChildCount() == 0) {

                BubbleView bubble = new BubbleView(getApplicationContext(),
                           e.getX(),
                           e.getY());
                mFrame.addView(bubble);

            } else {

                for(int i=0; i < mFrame.getChildCount(); i++) {

                    BubbleView bubble = (BubbleView) mFrame.getChildAt(i);

                    if(bubble.intersect(e.getX(), e.getY())) {

                        mFrame.removeViewAt(i);

                    } else {

                        BubbleView newBubble = new BubbleView(getApplicationContext(),
                                   e.getX(),
                                   e.getY());

                        mFrame.addView(newBubble);
                    }

                }

            }




            return true;
        }



    });
}


@Override
public boolean onTouchEvent(MotionEvent event) {

    this.mGestureDetector.onTouchEvent(event);

    return false;
}


private class BubbleView extends View {
    private static final int BITMAP_SIZE = 64;
    private float mXPos;
    private float mYPos;

    private Bitmap mScaledBitmap;
    private int mScaledBitmapWidth;

    public BubbleView(Context context, float x, float y) {
        super(context);

        mXPos = x;
        mYPos = y;

        Random r = new Random();

        createScaledBitmap(r);
    }

    private void createScaledBitmap(Random r) {

        mScaledBitmapWidth = (r.nextInt(3) + 1) * BITMAP_SIZE;

        mScaledBitmap = Bitmap.createScaledBitmap(mBitmap,
                                                  mScaledBitmapWidth,
                                                  mScaledBitmapWidth,
                                                  false);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        Paint mPaint = new Paint();
        mPaint.setAntiAlias(true);

        canvas.drawBitmap(mScaledBitmap,
                          this.mXPos,
                          this.mYPos,
                          mPaint);
    }



    public boolean intersect(float x, float y) {

        if(Math.abs(this.mXPos - x) < mScaledBitmapWidth  
                || Math.abs(this.mYPos - y) < mScaledBitmapWidth) {
            return true;
        } else {
            return false;
        }

    }

}





@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.bubble, menu);
    return true;
}

}

4 个答案:

答案 0 :(得分:1)

这是课程中课程代码的一部分! 我建议您使用其他选项来查找解决方案(例如,通过查看视频和示例代码给出)

答案 1 :(得分:1)

我看到的一件事是你应该在for循环之外创建新的BubbleView对象。 我会使用布尔值,如果你在循环中没有找到任何人,那么你可以创建一个。

public boolean onSingleTapConfirmed(MotionEvent e) {
        boolean found = false;

        if(mFrame.getChildCount() == 0) {

            BubbleView bubble = new BubbleView(getApplicationContext(),
                       e.getX(),
                       e.getY());
            mFrame.addView(bubble);

        } else {

            for(int i=0; i < mFrame.getChildCount(); i++) {

                BubbleView bubble = (BubbleView) mFrame.getChildAt(i);

                if(bubble.intersect(e.getX(), e.getY())) {

                    mFrame.removeViewAt(i);
                    found = true;
                    break;
                } 
            }
        }

        if (!found) {
            BubbleView newBubble = new BubbleView(getApplicationContext(),
                               e.getX(),
                               e.getY());

            mFrame.addView(newBubble);
        }

答案 2 :(得分:1)

在BubbleView构造函数中使用以下行来设置缩放位图的位置。

            // Adjust position to center the bubble under user's finger
        mXPos = x - mScaledBitmapWidth / 2;
        mYPos = y - mScaledBitmapWidth / 2;

这将使用户手指下的气泡视图位图居中。 Coursera的骨架项目已包含这些内容。

此外,您还需要在代码中再进行一次更正 -

     @Override

     public boolean onTouchEvent(MotionEvent event) {

            return this.mGestureDetector.onTouchEvent(event);
            //return false;
     }

答案 3 :(得分:0)

我同意Ignacio Rubio关于在for循环之外创建新泡泡的建议,但是在此特定情况下,找到的默认值为false,第一次单击将创建两个气泡:(1)to满足if(mFrame.getChildCount()== 0)和(2)if(!found)

的条件

要解决此问题,您可以使用int代替布尔值

public boolean onSingleTapConfirmed(MotionEvent event) {

            int found = 0;

            if(mFrame.getChildCount() == 0) {

                Log.v(TAG, "Make First Bubble");
                BubbleView bubble = new BubbleView(getApplicationContext(),
                        event.getX(),
                        event.getY());

                mFrame.addView(bubble);

            } else {

                for(int i=0; i < mFrame.getChildCount(); i++) {

                    BubbleView bubble = (BubbleView) mFrame.getChildAt(i);

                    if(bubble.intersects(event.getX(), event.getY())) {

                        mFrame.removeViewAt(i);
                        found = 1;
                        break;

                    }else{
                        found = 2;
                    }
                }
            }

            if (found == 2) {

                BubbleView newBubble = new BubbleView(getApplicationContext(),
                        event.getX(),
                        event.getY());

                mFrame.addView(newBubble);
            }

            return true;
        }

另外,请仔细检查View.intersect()。触摸必须与气泡的x和y位置相交,而不是x OR y位置。