onTouch()事件仅返回第一个触摸的子视图

时间:2018-04-10 21:14:17

标签: android

GridLayout为父级,5x5 = 25 TextViews动态创建为GridLayout的孩子。

我想这样做:当我触摸并移动孩子当前触摸的孩子来改变文本。我尝试在每个setOnTouchListener上实施TextView,但每次调用onTouch,但onTouch返回的视图始终是第一个被触摸的子视图。

for (int row = 0; row < 25; row++) {

  for (int col = 0; col < 25; col++) {
      final TextView textView= new TextView(this);

      textView.setText(Integer.toString(col));

      textView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View view, MotionEvent motionEvent) {

                        if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {
                            changeViewText(view);
                            return true;
                        }
                    }
                });

      gridLayout.addView(pixelView);

  }
}

有人可以告诉我我做错了吗?

2 个答案:

答案 0 :(得分:1)

侦听器在第一次创建时保留“textView”变量的引用。

changeViewText(textView);更改为changeViewText((TextView) view);,以便每个侦听器都会影响其附加的TextView。

答案 1 :(得分:0)

这就是调度触摸事件的方式,因为你第一次触摸第一个视图时,它已经请求消耗所有其他事件,当将手指拖出视图时,你仍然会收到带有X的事件,Y不在你的首先在第一个View侦听器中查看。

唯一的解决方案是在GridLayout上覆盖dispatchTouchEvent。

例如:

public class MyGridLayout extends GridLayout {
@Override
public boolean dispatchTouchEvent(MotionEvent e) {
    for(View v : getChildren())
        if (BoundsUtils.getBounds(v).contains(e.getX(), e.getY()))
            v.onTouchEvent(MotionEvent.obtain(e));
}

RectF getBounds(View v) { return new RectF(e.getLeft(), e.getTop(), e.getRight(), e.getBottom()); }
}