Определите, какой вид в данный момент находится в режиме Touched, когда пользователь перемещает палец

У меня есть сетка из 66 просмотров, и если вид коснулся или перетащил/переместился, я бы хотел изменить его цвет фона.

Я предполагаю, что мне нужно приложить прослушиватель касаний к родительской ViewGroup, но как определить, какой дочерний просмотр перетаскивается/перемещается?

Ответ 1

Нашел мой ответ здесь:

Android: получить представление только о том, какой контакт был выпущен

Похоже, вам нужно перебирать дочерние представления и вручную удалять обнаружение, чтобы узнать, какой вид на данный момент недоступен.

Сделал это, переопределив dispatchTouchEvent на родительском LinearLayout:

LinearLayout parent = new LinearLayout(this.getActivity()){
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        int x = Math.round(ev.getX());
        int y = Math.round(ev.getY());
        for (int i=0; i<getChildCount(); i++){
            LinearLayout child = (LinearLayout)row.getChildAt(i);
            if(x > child.getLeft() && x < child.getRight() && y > child.getTop() && y < child.getBottom()){
                //touch is within this child
                if(ev.getAction() == MotionEvent.ACTION_UP){
                    //touch has ended
                }
            }
        }
        return true;
    }
}

Ответ 2

Не тестировалось, но я бы подумал, что вы можете сделать что-то похожее на: ScrollView Inside ScrollView

parentView.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {
                    Log.v(TAG,"PARENT TOUCH");
                    findViewById(R.id.child).getParent().requestDisallowInterceptTouchEvent(false);
                    return false;
                }
            });
            childView.setOnTouchListener(new View.OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event)
                {
                    Log.v(TAG,"CHILD TOUCH");
                     //  Disallow the touch request for parent on touch of child view
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    return false;
                }
            });

Возможно, просто перейдя через все ваши дочерние элементы, установив OnTouchListener.