onGesturePerformedListener с SurfaceView и анимационным потоком - PullRequest
2 голосов
/ 18 ноября 2011

Я работаю над детской игрой для Android, которая использует жесты и 2-мерную анимацию.У меня есть три класса в игре: основной вид деятельности, SurfaceView (для анимации) и поток для управления анимацией.Довольно упрощенный материал.У меня есть жесты, работающие так, как я хочу.И у меня сцена работает так, как я хочу.Проблема в том, что я хотел бы, чтобы сцена реагировала, когда пользователь выполняет жест.Итак, на сцене есть звезда.Я бы хотел, чтобы ребенок проследил за звездой (предварительно загруженной в качестве жеста), но когда он прослеживает ее, я хотел бы оживить звезду.Я поставил несколько журналов, чтобы увидеть, если поток запускается, но он не получает сообщения.Итак, в основном, я хочу, чтобы они работали в тандеме - я хочу, чтобы onGesturePerformedListener захватывал событие касания, и я хочу, чтобы SurfaceView захватывал одно и то же событие касания.Оба должны реагировать на это.Как я уже сказал, они блестяще работают независимо, но мне нужно, чтобы они работали одновременно.Чего мне не хватает?

Основная активность:

mGameView = (GameView)findViewById(R.id.gamearea);
mGameView.setStatusView((TextView)findViewById(R.id.text));
mGameView.setScoreView((TextView)findViewById(R.id.score));
mGestureView = (GestureOverlayView)findViewById(R.id.gestures);
mGestureView.addOnGesturePerformedListener(this);

Этот класс также содержит метод onGesturePerformed.

SurfaceView: (Это метод, который устанавливает поток.)

public void setThread(GameThread newThread) {

    thread = newThread;

    setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            if(thread!=null) {
                Log.d(TAG, "Touched the screen");
                return thread.onTouch(event);
            }
            else return false;
        }

    });

    setClickable(true);
    setFocusable(true);
}

Тема:

    //Finger touches the screen
public boolean onTouch(MotionEvent e) {
    if(e.getAction() != MotionEvent.ACTION_DOWN){
        Log.d(TAG, "onTouch Fired");
        return false;
    }
    if(e.getAction() == MotionEvent.ACTION_DOWN)
    {
        dotX = e.getX();
        dotY = e.getY();
        Log.d(TAG, "Updating Dot by touch.");
        return true;
    }

    if(mMode == STATE_READY || mMode == STATE_LOSE || mMode == STATE_WIN) {
        doStart();
        Log.d(TAG, "doStart Loaded");
        return true;
    }

    if(mMode == STATE_PAUSE) {
        Log.d(TAG, "mode is paused");
        unpause();
        return true;
    }

    synchronized (mSurfaceHolder) {
        Log.d(TAG, "synchronized");
            this.onTouch(e);
    }

    return false;
}

Моя рабочая теория заключается в том, что все зависит от расположения оверлейного представления - это то место, где у меня есть пробел в понимании.Файл main.xml, заданный для основного действия (см. Выше), выглядит следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<android.gesture.GestureOverlayView
        android:id="@+id/gestures"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1.0"/>

<com.trial.game.test.GameView
  android:id="@+id/gamearea"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"/>

<RelativeLayout
    android:id="@+id/gameLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
     <TextView
      android:id="@+id/score"
      android:text="@string/score_text"
      android:visibility="visible"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:gravity="top"
      android:textColor="#ff0000ff"
      android:textSize="24sp"
      android:layout_marginTop="3px"
      android:layout_centerHorizontal="true"/>
    <TextView
      android:id="@+id/text"
      android:text="@string/mode_ready"
      android:visibility="visible"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerInParent="true"
      android:gravity="center_horizontal"
      android:textColor="#ff0000ff"
      android:textSize="20sp"/>

     </RelativeLayout>

В зависимости от расположения наложения жестов или вида игры илидругой выстрелит, но не оба одновременно.То, что я упускаю из виду или недопонимание здесь.Кто-нибудь?

...