Проверка, если нажата внутри rectF в onTouchEvent - PullRequest
5 голосов
/ 08 декабря 2011

Я работал над очень простым небольшим приложением, используя расширенный вид. Проблема в том, что я не могу найти то, что было нажато в моем onTouchEvent. Я понял, что должен сравнить точки давления (x и y) с элементами и посмотреть, какой это может быть.

Но ... Я объявил прямоугольник, используя:

Paint color= new Paint();
color.setColor(Color.BLACK);
rectF = new RectF(0.0f, 0.0f, 1.0f, 0.5f) ;
canvas.drawRect(rectF, color);

Пока все хорошо, но в функции onTouchEvent

public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction() ;
    float x = event.getX() ;
    float y = event.getY() ;

    switch(action) {
    case MotionEvent.ACTION_DOWN:

        if(rectF().contains(x, y)) {
            // Something should happen
        }

    }

    invalidate();
    return true ;
}

Я установил rectF с какими-то относительными точками в диапазоне от 0 до 1, но X и Y, которые я получаю от события, варьируются от 0 и выше в зависимости от размера экрана.

Можно ли легко преобразовать любое из значений?

Редактировать

Думал, кто-то заинтересован в окончательном решении ...

public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction() ;
    float x = event.getX() ;
    float y = event.getY() ;

    int width = this.getWidth() ;
    int height = this.getHeight() ;

    switch(action) {
    case MotionEvent.ACTION_DOWN:

        if(rectF().contains(x/width, y/height)) {
            // Something should happen
        }

    }

    return true ;

}   

1 Ответ

2 голосов
/ 08 декабря 2011

Значения точки касания и RectF должны быть в одном и том же эталонном масштабе в рудере для правильного сравнения.Это означает, что если вы объявите, что RectF использует относительные размеры (0-1), вам потребуется:

1: нормализовать позицию MotionEvent в соответствии с размером экрана

ИЛИ 2: "денормализовать" размеры RectF в соответствии с вашим фактическим размером экрана.

Я думаю, что 1, как правило, предпочтительнее, так как позволяет вам определять свои риты с точки зрения относительного расположения, независимо от фактического размера экрана и преобразовывать событиепозиции на лету.

, например: rectF.contains(x/screenWidth, y/screenHeight);

Вы можете получить размеры экрана, вызвав
Display display = getWindowManager().getDefaultDisplay() в своей деятельности, а затем позвонив display.getWidth() или display.getHeight()

...