(Android布局)解决方案在不规则形状图像的顶部放置按钮或获取图像特定区域的触摸检测(可触摸区域)?

在我的Android应用程序中,我在地球上有三个不规则形状,如下所示:

所以我将整个图像放在layout.Globe只是一个图像.这里没有地球的作用.现在我想在全球各个不规则形状的图像上放置一个按钮.

按钮总是长方形但我想要获得不规则形状的触摸事件,而不是矩形区域.那么如何在这三个不规则形状上放三个按钮或者有什么解决方案?这样每个按钮的不同事件可以在活动中处理?

我不知道如何完成这项任务.请指导我这个.

有什么建议或意见吗?

任何帮助将不胜感激.

最佳答案
我没有测试过这个,但我认为它会起作用.我相信你必须调整它并进行修正.

创建背景图像的副本,其中三个按钮是三种不同的颜色,没有锯齿,所有其他像素都是纯黑色.它必须是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;
}

这有点粗糙,因为您需要四个不同的图像副本来表示四种可能的状态.如果您想节省时间以节省一些内存并使其运行得更快,您可以尝试使用单独的图像视图设置布局,使三个按钮重叠在正确的位置并定位图像更改.但这将是非常具有挑战性的,考虑到你必须使它完美地适合任何屏幕尺寸.

转载注明原文:(Android布局)解决方案在不规则形状图像的顶部放置按钮或获取图像特定区域的触摸检测(可触摸区域)? - 代码日志