Utworzono ImageButton za pomocą selektora dla stanów wciśniętych i wciśniętych, co działa dobrze.Tworzenie nieregularnego kształtu ImageButton z różnymi stuknięciami kliknięć
Ale przycisk ma nieregularny kształt i chcę, aby był klikalny tam, gdzie ukryty prostokątny obraz jest nieprzezroczysty.
Więc zaimplementowałem OnTouchListener, który sprawdza współrzędne punktów dotyku względem wartości pikseli Bitmapy (jak opisano w pierwszej odpowiedzi tutaj: link). Działa to w zakresie logiki decydującej, czy przycisk został naciśnięty, ale teraz obraz przycisku nie zmienia się już w naciśnięty obraz.
Oto co mam:
Selector plik 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>
częściowo przezroczyste ImageButton w układzie:
<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"
/>
W działalność:
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;
}
dlaczego nie 'return OnStartCallButtonTouch (v, zdarzenie) || startCallButton.onTouch() '? –