私はこれをテストしていませんが、うまくいくと思います。微調整して修正する必要があると確信しています。
3 つのボタンがエイリアシングのない 3 つの異なる色であり、他のすべてのピクセルが純粋な黒である背景画像のコピーを作成します。JPG 圧縮アーティファクトが発生しないように、PNG である必要があります。これがあなたのマスクになります。ボタンが 3 つしかないので、純粋な赤、緑、青を使用できます。縦横比が同じである限り、おそらく元の画像よりも解像度が低くなる可能性があります。
ImageView をサブクラス化し、代わりにサブクラスを使用して背景を描画します。ImageView のサブクラス化されたバージョンを、マスク イメージをビットマップとして渡します。
class TouchMaskImageView extends ImageView {
...constructors
public void setTouchMask(Bitmap mask){
this.mMask = mask;
}
public interface OnTouchedListener{
public void onTouched(MotionEvent event, int colorTouched);
public void onTouchCanceled();
}
public void setOnTouchedListener(OnTouchedListener listener){
this.mOnTouchedListener = listener;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
if (mOnTouchedListener != null && mMask != null ) {
if (x >=0 && x < (float)getWidth() &&
y >=0 && y < (float)getHeight()) {
//Next two lines will be more complicated if
// you aren't using scaleType fitXY
int maskX = (int) x * mMask.getWidth() / getWidth();
int maskY = (int) y * mMask.getWidth() / getHeight();
int maskColor = mask.getPixel(maskX, maskY);
mOnTouchedListener.onTouched(event, maskColor);
} else if (event.getAction()==MotionEvent.UP){
//released finger outside image view
mOnTouchedListener.onTouchCanceled();
}
}
}
}
これで、ボタンと同様のタッチ ロジックを処理する OnTouchedListener を作成できます。状態を追跡する必要があります。以下に例を示しますが、マルチタッチがあるとこれが壊れるかどうかはわかりません。また、最初の指のアクション マスクを設定し、getAction() の代わりに getActionMasked() を使用する必要がある場合があります。
public void onTouched(MotionEvent event, int colorTouched){
switch(mState){
case STATE_WAITING:
if (event.getAction()==MotionEvent.ACTION_DOWN){
switch (colorTouched){
case 0xffff0000: //red
mTouchMaskImageView.setImageResource(R.drawable.redButtonDown);
mState = STATE_LATCHED_RED;
break;
case 0xff00ff00: //green
mTouchMaskImageView.setImageResource(R.drawable.greenButtonDown);
mState = STATE_LATCHED_GREEN;
break;
case 0xff0000ff: //blue
mTouchMaskImageView.setImageResource(R.drawable.blueButtonDown);
mState = STATE_LATCHED_BLUE;
break;
}
}
break;
case STATE_LATCHED_RED:
switch (event.getAction()){
case (MotionEvent.ACTION_MOVE):
if (colorTouched = 0xffff0000)
mTouchMaskImageView.setImageResource(R.drawable.redButtonDown);
else
mTouchMaskImageView.setImageResource(R.drawable.defaultImage);
break;
case (MotionEvent.ACTION_UP)
if (colorTouched = 0xffff0000)
performRedButtonAction();
mTouchMaskImageView.setImageResource(R.drawable.defaultImage);
mState = STATE_WAITING;
break;
}
break;
case etc. for other two latched colors...
break;
}
}
public void onTouchCanceled(){
mTouchMaskImageView.setImageResource(R.drawable.defaultImage);
mState = STATE_WAITING;
}
4 つの可能な状態を表すには、イメージの 4 つの異なるコピーが必要になるため、これはやや大雑把です。時間をかけてメモリを節約し、より高速に実行したい場合は、正しい位置にオーバーレイされた 3 つのボタンの個別の画像ビューを使用してレイアウトを設定し、画像の変更をターゲットにすることができます。しかし、どんな画面サイズにも完全に合わせる必要があることを考えると、これは非常に困難です。