我正在开发一款儿童Android游戏,它使用手势和2D动画。我在游戏中有三个类:主要活动,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是Main活动设置的(如上所示),如下所示:
<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>
根据手势覆盖或游戏视图的位置,一个或另一个将触发,但不能同时触发。我在这里忽视或误解的是什么。任何人吗?