Intereting Posts
Android установлен в одном действии, а затем появляется кнопка в другой активности Обратные вызовы Android InAppBrowser _system Закладка для смартфонов Ужасное изображение растрового изображения ImageView? Предотвращать частичное перекрытие хода, способного вытягивать форму Как удалить уведомление об андроиде из центра уведомлений, когда приложение запускается с помощью значка его запуска? Android скопировать изображение из папки галереи на альтернативную папку SD-карты Как переупаковать HttpClient 4.3.1 и удалить зависимости от ведения общедоступных записей? Android Map API v2 не отображает карту на некоторых устройствах Eclipse падает с превышением лимита GC после того, как вы связали службы google play Не удалось запустить службу намерения GCM Android – проблемы с анимацией значка ActionBar из фрагментов Chrome на Android не уважает z-index для кликов по ссылкам Facebook onCompleted Email java.lang.NullPointerException Android – Код ошибки 11 при импорте базы данных Sqlite в Galaxy Note

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

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

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

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

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

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

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

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

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

Спасибо Shade за то, что он дал мне другие варианты.

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

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

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

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

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

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

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

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