1

我在获取被触摸点的颜色时遇到了一个奇怪的问题。我创建了一个图像(.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));
 }

最近我遇到了一个“失误”,并通过移动吸管工具检查图像的坐标,直到它位于准确的位置,并且该像素与该区域中的其他像素没有什么不同。

期望android返回确切的颜色不是“安全”的吗?如果我用#ff424542 绘制一个目标,假设如果我击中那个目标,我会得到一个#ff424542 的像素颜色,这不安全吗?在这种情况下,android 正在返回 #ff4a454a。附加图像是我的“image_overlay”文件。我瞄准的区域是右中部的深灰色。就像我说的,大多数时候它工作得很好,但每隔一段时间我就会记录一次失误,即使我清楚地处于目标区域。根据我的日志,最近的失误是 x:360, y:399 和 x:368, y:399。成功命中在 x:363, y:393 和 x:365, y434。

image_overlay

4

1 回答 1

0

我猜您是在 PC 上的应用程序中使用吸管工具,您在哪里生成了图像?然后,您假设您在 Android 中使用的图像与您在 PC 上使用的图像相同。然而,这不是一个安全的假设。您的源位图的属性是什么,例如分辨率、DPI 等。然后看看 Bitmap.decodeFile。线索在“解码”中。默认情况下(因此关于位图属性的问题),Android 不会简单地从文件说明符中读取位图并将其加载到内存中。例如,如果不深入研究源代码,我不确定,也许 decodeFile 正在抖动生成的位图。

您应该使用 BitmapFactoryOptions 来控制输入位图的解码方式:

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

于 2012-06-18T20:49:28.540 回答