2012-01-29 21 views
7

Stworzyłem/próbowałem stworzyć okrągły przycisk dla Androida za pomocą "widżetu" ImageButton. Ale ponieważ ten typ przycisku jest traktowany jako kwadrat, a mój obraz png również jest traktowany jako kwadrat z przezroczystym tłem, to w jaki sposób uniknąć sytuacji, w której użytkownik będzie mógł nacisnąć przycisk poza okrągłym przyciskiem? .. teraz ... mogą naciskać w "rogach" przycisku i to nadal będzie powodować kliknięcie zdarzenia. Czy jest jakaś konkretna warstwa odwzorowania, którą można zrobić w Photoshopie lub w dowolny sposób zmienić promień przycisku obrazu więc pasuje do "okrągłości" mojego obrazu .. lub jakichkolwiek pomysłów?Okrągły przycisk w Androidzie .. unikać naciśnięć przycisku "na zewnątrz" przycisku?

góry dzięki! .. i przepraszam za słaby angielski ..

Odpowiedz

5

Try twierdzenie Pitagorasa i onTouch, prosty i łatwy sposób, aby to zrobić.

public boolean inCircle(MotionEvent e, int radius, int x, int y) { 
    int dx = e.x - x; 
    int dy = e.y - y; 
    double d = Math.sqrt((dx * dx) + (dy * dy)); 
    if(d < radius) 
     return true; 
    return false; 
} 

x, y jest posision okręgu, promień jest promieniem, a e jest TouchEvent masz.

@Override 
public boolean onTouch(View arg0, MotionEvent arg1) { 
    if(arg1.getAction() == MotionEvent.ACTION_DOWN){ 
      if(inCircle(arg1, radius, xCircle, yCircle){ 
        //do whatever you wanna do here 
        } 
      } 
    return false; 
} 
+0

to jednostki, które używają dp lub pikseli? .. a pozycja ... to pozycja, w której można użyć środkowej pozycji koła .. lub lewego górnego rogu? .. – Inx

+0

Dzięki za pomoc :) – Inx

+0

wypróbowałem to. ale wygląda na to, że liczy się od lewego górnego rogu i nie przesunie "pivota" koła, które ma liczyć od .. – Inx

2

byłem przy użyciu ImageView jak mój przycisk krąg, a ja musiałem dokonać pewnych zmian @ Kod Daniela, aby to działało tak, jak chciałem. Oto mój kod:

private boolean mStillDown = false; 

public boolean inCircle(MotionEvent e, float radius, float x, float y) { 
    float dx = e.getX() - x; 
    float dy = e.getY() - y; 
    double d = Math.sqrt((dx * dx) + (dy * dy)); 
    if(d < radius) 
     return true; 
    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    int action = event.getAction(); 
    boolean inCircle = inCircle(event, getWidth()/2.0f, getWidth()/2.0f, getHeight()/2.0f); 

    if(inCircle){ 
     if(action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN){ 
      this.setPressed(true); 
      mStillDown = true; 
     }else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP){ 
      if(this.isPressed()){ 
       this.performClick(); 
       this.setPressed(false); 
       mStillDown = false; 
      } 
     }else if(action == MotionEvent.ACTION_MOVE && mStillDown){ 
      this.setPressed(true); 
     } 
    }else{ 
     if(action == MotionEvent.ACTION_MOVE){ 
      this.setPressed(false); 
     }else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_OUTSIDE){ 
      mStillDown = false; 
     } 
    } 

    return true; 
} 

Mam nadzieję, że jest to przydatne dla kogoś.

Powiązane problemy