Обнаружение касания на растровом изображении - PullRequest
10 голосов
/ 15 марта 2010

Привет,

Кто-нибудь знает, как я могу определить, когда пользователь нажимает на растровое изображение внутри холста?

Спасибо

Ответы [ 3 ]

29 голосов
/ 15 марта 2010

Вы должны работать с чем-то вроде этого:

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

    switch(action){
    case MotionEvent.ACTION_DOWN:
        if (x >= xOfYourBitmap && x < (xOfYourBitmap + yourBitmap.getWidth())
                && y >= yOfYourBitmap && y < (yOfYourBitmap + yourBitmap.getHeight())) {
            //tada, if this is true, you've started your click inside your bitmap
        }
        break;
    }
}

Это начало, но вам нужно обработать case MotionEvent.ACTION_MOVE и case MotionEvent.ACTION_UP, чтобы убедиться, что вы правильно справляетесь с пользовательским вводом. Метод onTouchEvent вызывается каждый раз, когда пользователь: опускает палец, перемещает палец уже на экране или поднимает палец. Каждый раз, когда событие несет координаты X и Y, где находится палец. Например, если вы хотите проверить, кто-то нажимает на ваше растровое изображение, вы должны сделать что-то вроде установки логического значения, чтобы касание началось внутри растрового изображения в ACTION_DOWN, а затем проверить ACTION_UP, что вы все еще находитесь внутри растрового изображения.

3 голосов
/ 15 марта 2010

Стив, У Google есть отличная статья и учебник по обработке событий пользовательского интерфейса @ http://developer.android.com/guide/topics/ui/ui-events.html. Это то, с чего я начал, и это было здорово для меня: -)

0 голосов
/ 29 сентября 2013

Это обнаружит касание и проверит, не является ли оно прозрачным. Вам это нужно, если ваши растровые изображения не являются прямоугольниками. myBitmap - это простой контейнерный класс, который я использую.

private boolean clickOnBitmap(MyBitmap myBitmap, MotionEvent event) {
    float xEnd = myBitmap.originX() + myBitmap.width();
    float yEnd = myBitmap.originY() + myBitmap.height();;


    if ((event.getX() >= myBitmap.originX() && event.getX() <= xEnd) 
    && (event.getY() >= myBitmap.originY() && event.getY() <= yEnd) ) {
        int pixX = (int) (event.getX() - myBitmap.originX());
        int pixY = (int) (event.getY() - myBitmap.originY());
        if (!(myBitmap.getBitmap().getPixel(pixX, pixY) == 0)) {
            return true;
        } else {
            return false;
        }
    }
    return false;
}

Это код на ощупь для полноты

    @Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if (clickOnBitmap(dog, event)) {
                Toast.makeText(getContext(), "dog", Toast.LENGTH_SHORT).show();
            } else if (clickOnBitmap(mouse,event)) {
                Toast.makeText(getContext(), "mouse", Toast.LENGTH_SHORT).show();
            }
        return true;
        case MotionEvent.ACTION_OUTSIDE:
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            return true;
    }
    return false;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...