2012-01-29 39 views
7

Tôi đã tạo/cố gắng tạo, một nút tròn cho android bằng cách sử dụng tiện ích "ImageButton". Nhưng vì loại nút đó được coi là hình vuông và hình ảnh png của tôi cũng được coi là hình vuông có nền trong suốt, thì làm cách nào để tránh người dùng không thể nhấn nút ngoài vòng tròn? .. bây giờ .. họ có thể nhấn trong "góc" của nút và điều đó sẽ vẫn kích hoạt sự kiện nhấp chuột. Có bất kỳ lớp bản đồ speciall nào có thể được thực hiện trong photoshop hay bất kỳ cách nào để thay đổi bán kính của nút hình ảnh do đó, nó phù hợp với "tròn" của hình ảnh của tôi .. hoặc bất kỳ ý tưởng?Nút tròn trong android .. tránh nhấn "bên ngoài" nút?

Cảm ơn trước! .. và xin lỗi vì kém tiếng Anh ..

Trả lời

5

Cố định lý Pythagore và onTouch, đơn giản và dễ dàng để làm điều đó.

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 là vị trí của vòng tròn, bán kính là bán kính và e là TouchEvent mà bạn có.

@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

là đơn vị sử dụng dp hoặc pixel? .. và theo vị trí .. là vị trí sử dụng vị trí giữa của vòng tròn .. hoặc góc trên cùng bên trái? .. – Inx

+0

Cảm ơn bạn đã trợ giúp :) – Inx

+0

đã dùng thử. Nhưng nó có vẻ như đếm của nó từ góc trên bên trái và sẽ không di chuyển các "trục" của vòng tròn mà để đếm từ .. – Inx

2

Tôi đang sử dụng ImageView làm nút vòng kết nối và tôi cần thực hiện một số thay đổi đối với mã @ Daniel để làm cho nó hoạt động theo cách tôi muốn. Đây là mã của tôi:

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; 
} 

Hy vọng điều này hữu ích cho người khác.

Các vấn đề liên quan