私はこれをテストしていませんが、うまくいくと思います。私はあなたがそれを微調整し修正する必要があると確信しています。
3つのボタンがエイリアシングのない3つの異なる色で、他のすべてのピクセルが純粋な黒色である背景画像のコピーを作成します。 JPG圧縮の成果物を持たないように、PNGである必要があります。これはあなたのマスクになります。 3つのボタンしかないので、純粋な赤、緑、青を使うことができます。アスペクト比が同じであれば、元の画像よりも解像度が低い可能性があります。
サブクラスImageViewをサブクラス化し、代わりにサブクラスを使用して背景を描画します。 ImageViewのサブクラス化されたバージョンをマスクイメージとしてBitmapとして渡します。
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つのボタンの別々のイメージビューを使用してレイアウトを設定し、イメージの変更をターゲットにしてください。しかし、これは非常に難しいでしょう。あらゆる画面サイズに対して完璧に整列させる必要があるからです。
タッチ位置を取得! http://stackoverflow.com/questions/3476779/how-to-get-the-touch-position-in-android –
@twntee:最新の質問をご覧ください。 – Ponting
これはあなたを助けます:http://stackoverflow.com/questions/11283653/real-custom-shape-of-button また、あなたのレイアウトを仮想セグメント/円弧に分割し、タッチイベントを処理することができます。 – JiTHiN