代码之家  ›  专栏  ›  技术社区  ›  Codejoy

向我的SurfaceView类添加GestureOverlayView,如何添加到视图层次结构?

  •  3
  • Codejoy  · 技术社区  · 14 年前

    后来的一个回答告诉我,我必须将我在代码中创建的gestureOverlay视图添加到我的视图层次结构中,而我并不是100%如何做到这一点。以下是完整性的原始问题。

    我希望我的游戏能够识别手势。我有一个很好的SurfaceView类,我做了一个OnDraw来绘制我的精灵,我有一个线程运行它来调用OnDraw等。

    这一切都很好。

    我正在尝试将GestureOverlay视图添加到此视图中,但它不起作用。最后被入侵到它不会崩溃的地方,但这就是我所拥有的

    public class Panel extends SurfaceView implements SurfaceHolder.Callback,         OnGesturePerformedListener  
    { 
    public Panel(Context context)
    {
        theContext=context;
        mLibrary = GestureLibraries.fromRawResource(context, R.raw.myspells);
        GestureOverlayView gestures = new GestureOverlayView(theContext);       
        gestures.setOrientation(gestures.ORIENTATION_VERTICAL);
        gestures.setEventsInterceptionEnabled(true);
        gestures.setGestureStrokeType(gestures.GESTURE_STROKE_TYPE_MULTIPLE);
    
        gestures.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));
    
        //GestureOverlayView gestures = (GestureOverlayView) findViewById(R.id.gestures);
        gestures.addOnGesturePerformedListener(this);
     }
     ...
     ...
     onDraw...
    surfaceCreated(..);
    ...
    ...
    
    
    public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
      ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
    
      // We want at least one prediction
      if (predictions.size() > 0) {
       Prediction prediction = predictions.get(0);
       // We want at least some confidence in the result
       if (prediction.score > 1.0) {
        // Show the spell    
         Toast.makeText(theContext, prediction.name, Toast.LENGTH_SHORT).show();
       }
      }
     }
    
    
    }
    

    从未调用Ongestureperformed。他们的示例在XML中有gestureoverlay,我没有使用它,我的活动很简单:

       @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        Panel p = new Panel(this);
        setContentView(p);
    }
    

    所以我有点失去了这里丢失的信息,它不称为Ongestureperformed和漂亮的黄色“你在画一个手势”永远不会出现。

    4 回复  |  直到 12 年前
        1
  •  6
  •   Andro Selva Anand Wadhwani    12 年前

    这是一个巨大的痛苦,但我终于找到了解决办法。在网上的任何地方都没有关于这个的好文档。最后,我使用了一个叫做“框架布局”的东西,然后添加了SurfaceView和手势视图。完成后,将框架布局设置为内容视图。

    不幸的是,罗曼盖伊提供的上述解决方案由于某种原因似乎不起作用(或者可能,我就是无法让它起作用)。有 no .addView() 函数可用于SurfaceView类,就像常规视图一样。这个函数存在于视图组中,可以很好地在我认为不是SurfaceView的任何对象上添加手势。

    您的活动必须实现ongesturePerformedListener接口才能使其工作。

    您可以在我的网站上看到完整的教程和源代码: http://scanplaygames.com/?p=193

       package view.stack;
    
    import game.core.GameView;
    
    import java.util.ArrayList;
    import android.app.Activity;
    import android.gesture.Gesture;
    import android.gesture.GestureLibraries;
    import android.gesture.GestureLibrary;
    import android.gesture.GestureOverlayView;
    import android.gesture.Prediction;
    import android.gesture.GestureOverlayView.OnGesturePerformedListener;
    import android.os.Bundle;
    import android.view.SurfaceView;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.widget.FrameLayout;
    import android.widget.Toast;
    
    public class GestureActivity extends Activity implements OnGesturePerformedListener 
    {
        protected GameView surfaceView;
        protected GestureOverlayView gestureOverlayView;
        protected GestureLibrary mLibrary;
        protected FrameLayout frameLayout;
    
        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
    
            gestureOverlayView = new GestureOverlayView(this); 
            surfaceView        = new GameView(this);            
            frameLayout        = new FrameLayout(this);
    
            //gestureOverlayView.addView(surfaceView);    
            gestureOverlayView.setOrientation(gestureOverlayView.ORIENTATION_VERTICAL);
            gestureOverlayView.setEventsInterceptionEnabled(true);
            gestureOverlayView.setGestureStrokeType(gestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);
    
            mLibrary = GestureLibraries.fromRawResource(this, R.raw.gestures);
            gestureOverlayView.addOnGesturePerformedListener(this);
    
            frameLayout.addView(surfaceView, 0);
            frameLayout.addView(gestureOverlayView,1);
    
            setContentView(frameLayout);
        }
    
        @Override
        public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) 
        {
            // TODO Auto-generated method stub
            ArrayList<Prediction> predictions = mLibrary.recognize(gesture);
    
            // one prediction needed
            if (predictions.size() > 0)
            {
                Prediction prediction = predictions.get(0);
    
                // checking prediction
                if (prediction.score > 1.0) 
                {
                    // and action
                    Toast.makeText(GestureActivity.this, prediction.name,
                            Toast.LENGTH_SHORT).show();
                }
            }
        }    
    }
    
        2
  •  2
  •   Romain Guy    14 年前

    创建笔势覆盖,但从不将其添加到视图层次。如果它不存在,它将不起作用。)

        3
  •  1
  •   Tim Cooper    13 年前

    您只需将视图添加到 gestureOverlayView :

    gestureOverlayView.addView(new yourview (this) , 600, 800);
    

    然后

    this.setContentView(gestureOverlayView);
    

    格式覆盖视图 已经是框架布局

        4
  •  0
  •   aemon    12 年前

    这是这个问题的有效答案,

    请参见示例源代码。

    http://scanplaygames.com/?p=168