java - 使用 Vuforia 的 Java API 未检测到目标时隐藏 UI 元素

标签 java android opengl-es-2.0 vuforia

我正在使用 Vuforia 的 Java API 开发 Android。我想在检测到标记时显示一个按钮,并在未检测到标记时隐藏它,就像茶壶一样。当检测到任何目标( fragment 和石头)时,我可以成功显示按钮。感谢 Vuforia 提供的教程(“triggering-ui-events-when-target-Detected”)。

但是,既然我可以在检测到目标后显示隐藏按钮,那么当目标不再可用时,它就不会隐藏。我假设我可能需要像 doLoadTrackersData() 和 doUnloadTrackersData() 方法一样获取 TrackerManager 实例,并查找 mCurrentDataset 是否处于 Activity 状态。然而到目前为止,我对这个问题还没有完全理解。请帮助...。我的 onResume() 代码如下:

@Override
    protected void onResume() {
        Log.d(LOGTAG, "onResume");
        super.onResume();
        displayMessageHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

                TrackerManager tManager = TrackerManager.getInstance();
                ImageTracker imageTracker = (ImageTracker) tManager
                        .getTracker(ImageTracker.getClassType());

                String text = (String) msg.obj;

                Toast.makeText(getApplicationContext(), text,
                        Toast.LENGTH_SHORT).show();


                    if (text.equalsIgnoreCase("stones")) {
                        Log.e("Is it Stones", text);
                        b3.setBackgroundResource(R.drawable.up);
                        b3.startAnimation(shake);
                        b3.setVisibility(View.VISIBLE);
                    } else if (text.equalsIgnoreCase("chips")) {
                        Log.e("Is it chips", text);
                        b3.setBackgroundResource(R.drawable.up);
                        b3.startAnimation(shake);
                        b3.setVisibility(View.VISIBLE);

                    } else {
                        Log.e("ELSE", text);
                        b3.setVisibility(View.GONE);
                    }
                }

        };

        // This is needed for some Droid devices to force portrait
        if (mIsDroidDevice) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }

        try {
            vuforiaAppSession.resumeAR();
        } catch (SampleApplicationException e) {
            Log.e(LOGTAG, e.getString());
        }

        // Resume the GL view:
        if (mGlView != null) {
            mGlView.setVisibility(View.VISIBLE);
            mGlView.onResume();
        }

    }

最佳答案

OLRITE...我设法解决了这个问题。让我分享解决方案,以便对其他人有所帮助。

一般来说,您可以通过检查状态来了解/跟踪当前正在跟踪(或未跟踪)的任何目标。所以在ImageTargetRenderer.java的renderFrame()中。

for (int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++) {
            TrackableResult result = state.getTrackableResult(tIdx);
            Trackable trackable = result.getTrackable();

因此,如果一个 Trackable 列在状态中(state.getTrackable(index) 和 state.getNumTrackableResults() ),你就会知道它当前被 Vuforia 跟踪,如果它没有列在那里,你就会知道可追踪设备已丢失(不可用);

因此,在上面定义的 for 循环之前添加以下代码 -

if (state.getNumTrackableResults() == 0) {

displayMessage("None");

lastTrackableId = -1;

}

然后,displayMessage 方法将完成其余的工作。在 ImageTargets.java 中,我们可以使用收到的值隐藏 UI View (在我的例子中为按钮/b3.setVisibility(View.GONE);)。

这就是我的 onResume 的样子:

@Override
    protected void onResume() {
        Log.d(LOGTAG, "onResume");
        super.onResume();
        displayMessageHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

                String text = (String) msg.obj;

                if (text.equalsIgnoreCase("stones")) {
                    Log.e("Is it Stones", text);
                    b3.setBackgroundResource(R.drawable.up);
                    b3.startAnimation(shake);
                    b3.setVisibility(View.VISIBLE);
                } else if (text.equalsIgnoreCase("chips")) {
                    Log.e("Is it chips", text);
                    b3.setBackgroundResource(R.drawable.up);
                    b3.startAnimation(shake);
                    b3.setVisibility(View.VISIBLE);
                } else {
                    b3.setVisibility(View.GONE);
                }
            }

        };

这对我有用......

关于java - 使用 Vuforia 的 Java API 未检测到目标时隐藏 UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27598734/

相关文章:

java - 如何为 Android Studio 制作一个简单的插件来自定义鼠标悬停提示

java - 如何为多个级别创建 Hibernate Criteria

android - 无法将 math.h 放入命名空间

java - 当人们停止使用您的小部件时如何释放相机?

android - 是否有任何 Android 处理程序可以知道平板电脑或手机是否已断开电流?

java - 无法使用 JSoup 获取页面的完整内容

Java - 扩展似乎正在调用其他类的构造函数

android - 在 ARCore anchor Android openGL ES 2.0 上放置 2D Bitmap

webgl - 布局(位置= n)输出可以跳过WebGL中drawBuffers的索引吗?

ios - OpenGL ES 2.0 视口(viewport)