Можно ли передать onTouchEvent нескольким представлениям в Android?

Я прочитал несколько вопросов по этой теме на SO, но на самом деле не нашел на него твердого ответа.

У меня есть макет фрейма, на который я складываю несколько пользовательских представлений, однако событие onTouch работает только с видом сверху. (все настраиваемые представления - это одно и то же представление с одним и тем же событием onTouch, только несколько из них)

FrameLayout

  • customView [2] <--- это последнее добавленное представление и единственное, которое получает событие
  • customView [1]
  • customView [0]

Я тестирую его на Android 2.2, и мне интересно, есть ли способ для других представлений ниже узнать, где произошло касание?


РЕДАКТИРОВАТЬ (Добавление кода)

Я добавляю код, чтобы, надеюсь, помочь объяснить, где я сталкиваются с проблемами. Сначала у меня просто автоматически onTouchEvent возвращалось значение true. Это сделало так, что последнее представление (в моем случае customerView [2] ) было единственным, генерирующим значение.

Однако, как только я добавил метод для установки onTouchEvent , чтобы он возвращал истину или ложь, теперь единственным представлением, возвращающим сгенерированное значение, является customView [0] .

Надеюсь, это проясняет то, о чем я спрашиваю. Я новичок в этом, и я ценю, что вы нашли время, чтобы объяснить это (и, конечно, я ценю ваше терпение).

Кроме того, я понимаю, что мой TextView не обновляет значение для каждого touchEvent, я работаю над исправлением этого.

Мои действия:

public class MyActivity extend Activity {

    CustomView[] customView;
    TextView[] textView;
    int numViews 3;
    //FrameLayout and Params created

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        for(int i = 0; i < numViews; i++) {
            customView[i] = new CustomView(this, i);


            //Allows the onTouch to be handled by all Views - View[0] is the bottom view
            if(i == 0) {
                customView[i].setTouchBool(true);        //set view's onTouch to return true
            } else {
                customView[i].setTouchBool(false);       //set view's onTouch to return false
            }

            //Set TextView to display the number generated by the CustomView
            textView[i].setText(Double.toString(customView[i].getGeneratedNumber()));

            //Add views to main layout
            frame.addView(textView[i]);
            frame.addView(customView[i]);
        }
    }
}

Мое мнение:

public class CustomView extends View {

    boolean onTouchHandler = true;
    int xVal = 0, yVal = 0;
    int index;
    double generatedNum = 0;

    public CustomView(Context context) {
        this(context, 0);
        this.index = 0;
    }

    public CustomView(Context context, int index) {
        super(context);
        this.index = index;
    }


    @Override 
    public boolean onTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();

        switch(action) {
            case MotionEvent.ACTION_DOWN: {
                //do logic 
            }

            case MotionEvent.ACTION_MOVE: {
                //do logic
            }

            case MotionEvent.ACTION_UP: {
                xVal = (int) ev.getX();
                yVal = (int) ev.getY();

                generateNumber(xVal, yVal, index);

                break; 
            }
        }
         return onTouchHandler;    
    }  


    private void generateNumber(int x, int y, int index) {
        if(index == 0) {
            generatedNum = (x / 2) * (y / 2) + 64;
        } else {
            generatedNum = (x / 2) * (y / 2) + (index * 128);
        }
    }

    public double getGeneratedNumber() {
        return generatedNum;
    }

    public boolean setTouchBool(boolean b) {
        this.onTouchHandler = b;
    }
}
5
задан StartingGroovy 22 November 2011 в 22:49
поделиться