首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向我的SurfaceView类添加GestureOverlayView,如何添加到视图层次结构?

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

Stack Overflow用户
提问于 2010-07-31 07:01:53
回答 4查看 6.4K关注 0票数 4

我在后来的回答中被告知,我必须将我在代码中创建的GestureOverlayView添加到我的视图层次结构中,而我并不是百分之百地做到这一点。下面是关于完整性的原始问题。

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

这一切都很好用。

我试图将GestureOverlayView添加到其中,但它就是不起作用。终于破解到了不会崩溃的地方,但这就是我所拥有的

代码语言:javascript
复制
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,我没有使用它,我的活动很简单:

代码语言:javascript
复制
   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    Panel p = new Panel(this);
    setContentView(p);
}

所以我在这里丢失了一点信息,它没有调用onGesturePerformed,漂亮的黄色“你正在绘制一个手势”永远不会出现。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-22 04:51:40

这是一个主要的痛苦,但我最终找到了解决方案。在线上绝对没有关于这一点的好文档。我使用了一个叫做"FrameLayout“的东西,然后在那里添加了表面视图和手势视图,最终让它正常工作了。完成此操作后,将FrameLayout设置为您的内容视图。

不幸的是,由于某些原因,RomanGuy提供的上述解决方案似乎不起作用(或者可能是我就是不能让它起作用)。与常规视图一样,SurfaceView类也有no .addView()函数可用。这个函数是为ViewGroups提供的,我认为它可以很好地在除了表面视图之外的任何东西上添加手势。

您的活动必须实现OnGesturePerformedListener接口才能正常工作。

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

代码语言:javascript
复制
   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();
            }
        }
    }    
}
票数 7
EN

Stack Overflow用户

发布于 2010-07-31 07:49:03

您创建了手势覆盖,但从未将其添加到视图层次结构中。如果它不存在,它将无法工作:)

票数 2
EN

Stack Overflow用户

发布于 2011-05-10 20:29:42

您只需将视图添加到gestureOverlayView即可

代码语言:javascript
复制
gestureOverlayView.addView(new yourview (this) , 600, 800);

然后

代码语言:javascript
复制
this.setContentView(gestureOverlayView);

gestureOverlayView已经是一个框架布局

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3375967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档