2011-12-14 14 views
-1

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 

しかし、私は適切なサイズにビットマップを拡大縮小する方法がわかりません。

提案がありますか?

答えて

0

最初の質問:はい、マスク画像を含むレイアウトに別のビューを作成し、android:visibility=invisibleで非表示に設定することができます。

2番目の質問:Bitmap.getPixel()でビットマップからピクセル値を読み取ることができます。 Docs are here

+1

注意深い読者は、私がすでにマスクビューを見えなくしていることに気付くでしょう。問題は、背景画像が実際のビューサイズに対応しない任意のサイズ(私の場合は1200x700)を想定していることです。 getPixel()メソッドは私にも知られています。問題は、ビットマップを適切なサイズにスケールする方法がわからないことです。 – Anderson

0

単純な提案。実際の画像の背後にある画像ビューに参照画像を置くことができます。したがって、両方の画像はまったく同じ方法でロードされ、ImageViewsに配置され、相対位置に挿入されます。そうすれば、彼らは同じサイズでなければならず、それらのうちの1つだけが見えます。

これは非常にきれいな方法ではないかもしれませんが、それがうまくいくかどうかはわかりませんが、試してみることができます。

+0

私はあなたが何を意味するか分かりません。あなたはそれを詳しく教えていただけますか? – Anderson

+0

RelativeLayoutを作成して、元のイメージとイメージをタッチカラーで保存します。 RelativeLayoutを使用すると、ビューを互いに重ね合わせることができます。それで、あなたはタッチカラーの画像を元の画像の後ろに置くことができます。イメージを含むImageViewsは、まったく同じプロパティを持つ必要があります。この方法では、画像はまったく同じようにスケーリングされます(読み込んだ画像が同じサイズの場合)。次に、元の画像のタッチを、その背後の画像の色にマップすることができます。 –

関連する問題