Android 创建具有不同单击状态的不规则形状的ImageButton
我创建了一个带有选择器的ImageButton,用于选择按下和未按下的状态,效果很好 但是按钮有一个不规则的形状,我只希望它在底层矩形图像不透明的地方可以点击 因此,我实现了一个OnTouchListener,它根据位图的像素值检查触摸事件的坐标(如第一个答案所述:)。 在决定按钮是否被按下的逻辑方面,这是可行的,但现在按钮的图像不再变为按下的图像 以下是我所拥有的: 选择器xml文件:Android 创建具有不同单击状态的不规则形状的ImageButton,android,touch,transparent,imagebutton,clickable,Android,Touch,Transparent,Imagebutton,Clickable,我创建了一个带有选择器的ImageButton,用于选择按下和未按下的状态,效果很好 但是按钮有一个不规则的形状,我只希望它在底层矩形图像不透明的地方可以点击 因此,我实现了一个OnTouchListener,它根据位图的像素值检查触摸事件的坐标(如第一个答案所述:)。 在决定按钮是否被按下的逻辑方面,这是可行的,但现在按钮的图像不再变为按下的图像 以下是我所拥有的: 选择器xml文件: <?xml version="1.0" encoding="utf-8"?> <selec
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" android:drawable="@drawable/button_start_call_pressed" />
<item android:drawable="@drawable/button_start_call_normal" />
</selector>
布局中的部分透明图像按钮:
<ImageButton
android:id="@+id/dashboardStartCallButton"
android:background="@null"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/start_call_button_selector"
/>
在活动中:
public void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
...
ImageButton startCallButton = (ImageButton) this.findViewById(R.id.dashboardStartCallButton);
startCallButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return OnStartCallButtonTouch(v,event);
}
});
}
public boolean OnStartCallButtonTouch(View v, MotionEvent event)
{
Bitmap TheBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.button_start_call_normal);
int eventPadTouch = event.getAction();
int iX = (int) event.getX();
int iY = (int) event.getY();
switch (eventPadTouch) {
case MotionEvent.ACTION_DOWN:
if (iX>=0 & iY>=0 & iX<TheBitmap.getWidth() & iY<TheBitmap.getHeight()) {
if (TheBitmap.getPixel(iX,iY)!=0) {
onStartCallButtonClicked(v);
return false;
}
}
}
return true;
}
public void onCreate(Bundle savedInstance){
super.onCreate(savedInstance);
...
ImageButton startCallButton=(ImageButton)this.findViewById(R.id.dashboardStartCallButton);
startCallButton.setOnTouchListener(新的OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
返回OnStartCallButtonTouch(v,事件);
}
});
}
公共布尔值OnStartCallButtonTouch(视图v,运动事件)
{
位图TheBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.button\u start\u call\u normal);
int eventPadTouch=event.getAction();
int iX=(int)event.getX();
int iY=(int)event.getY();
开关(eventPadTouch){
case MotionEvent.ACTION\u DOWN:
如果(iX>=0&iY>=0&iX我认为您实际上在寻找这个:
如果点不在所需区域,您需要在自定义按钮中重写此方法以返回false。我建议您这样做:
public static class MyButton extends ImageButton {
...
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
int iX = (int) event.getX();
int iY = (int) event.getY();
// TODO Or use a more sophisticated, pixel value-based condition
if (!(iX>=0 & iY>=0 & iX<TheBitmap.getWidth() & iY<TheBitmap.getHeight())) {
return false;
}
return super.dispatchTouchEvent(event)
}
}
公共静态类MyButton扩展ImageButton{
...
@凌驾
公共布尔dispatchTouchEvent(MotionEvent){
int iX=(int)event.getX();
int iY=(int)event.getY();
//TODO或使用更复杂的基于像素值的条件
如果(!(iX>=0&iY>=0&iX我认为您需要修改碰撞检测,以确定触摸是否在按钮内部。请使用以下方法
public boolean OnStartCallButtonTouch(View v, MotionEvent event)
{
Bitmap TheBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.button_start_call_normal);
int eventPadTouch = event.getAction();
int iX = (int) event.getX();
int iY = (int) event.getY();
int[] location = new int[2];
v.getLocationOnScreen(location);
int viewX = location[0];
int viewY = location[1];
switch (eventPadTouch) {
case MotionEvent.ACTION_DOWN:
if (iX>=viewX & iY>=viewY & iX<=(viewX+TheBitmap.getWidth()) & iY<=(viewY+TheBitmap.getHeight())) {
if (TheBitmap.getPixel(iX,iY)!=0) {
onStartCallButtonClicked(v);
showPressedState();
return false;
}
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
showNormalState();
break;
}
return true;
}
private void showNormalState() {
// set your button background drawable to show normal state
}
private void showPressedState() {
// set your button background drawable to show pressed state
}
public boolean OnStartCallButtonTouch(视图v,运动事件)
{
位图TheBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.button\u start\u call\u normal);
int eventPadTouch=event.getAction();
int iX=(int)event.getX();
int iY=(int)event.getY();
int[]位置=新int[2];
v、 getLocationOnScreen(位置);
int viewX=位置[0];
int viewY=位置[1];
开关(eventPadTouch){
case MotionEvent.ACTION\u DOWN:
如果(IX>=VIEWXY和IIV= VIEWY和IX为什么不<代码>返回OnStasTraceButoToul(V,事件)→StastCalButo.OnTouCH()/代码>?嘿,进展如何?如果答案是为你做的,请考虑接受它。