我没有测试过这个,但我认为它会起作用。我相信你需要微调并进行更正。
创建一个背景图像的副本,在这个副本中,三个按钮是三个不同的颜色,没有锯齿,并且所有其他像素都是纯黑色。它需要是PNG格式,这样就不会有JPG压缩伪影。这将是您的掩码。您可以只使用纯红、绿和蓝色,因为您只有三个按钮。它可能比原始图像分辨率低,只要纵横比相同即可。
子类化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()) {
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){
mOnTouchedListener.onTouchCanceled();
}
}
}
}
现在您可以创建一个OnTouchedListener,处理类似于按钮的触摸逻辑。它需要跟踪状态。这是一个例子,但我不确定当有多个触摸时是否会出现问题。您可能还需要为第一个手指设置一个操作掩码,并使用getActionMasked()而不是getAction()。
public void onTouched(MotionEvent event, int colorTouched){
switch(mState){
case STATE_WAITING:
if (event.getAction()==MotionEvent.ACTION_DOWN){
switch (colorTouched){
case 0xffff0000:
mTouchMaskImageView.setImageResource(R.drawable.redButtonDown);
mState = STATE_LATCHED_RED;
break;
case 0xff00ff00:
mTouchMaskImageView.setImageResource(R.drawable.greenButtonDown);
mState = STATE_LATCHED_GREEN;
break;
case 0xff0000ff:
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;
}
这有点简陋,因为您需要四个不同的图像副本来表示四种可能的状态。如果您愿意花时间节省一些内存并使其运行更快,则可以尝试使用单独的图像视图设置布局,以便在正确位置覆盖三个按钮,并针对这些进行图像更改。但考虑到您必须使其完全适配任何屏幕尺寸,这将非常具有挑战性。