Как узнать, какая область изображения (не только координаты) была затронута в Android? - PullRequest
7 голосов
/ 07 марта 2011

Я в настоящее время разрабатываю приложение для Android для моего проекта последнего года, которое должно помочь аутичным людям указывать, когда что-то болит, и делать это, касаясь изображения человеческого тела.не знаю, как определить часть изображения, к которой они прикасаются.Изображение является растровым изображением, хранящимся как BitmapDrawable в ImageView.При первом касании оно увеличивается с помощью анимации и setFilledAfter (true), а оттуда при касании области приложение должно распознавать основные части тела (например, голову, левую руку ...).

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

Чтобы сделать приложение немного интереснеедолжен работать на разных устройствах и разрешениях, как на мобильных телефонах, так и на планшетах.

Большое спасибо за вашу помощь.Это действительно нужно и ценится.

РЕДАКТИРОВАТЬ

В конце концов, я постараюсь сделать следующее.У меня будет две копии изображения, одна для демонстрации, другая внутренняя, с областями, которые я хочу распознать, окрашенными в разные цвета.Таким образом, план состоит в том, чтобы экстраполировать координаты, которые я получаю из события Touch, чтобы выяснить, какому пикселю он соответствует по отношению к оригиналу, использовать Bitmap.getPixel (), чтобы определить, какой у него цвет, а затем получить оператор case, возвращающийСтрока каждой части.

Я кодирую это прямо сейчас, если кому-то будет интересно, оставьте сообщение, и я опубликую, как все работает, и мне кто-то попросит его даже соответствующий код: D

Спасибо Шейду за предоставленную мне возможность рассмотреть другие варианты.

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Не слишком задумываясь об этом, кажется, что ваша идея - обнаруживать касания с наложением видов - кажется хорошей.

Кроме того, координаты также являются хорошей идеей - вам просто нужно определить именованные области изображения и проверить, находится ли точка касания в определенной области. Может быть немного более утомительным, но может быть лучше с точки зрения сложности по сравнению с наличием 20 просмотров. Это также определенно будет быстрее, чем добавление 20 дополнительных видов в ваше приложение.

Но, прежде всего, я думаю, что вы должны поэкспериментировать и посмотреть, что подходит для вашей конкретной ситуации, потому что все остальное - догадки.

EDIT:

Если вы решите использовать метод многоугольника, вам придется столкнуться с проблемой определения, находится ли точка внутри многоугольника ( см. Здесь для краткого объяснения).

Кроме того, что касается представлений, представление в Android определяется как «прямоугольная область, занимающая место на экране». Так что исключается возможность непрямоугольных видов. Возможно, у вас есть возможность определить непрямоугольную кликабельную область внутри представления, но я не знаю, возможно ли это вообще.

0 голосов
/ 29 мая 2012

@ Алекс, спасибо за идею, она мне помогла.Это моя реализация вашего решения

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ImageView imgView = (ImageView)this.findViewById(R.id.main_screen);
    imgView.setOnTouchListener(this);
}

@Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.red);
        switch(action) {
        case MotionEvent.ACTION_DOWN:
            int x = (int)event.getX();
            int y = (int)event.getY();
            int color = bMap.getPixel(x, y) ;
            ImageView testimage = (ImageView) findViewById(R.id.main_screen);
            switch(color) {
            case Color.RED:
                testimage.setImageDrawable(getResources().getDrawable(R.layout.red));
                break;
            case Color.BLUE:
                testimage.setImageDrawable(getResources().getDrawable(R.layout.blue));
                break;
            }
            break;
        case MotionEvent.ACTION_UP:
            int x1 = (int)event.getX();
            int y1 = (int)event.getY();
            color = bMap.getPixel(x1, y1) ;
            testimage = (ImageView) findViewById(R.id.main_screen);
            testimage.setImageResource(R.drawable.draw);
            // TODO: Rename constant upper-case.
            final int red = 1;
            final int blue = 2;
            switch(color){
            case Color.RED:
                Intent i = new Intent(this, NewActivity.class);
                i.putExtra(NewActivity.EXT_COLOR, red);
                startActivity(i);
                break;
            case Color.BLUE:
                i = new Intent(this, NewActivity.class);
                i.putExtra(NewActivity.EXT_COLOR, blue);
                startActivity(i);
                break;
            }
            break;
        case MotionEvent.ACTION_MOVE:
            x = (int) event.getX();
            y = (int)event.getY();
            testimage = (ImageView) findViewById(R.id.main_screen);
            color = bMap.getPixel(x, y);
            switch(color){
            case Color.RED:
                testimage.setImageDrawable(getResources().getDrawable(R.layout.red));
                break;
            case Color.BLUE:
                testimage.setImageDrawable(getResources().getDrawable(R.layout.blue));
                break;
            default:
                testimage = (ImageView) findViewById(R.id.main_screen);
                testimage.setImageResource(R.drawable.draw);
                break;
            }
            break;
        }
        return true;
    }
...