2

這些是遵循谷歌規格的FAB尺寸。 enter image description here如何僅允許點擊浮動動作按鈕的圈內?

在我的應用程序的情況下,我需要一個點擊監聽程序,點擊FAB的圈子,避免單擊在方形容器內(56x56)。

我已經想過在我的「整個」按鈕中的每個onClick事件中獲取X,Y,然後驗證它是否在我的Fab的圓圈內,但是我想從此解決方法中逃脫,因爲它可能導致準確性單擊問題用不同的設備分辨率。

你有一個替代解決方案的任何想法?

在此先感謝。

編輯:

我實際上已經實現了這個JavaScript的解決方案轉換在Java中
LINK
你認爲我會永遠得到設備的屏幕變化相同的準確度?

+0

你可以只使用兩個按鈕,放置一個在工廠的頂部... – Dportology

+0

我有一個自定義的橢圓形按鈕同樣的問題..的onclick在盒子發射反正...所以這不是隻有浮動動作按鈕我想,但在佈局一般.. 它看起來像他們必須只是平方.. –

回答

0

我不認爲有一種方法,實際上使可點擊區域矩形之外。 如果你的圓圈是圖像,你應該讓你的浮動按鈕的寬度和高度設置爲wrap_content。任何方式你應該設置它的寬度和高度以匹配圓的直徑。而處理該事件是這樣的:

view.setOnTouchListener(new View.OnTouchListener() { 
           @Override 
           public boolean onTouch(View v, MotionEvent event) { 
            ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); 
            float radius = layoutParams.width/2f; 
            float x = event.getX() - radius; 
            float y = event.getY() - radius; 
            if (isInCircle(radius, x, y)) { 
             if (event.getAction() == MotionEvent.ACTION_DOWN) { 
              // perform your action 
             } 
             return true; 
            } else { 
             return false; 
            } 
           } 

           private boolean isInCircle(float radius, float x, float y) { 
            if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) < radius) { 
             //touch was performed inside the circle; 
             return true; 
            } else { 
             //touched ouside the circle 
             return false; 
            } 
           } 
          } 
    ); 

這將任何設備上工作,只要你的按鈕在你繪製的圓緊緊包裹着。

如果不需要觸摸事件陷入更深,您的浮動按鈕下,當你錯過了一圈,就可以避免一些重複計算是這樣的:

view.setOnTouchListener(new View.OnTouchListener() { 
           @Override 
           public boolean onTouch(View v, MotionEvent event) { 
            if (event.getAction() == MotionEvent.ACTION_DOWN) { 
             ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); 
             float radius = layoutParams.width/2f; 
             float x = event.getX() - radius; 
             float y = event.getY() - radius; 
             if (isInCircle(radius, x, y)) { 
              // perform your action 
             } 
            } 
            return true; 
           } 

           private boolean isInCircle(float radius, float x, float y) { 
            if (Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) < radius) { 
             //touch was performed inside the circle; 
             return true; 
            } else { 
             //touched ouside the circle 
             return false; 
            } 
           } 
          } 
    ); 

請記住,這個工作你的按鈕應該是嚴格的矩形。如果你想要一個按鈕是一個橢圓,數學應該是不同的。