虽然过去曾经问过类似的questions,但他们似乎并没有真正得到回答,这可能是由于对所提问题的混淆所致。
简单地说,当手指滑过屏幕时,我想检测输入的是哪个视图。最好的例子是任何Android手机上的软键盘。当你按任意键时,它会显示为一个弹出窗口,告诉你手指下面有什么字母。如果您现在用一个手势在键盘上移动手指,当您在字母表的各个字母上移动时,会弹出各种字母。
这种行为使用了哪些侦听器。我已经尝试过OnTouchListeners,但它们似乎只有当你“触摸”按钮而不是“手指过去”它们时
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {doStuff();}
});
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
doStuff();
return false;
}
});
OnFocusChangeListener
也没有帮助。
答案 0 :(得分:5)
使用以下内容覆盖onTouch方法:
public boolean onTouch(View v, MotionEvent event)
{
LinearLayout layout = (LinearLayout)v;
for(int i =0; i< layout.getChildCount(); i++)
{
View view = layout.getChildAt(i);
Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
if(outRect.contains((int)event.getX(), (int)event.getY()))
{
// over a View
}
}
}
答案 1 :(得分:3)
修改强>
我看到了键盘。我猜,它只是一个视图,每个字母的坐标都是已知的。因此,您可以轻松计算用户滑过的字母现在回答:
我不确定,但可能这段代码可以帮助你。
这是遥远的,我为我写的。但是这个想法正在追随。
如果我没记错,视图没有gesturedetector,但你可以将视图的touchlistener与你活动的geturelistener结合起来。
一旦你触摸了你的观点,就有了
private GestureDetector mGestureDetector;
// x and y coordinates within our view
private static float sideIndexX;
private static float sideIndexY;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
...
mGestureDetector = new GestureDetector(this, new SideIndexGestureListener());
}
class MyGestureListener extends
GestureDetector.SimpleOnGestureListener
{
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY)
{
// we know already coordinates of first touch
// we know as well a scroll distance
sideIndexX = sideIndexX - distanceX;
sideIndexY = sideIndexY - distanceY;
// when the user scrolls within our side index
// we can show for every position in it a proper
// item in the country list
if (sideIndexX >= 0 && sideIndexY >= 0)
{
doStuff();
}
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
button.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
// now you know coordinates of touch
// store them
sideIndexX = event.getX();
sideIndexY = event.getY();
doStuff();
return false;
}
});
答案 2 :(得分:0)
您可以尝试GestureDetector。
答案 3 :(得分:0)
http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html 它适合多点触控,但这是了解Android触控/手势的良好开端,下一站,api docs / samples
答案 4 :(得分:0)
简单的答案是你不能 - 在处于辅助功能模式时不喜欢iPhone。
直到冰淇淋三明治。它现在具有类似iPhone的功能,能够识别手指下的元素而无需抬起它。
答案 5 :(得分:0)
手动处理这个问题非常简单。
将您的父布局用作onTouchListener
(在以下示例中,我extend
和RelativeLayout
),您可以检查MotionEvent
与子{之间的冲突{1}}使用简单的坐标比较逻辑:
View
对/** Returns the View colliding with the TouchEvent. */
private final View getCollisionWith(final MotionEvent pMotionEvent) {
// Declare the LocationBuffer.
final int[] lLocationBuffer = new int[2];
// Iterate the children.
for(int i = 0; i < this.getChildCount(); i++) { /** TODO: Order. */
// Fetch the child View.
final View lView = this.getChildAt(i);
// Fetch the View's location.
lView.getLocationOnScreen(lLocationBuffer);
// Is the View colliding?
if(pMotionEvent.getRawX() > lLocationBuffer[0] && pMotionEvent.getRawX() < lLocationBuffer[0] + lView.getWidth() && pMotionEvent.getRawY() > lLocationBuffer[1] && pMotionEvent.getRawY() < lLocationBuffer[1] + lView.getHeight()) {
// Return the colliding View.
return lView;
}
}
// We couldn't find a colliding View.
return null;
}
的调用将返回可能被任意操纵的getCollisionWith
个引用。