Tôi đã tạo một ImageButton với bộ chọn cho trạng thái được nhấn và không được nhấn và hoạt động tốt.Tạo ImageButton có hình dạng bất thường với các trạng thái nhấp chuột khác nhau
Nhưng nút có hình dạng không đều và tôi chỉ muốn nút có thể nhấp vào khi hình ảnh hình chữ nhật bên dưới không trong suốt.
Vì vậy, tôi đã triển khai OnTouchListener kiểm tra tọa độ của sự kiện liên lạc dựa trên giá trị pixel của Bitmap (như được mô tả trong câu trả lời đầu tiên ở đây: link). Tác phẩm này, về mặt logic quyết định nếu nút được nhấn, nhưng bây giờ hình ảnh của nút không thay đổi thành hình ảnh được nhấn nữa.
Dưới đây là những gì tôi có:
Selector tập tin xml:
<?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 Một phần minh bạch trong cách bố trí:
<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"
/>
Trong Hoạt động:
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;
}
tại sao không 'return OnStartCallButtonTouch (v, event) || startCallButton.onTouch() '? –