OnTouchEvent не работает при просмотре внутри SurfaceView Canvas - PullRequest
0 голосов
/ 06 ноября 2019

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

вид поверхности:

public class GameView extends SurfaceView implements Runnable {
    public void draw() {
      if (ourHolder.getSurface().isValid()) {            
        canvas = ourHolder.lockCanvas();
        //some code
        joystickOnScreen.layout(10, (int)(sh*0.8f), (int)(sh*0.2f), (int)(sh*1f));
        canvas.save();
        joystickOnScreen.draw(canvas);
        canvas.restore();
        //some code
        ourHolder.unlockCanvasAndPost(canvas);
      }
    }
}

вид джойстика:

public class Joystick extends View {
    public Joystick(Context context) {
        super(context);
        setFocusable(true);
        setClickable(true);
    }

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

1 Ответ

0 голосов
/ 07 ноября 2019

SurfaceViews не являются ViewGroups , поэтому он не ведет себя как обычный LinearLayout / RelativeLayout, который передает свои события своим дочерним элементам. Вместо этого вы рисуете его вручную, переопределяя onDraw, или вызываете метод рисования из какого-то внешнего цикла, правильно? Невозможно определить, как вы визуализируете свое представление поверхности, просто с помощью кода, которым вы поделились, но кажется, что вы вызываете этот метод draw () из некоторого вида действия / фрагмента контроллера, верно?

Что вам нужновнутри SurfaceView делать то, что обычно делает ViewGroup для вас: найти все дочерние элементы - по дочерним элементам. Я имею в виду представления, которые вы визуализируете внутри области SurfaceView - и вызвать их onTouchEvent. В вашем случае кажется, что вам нужно просто вызвать Joystick TouchEvent.

Вот пример кода:

public class GameView extends SurfaceView {

    //initialization and drawing stuff

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return joystickOnScreen.onTouchEvent(ev);
    }
}
...