【发布时间】:2026-02-19 04:20:06
【问题描述】:
我的 activity_main 上的 LinearLayout 中有多个按钮,并且想要检测哪个 Button 最接近用户手指。当用户以一个手势移动他的手指时,最近的按钮应该突出显示,当他移开手指时,最近的按钮应该执行其 onClick 功能。
它应该像 android 或 iphone 计算器上的默认键盘一样。它选择离手指最近的按钮。当您拖动手指时,它会将选择更改为最近的键,并且只有当您松开手指时,它才会执行 onClick 功能。
引用Get button coordinates and detect if finger is over them - Android 我已经到了选择有效的地步,但前提是我点击了任何不是按钮的地方,并且当不在按钮上方时选择最近的按钮不起作用。
(在重要的情况下为 API 21 编程)
activity_main.xml
<TextView/>
<ButtonLayout>
<LinearLayout1>
<Button1/>
<Space/>
<Button2/>
<Space/>
<Button3/>
<Space/>
<Button4/>
</LinearLayout1>
<LinearLayout2>
<Button5/>
<Space/>
<Button6/>
<Space/>
<Button7/>
<Space/>
<Button8/>
</LinearLayout2>
</OuterLinearLayout>
Java
private View.OnTouchListener buttonLayoutTouchListener= new View.OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
//OuterLayout
for (int i = 0; i < buttonLayout.getChildCount(); i++) {
View inner = buttonLayout.getChildAt(i);
//Inner
if(inner instanceof LinearLayout) {
for (int j = 0;j<((LinearLayout) inner).getChildCount();j++) {
View current = ((LinearLayout) inner).getChildAt(j);
if (current instanceof Button) {
Button b = (Button) current;
Rect rect = new Rect();
b.getGlobalVisibleRect(rect);
//factors for textview
rect.top-=300;
rect.bottom-=300;
if (!isPointWithin(x, y, rect.left, rect.right, rect.top,
rect.bottom)) {
b.getBackground().setState(defaultStates);
}
if (isPointWithin(x, y, rect.left, rect.right, rect.top,
rect.bottom)) {
if (b != mLastButton) {
mLastButton = b;
b.getBackground().setState(STATE_PRESSED);
//highlight button finger currently over
Log.d("button",mLastButton.getText().toString());
}
}
}
}
}
}
return true;
}
};
static boolean isPointWithin(int x, int y, int x1, int x2, int y1, int y2) {
return (x <= x2 && x >= x1 && y <= y2 && y >= y1);
}
【问题讨论】:
-
只要您的按钮之间没有任何死角,那么应该没有问题...也就是说...按钮之间没有任何空格(默认android 或 iphone 计算器上的键盘)。
标签: android