继承Button,通过重写onTouchEvent来达到目的。
package com.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
public class IrregularButton extends Button
{
public interface TouchChecker
{
boolean isInTouchArea(int x, int y, int width, int height);
}
private TouchChecker touchChecker;
public IrregularButton(Context context)
{
super(context);
init();
}
public IrregularButton(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
}
public IrregularButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
}
private void init()
{
}
public void setTouchChecker(TouchChecker touchChecker)
{
this.touchChecker = touchChecker;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (touchChecker != null)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
if (touchChecker.isInTouchArea((int) event.getX(), (int) event.getY(), getWidth(), getHeight()))
{
return super.onTouchEvent(event);
}
else
{
return false;
}
}
}
return super.onTouchEvent(event);
}
}
TouchChecker是一个用来判断点击区域的接口,通过给按钮安装不同的TouchChecker,可以实现各种不同的不规则按钮的点击处理。
下面这个可以根据位图的透明度来判断,完全透明的部分不可以点击,其他位置可以点击
package com.test;
import android.graphics.Bitmap;
import android.util.Log;
import com.test.IrregularButton.TouchChecker;
public class BitmapTouchChecker implements TouchChecker
{
private Bitmap bitmap;
public BitmapTouchChecker(Bitmap bitmap)
{
this.bitmap = bitmap;
}
@Override
public boolean isInTouchArea(int x, int y, int width, int height)
{
if (bitmap != null)
{
int pixel = bitmap.getPixel(x, y);
if (((pixel >> 24) & 0xff) > 0)
{
Log.d("BitmapTouchChecker", "isInTouchArea return true");
return true;
}
}
Log.d("BitmapTouchChecker", "isInTouchArea return false");
return false;
}
}
下面这个是根据矩形范围来判断
package com.test;
import java.util.ArrayList;
import android.graphics.Rect;
import android.util.Log;
import com.test.IrregularButton.TouchChecker;
public class RectTouchChecker implements TouchChecker
{
private ArrayList rectList;
public RectTouchChecker(ArrayList rectList)
{
this.rectList = rectList;
}
@Override
public boolean isInTouchArea(int x, int y, int width, int height)
{
if (rectList != null)
{
for (Rect rect : rectList)
{
if (rect.contains(x, y))
{
Log.d("RectTouchChecker", "isInTouchArea return true");
return true;
}
}
}
Log.d("RectTouchChecker", "isInTouchArea return false");
return false;
}
} 如果有其他的需求只要实现一个TouchChecker就可以了。