2

これらは、Googleの仕様に準拠したFABの寸法です。 enter image description hereフローティングアクションボタンのサークル内でのみクリックを許可する方法はありますか?

私のアプリケーションの場合、正方形のコンテナ(56x56)内のクリックを避けるために、FABの円をクリックするだけでクリックリスナーが必要です。

私はすでに、「全体」ボタンの各onClickイベントでX、Yを取得し、Fabのサークル内にあるかどうかを確認していましたが、正確なクリックの問題を引き起こす可能性があるため、異なるデバイスの解像度で動作します。

代替ソリューションのご提案はありますか?

ありがとうございます。

EDIT:

私は実際にあなたが私は常にデバイスの画面の変更で同じ精度を得るだろうと思います
LINK
のJava に翻訳されたこのJavaScript-ソリューションを実装しましたか?

+0

2つのボタンを使用して、ファブの上に1つのボタンを配置することができます。 – Dportology

+0

カスタム楕円形のボタンを使用して同じ問題が発生しました。onClickはボックスで起動されます...そうではありません私が想定しているフローティングアクションボタンについてのみですが、一般的なレイアウトでは それは2乗だけでなければならないようです –

答えて

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

があることに留意してくださいボタンは厳密に長方形でなければなりません。ボタンを楕円にしたい場合、数学は異なるはずです。

関連する問題