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