У меня странная проблема, связанная с цветом касающейся точки. Я создал изображение (.bmp) и заполнил его краской. Нет градиентов или других цветов. Большую часть времени, когда я касаюсь экрана, я получаю цвет, который я ожидаю, но иногда я получаю немного другой цвет. Мой код кажется достаточно простым:
final Bitmap bm2 = BitmapFactory.decodeFile(image_overlay);
if (bm2!=null) {
overlayimage.setImageBitmap(bm2);
image.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent mev) {
Log.d(MY_DEBUG_TAG, "onTouch()");
DecodeActionDownEvent(v, mev, bm2);
return false;
}
});
}
private void DecodeActionDownEvent(View v, MotionEvent ev, Bitmap bm2)
{
Log.d(MY_DEBUG_TAG, "DecodeActionDownEvent()");
xCoord = new Integer((int)ev.getRawX());
yCoord = new Integer((int)ev.getRawY());
colorTouched = bm2.getPixel(xCoord, yCoord);
Log.d(MY_DEBUG_TAG, "The coordinates touched were x: " + xCoord + "; y: " + yCoord);
Log.d(MY_DEBUG_TAG, "The color touched was (hex) " + Integer.toHexString(colorTouched));
}
Недавно я получил "промах" и проверил координаты изображения, перемещая инструмент eyedropper вокруг, пока он не оказался в точном месте, а пиксель не отличается от других пикселей в области.
Разве не "безопасно" ожидать, что андроид вернет точный цвет? Если я рисую цель С# ff424542, небезопасно ли предположить, что если я удалю эту цель, я получаю пиксельный цвет # ff424542? В этом случае андроид возвращал # ff4a454a. Прикрепленное изображение - это мой файл "image_overlay". Область, на которую я нацеливаюсь, - темно-серый в середине справа. Как я уже сказал, большую часть времени он отлично работает, но время от времени я записываю промах, даже когда я четко вижу целевую зону. Из моих журналов последние промахи были у x: 360, y: 399 и x: 368, y: 399. Успешные хиты были в x: 363, y: 393 и x: 365, y434.
Я предполагаю, что вы используете инструмент eyedropper в приложении на своем ПК, где вы создали изображение? Затем вы предполагаете, что изображение, с которым вы работаете в Android, идентично тому, с которым вы работаете, на вашем ПК. Однако это не безопасное предположение. Каковы свойства исходного растрового изображения, например, разрешение, DPI и т.д. Затем взгляните на Bitmap.decodeFile. Подсказка находится в "декодировании". По умолчанию (отсюда вопрос о свойствах растрового изображения) Android не будет просто читать растровое изображение из вашего спецификатора файла и загружать его в память. Например, и я не уверен, не врываясь в исходный код, возможно, decodeFile сглаживает результирующий растровый рисунок.
Вы должны использовать BitmapFactoryOptions для управления расширением входного растрового изображения:
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html