Situtation:
我正在开发一个小应用程序,它应该允许用户根据他们点击的屏幕部分触发某些内容。想象一张泰迪熊的图片,如果你点击一个鼻子就会说“鼻子”。我所做的是布局xml一个LinearLayout。因为我必须覆盖不同的屏幕尺寸,所以我没有在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>
然后在onCreate活动中我检查显示分辨率并通过setBackgroundResource()设置相应的背景。我为每个分辨率准备了背景图像。
final Point QVGA = new Point(240,320); // portrait
// Obtain the screen resolution if the device
Display defaultDisplay = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point displayResolution = new Point(defaultDisplay.getWidth(), defaultDisplay.getHeight());
if (displayResolution.equals(QVGA))
{
viewThouShaltRespondToClicks.setBackgroundResource(R.drawable.image_to_be_clicked_upon_240x320);
viewInvisibleMask.setBackgroundResource(R.drawable.mask_240x320);
}
else if ... // check for another resolution
即使资源中的图像尺寸不正确,也会拉伸/缩小到屏幕尺寸。只要背景图像的宽高比与显示的比例相似并且所得到的图像没有被多次关联,这就没有问题。但是有一个问题,如下所述。
为了检测点击了哪个区域,区域本身可能是不规则形状的,我采取了以下方法。我创建了一个与背景图像尺寸相同的图像 - 面具(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
但我不知道如何将Bitmap缩放到合适的大小。
有什么建议吗?
答案 0 :(得分:0)
第一个问题:是的,您可以在布局中包含一个包含蒙版图像的单独视图,并将其设置为android:visibility=invisible
不可见。
第二个问题:您可以使用Bitmap.getPixel()
从位图中读取像素值。 Docs are here
答案 1 :(得分:0)
只是一个简单的建议。您可以在真实图像后面的imageview中获得参考图像。因此,两个图像以完全相同的方式加载,放在ImageViews中,然后插入到relativelayout中。这样他们应该是相同的大小,只有其中一个是可见的。
这可能不是一个非常漂亮的方式,我不确定它是否会起作用,但你可以尝试一下。