带有SurfaceView和动画线程的onGesturePerformedListener

时间:2011-11-18 16:15:09

标签: android views surfaceview gestures

我正在开发一款儿童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>

根据手势覆盖或游戏视图的位置,一个或另一个将触发,但不能同时触发。我在这里忽视或误解的是什么。任何人吗?

0 个答案:

没有答案