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

2023-12-02

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

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

这一切都很好。

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

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 并且漂亮的黄色“你正在画一个手势”永远不会出现。


这是一个很大的痛苦,但我终于找到了解决方案。网上绝对没有关于此的良好文档。我终于通过使用称为“FrameLayout”的东西,然后在其中添加表面视图和手势视图来使其工作。完成此操作后,即可将 FrameLayout 设置为内容视图。

不幸的是,由于某种原因,RomanGuy 提供的上述解决方案似乎不起作用(或者可能,我只是无法让它起作用)。有no .addView()函数可用于 SurfaceView 类,就像常规视图一样。该函数存在于 ViewGroups 中,并且可以很好地在除表面视图之外的任何内容上添加手势(我认为)。

您的 Activity 必须实现 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();
            }
        }
    }    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 GestureOverlayView 添加到我的 SurfaceView 类,如何添加到视图层次结构? 的相关文章

随机推荐

  • 动态创建/绘制图像以放入 Android 视图中

    我不确定我是否以 正确 的方式这样做 所以我也对其他选择持开放态度 这就是我想要实现的目标 我想要一个包含图表的视图 该图表应该由应用程序本身动态创建 图表应该是可缩放的 并且一开始可能会比屏幕大 800x600 左右 我打算从简单的开始
  • 如何在java中读取Doc或Docx文件? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想用java读取word文件 import org apache poi poifs
  • 现代 JVM 实现中,instanceof 是如何实现的?

    由于在其他线程中完成的基准测试 参见https stackoverflow com a 397617 1408611 结果表明 Java 6 中的 instanceof 实际上相当快 这是如何实现的 我知道 对于单继承 最快的想法是进行一些
  • 在 PyQt5 中停止工作线程中的无限循环最简单的方法

    我打算有一个 GUI 其中一个 后来是三个 线程以可调间隔 例如 10 秒 从不同源读取实时数据 并在主窗口中绘制这些数据 我正在使用 PyQt5 和 python 3 6 读取是在工作线程中无限循环中执行的 如下所示 class Read
  • 在 Objective-C 中使用内联汇编对变量进行 ROL / ROR

    我想对 Objective C 程序中的变量执行 ROR 和 ROL 操作 然而 我无法做到这一点 我不是装配专家 这是我到目前为止所做的 uint8 t v1 uint8 t v2 v2 is either 1 2 3 4 or 5 as
  • 更改用户控件的动画

    我有一个简单的自定义窗口 下面的 XAML 首次加载时 它将向 grdContainer Children 集合添加一个用户控件 用户选择 操作将导致其他用户控件添加 删除到子集合中 一次加载一个 我试图做的是在加载新控件时提供一个简单的动
  • 在 Python 中检测两个数据数组的模式

    我正在尝试从中检测模式开盘 高位 低位 收盘 OHLC 数据 所以这就是我所做的 查找数据集上的局部最小值和最大值 通过将局部最小值和最大值数组转换为数字数组来标准化我的数据 其中每个数字都是与前一点的变化 到目前为止 一切正常 但我陷入了
  • 在抛出 OutOfMemoryException 之前调用 GC.Collect

    有什么方法可以在抛出 OutOfMemoryException 之前调用 GC Collect 吗 我想我正在寻找一种方法来执行以下代码流 Try to Allocate Memory On Pass Return Call GC Coll
  • Jenkins 中字符串参数的存储库 URL

    我正在构建一个脚本化的 Jenkins 管道 Jenkins 文件是从 git 存储库中获取的 我想参数化存储库 URL 我创建了一个字符串参数 我尝试访问 存储库 URL 字段中的字符串参数 但不起作用 我收到错误消息 指出该参数不是可识
  • Bing 拼写检查 API 仅适用于英语

    Trying 必应拼写检查 API 但它似乎无法在英语以外的语言中正常工作 拼写检查可用的语言 我尝试检查法语文本 但结果实际上会建议完美文本中的错误 反之亦然 意味着它也不会纠正文本中的错误 我试过检查这段文字 土地是一个内部固体 这就是
  • string.ToLower() 和 string.ToLowerInvariant()

    有什么区别以及何时使用什么 如果我总是使用会有什么风险ToLower 如果我总是使用会有什么风险ToLowerInvariant 根据当前的区域性 ToLower 可能会生成您不期望的特定于区域性的小写字母 比如生产 nfoi 上没有点而不
  • Flask WTForms 在 validate_on_submit() 上总是给出 false

    我使用 wtforms 创建了一个注册表单 我在其中使用 FormField 这样我就不必再次重复表单的某些元素 但每当我单击 提交 按钮时 它总是在 validate on submit 方法调用上给出 false 不明白为什么会发生这种
  • 如何处理与 Google 游戏服务的断开连接?

    我使用 Google 游戏服务作为排行榜 像这样显示它 static public void showLeaderboard String lid if isLogined 1 Log i TAG Showing leaderboard I
  • 使用 awk 或 sed 解析来自 ifconfig 的数据?

    我正在尝试使用 sed 解析 ifconfig 输出中的一些数据 但我无法正确执行此操作 我希望该命令只提取我想要的数字 例如 我有兴趣提取发送的字节 eth1 Link encap Ethernet HWaddr 00 00 00 09
  • CUDA 支持的 Windows 编译器

    我是一个正在尝试入门的 CUDA 程序员新手 我在 5 5 版本中遇到了这里提到的问题 Visual Studio 2010 Express 中 CUDA 5 5 出现 干净 错误 谁能确认这只是 5 5 版本的问题吗 是否有我可以安装的早
  • Firebase 推送通知添加操作按钮

    我正在服务器端发送推送通知 并且我正在使用这个 http 协议 https firebase google com docs cloud messaging http server ref 并且我想添加像这样的操作按钮https githu
  • 函数未定义

    我的 jquery 脚本出现函数未定义错误 我不知道为什么 jQuery 代码 http maps google com maps file api v 2 key ABQIAAAAhTrgZ5jvdqcEQouEpPcZ hS81NmJw
  • 如何通过CSS或javascript给句子赋予句首字母? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何通过CSS或javascript给句子赋予句首字母 我已经尝试过这些 CSS 属性
  • 为 jax rs 客户端设置超时

    我想为 jax rs 客户端设置连接超时 ClientConfig configuration new ClientConfig configuration property ClientProperties CONNECT TIMEOUT
  • 将 GestureOverlayView 添加到我的 SurfaceView 类,如何添加到视图层次结构?

    在后来的回答中我被告知 我必须将我在代码中创建的 GestureOverlayView 添加到我的视图层次结构中 但我并不 100 知道如何做到这一点 以下是为了完整性而提出的原始问题 我希望我的游戏能够识别手势 我有一个很好的 Surfa