我没有对此进行测试,但我认为它会起作用。我敢肯定,您将不得不对其进行调整并进行更正。
创建背景图像的副本,其中三个按钮是三种不同的颜色,没有锯齿,所有其他像素都是纯黑色。它必须是 PNG,因此它不会有 JPG 压缩伪影。这将是你的面具。您可以只使用纯红色、绿色和蓝色,因为您只有三个按钮。只要纵横比相同,它的分辨率可能低于原始图像。
子类 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。它将需要跟踪状态。这是一个示例,但我不确定在多点触控时这是否会中断。您可能还需要为食指设置一个动作掩码,并使用 getActionMasked() 而不是 getAction()。
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;
}
这有点粗略,因为您需要图像的四个不同副本来表示四种可能的状态。如果您想花时间节省一些内存并使其运行得更快,您可以尝试设置布局,为覆盖在正确位置的三个按钮设置单独的图像视图,并将这些按钮定位为图像更改。但这将是非常具有挑战性的,考虑到你必须让它完美地适应任何屏幕尺寸。