Situtation:イメージマスクを実装する方法は?
私はユーザーが画面のどの部分をクリックしたかに応じて何かをトリガーできるようにする小さなアプリケーションに取り組んでいます。テディベアの写真を想像し、鼻をクリックすると「鼻」と表示されます。私が行ったことは、LinearLayoutのレイアウト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>
そして活性の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
リソース内のイメージのサイズが正しくない場合でも、画面サイズに伸縮します。これは、背景画像の幅 - 高さの比が表示の比に類似し、得られる画像があまりキュートされない限り、OKである。しかし、以下に説明する問題があります。
クリックした領域を検出するには、領域自体が不規則な形状になっている可能性があります。以下のアプローチをとっています。背景画像と同じ寸法の画像マスク(bmp)を作成します。この画像マスクは白い背景を持ち、クリック可能な領域は異なる色です。色によって領域が識別されます。私がしなければならないのは、クリックイベントの座標を取得するだけです(ここでは問題ありません)。マスクイメージに移動し、この座標のピクセルの色を読み取ります。問題は、マスク画像が正しいサイズでないことです。私のデバイス上では1200x700に設定されていますが、それは他のデバイス上の任意のサイズになります。
最初の質問:インビジブルレイアウトに背景イメージをロードしてから、それを表示レイアウトに伸縮させる方法はありますか?
もう1つのアプローチは、マスクイメージ(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
しかし、私は適切なサイズにビットマップを拡大縮小する方法がわかりません。
提案がありますか?
注意深い読者は、私がすでにマスクビューを見えなくしていることに気付くでしょう。問題は、背景画像が実際のビューサイズに対応しない任意のサイズ(私の場合は1200x700)を想定していることです。 getPixel()メソッドは私にも知られています。問題は、ビットマップを適切なサイズにスケールする方法がわからないことです。 – Anderson