Android 如何实现图像掩码?

Android 如何实现图像掩码?,android,user-interface,android-layout,Android,User Interface,Android Layout,情况: 我正在开发一个小应用程序,它可以让用户根据点击屏幕的哪个部分触发一些东西。想象一张泰迪熊的照片,如果你点击一个鼻子,它就会显示“鼻子”。我所做的是将布局xml放入一个线性布局中。因为我必须覆盖不同的屏幕大小,所以我没有在xml布局文件中设置背景 代码段表单xml: <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/viewMain"

情况:

我正在开发一个小应用程序,它可以让用户根据点击屏幕的哪个部分触发一些东西。想象一张泰迪熊的照片,如果你点击一个鼻子,它就会显示“鼻子”。我所做的是将布局xml放入一个线性布局中。因为我必须覆盖不同的屏幕大小,所以我没有在xml布局文件中设置背景

代码段表单xml:

<FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/viewMain"            
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:visibility="visible" >    
  <LinearLayout
        android:id="@+id/viewThouShaltRespondToClicks"
            android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:orientation="vertical"
        android:longClickable="true"
        android:visibility="visible" />

  <!-- mask -->
  <LinearLayout
    android:id="@+id/viewInvisibleMask"
    android:visibility="invisible"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
  </LinearLayout>
</FrameLayout>
即使资源中的图像尺寸不正确,它也会拉伸/收缩到屏幕大小。只要背景图像的宽高比与显示的比例相似,并且生成的图像不太复杂,这就可以了。但有一个问题,解释如下

为了检测单击的区域,区域本身可能是不规则形状的,我采用了以下方法。我创建了一个与背景图像尺寸相同的图像-蒙版(bmp),只是它有一个白色背景,可点击的区域有不同的颜色。颜色标识该区域。我所要做的就是获取点击事件的坐标(这里没有问题),转到遮罩图像并读取该坐标上像素的颜色。问题是遮罩图像的大小不正确。在我的设备上,它被设置为1200x700,但我猜它在其他设备上会有一些任意大小

第一个问题:有没有办法说服不可见版面加载背景图像,然后将其拉伸/收缩到显示大小,就像它本身用于可见版面一样

另一种方法是将掩码图像(bmp,png)加载到某个内存结构中,并调整其大小以显示大小。 我试过这样的方法:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;   // do not scale
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
bitmapMask = BitmapFactory.decodeResource(this.getResources(), R.drawable.mask, options);
// on this place stretch shrink should follow but I have no idea how
但我不知道如何将位图缩放到合适的大小


有什么建议吗?

第一个问题:是的,您可以在布局中有一个包含遮罩图像的单独视图,并使用
android:visibility=invisible
将其设置为不可见


第二个问题:可以使用
bitmap.getPixel()
从位图读取像素值

只是一个简单的建议。您可以将参考图像放在真实图像后面的imageview中。因此,两个图像都以完全相同的方式加载,放置在ImageView中,然后插入到relativelayout中。这样,它们的大小应该相等,并且只有一个可见


这可能不是一个很好的方法,我不确定它是否有效,但您可以尝试一下。

细心的读者会注意到,我已经使遮罩视图不可见。问题是背景图像假定了一些任意大小(在我的例子中为1200x700),这与实际视图大小不一致。我也知道getPixel()方法。问题是,我不知道如何将位图缩放到合适的大小。我不确定我是否明白你的意思。你能详细说明一下吗?你创建了一个相对论,包含原始图像和带有触摸颜色的图像。RelativeLayout允许视图彼此重叠。因此,您可以让触摸彩色图像位于原始图像的后面。包含图像的ImageView应具有完全相同的属性。这样,图像的缩放将完全相同(如果加载的图像大小相同)。然后,您应该能够将原始图像上的触摸映射到其后面图像上的颜色。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;   // do not scale
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
bitmapMask = BitmapFactory.decodeResource(this.getResources(), R.drawable.mask, options);
// on this place stretch shrink should follow but I have no idea how