# TouchPad操控

## 介绍

X3pro 智能眼镜上 的 TouchPad 操控，为用户带来直观且便捷的交互体验。智能眼镜的TouchPad支持上滑、下滑、单击、双击和三击等多种操作方式。上滑和下滑可用于快速切换菜单、浏览信息流或调整音量等；单击可实现确认指令、激活功能或接听电话等操作；双击可快速切换模式,或者用于返回，如退出应用或切换显示界面；三击则可用于执行复杂任务，例如快速切换设备连接状态或激活特殊功能。开发者可以基于这些基础操作，进一步开发个性化功能，满足不同用户需求，提升智能眼镜的实用性和交互性。<br>

## API介绍

<table data-header-hidden><thead><tr><th width="115"></th><th width="193"></th><th></th></tr></thead><tbody><tr><td>调用方法</td><td>使用说明</td><td>示例代码</td></tr><tr><td>单击SimpleTouchForLite.Instance.OnSimpleTap<br></td><td><strong>参数与返回值细节：</strong>单击回调事件，回调函数没有参数和返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除。</strong><br></td><td><pre class="language-c#"><code class="lang-c#">1）添加单击事件
SimpleTouchForLite.Instance.OnSimpleTap.AddListener(OnSimpleTapCall); 
2）移除单击事件
SimpleTouchForLite.Instance.OnSimpleTap.RemoveListener(OnSimpleTapCall);

// 事件函数示例
private void OnSimpleTap()
{
if (m\_curInteractionInfo == null)
{
return;
}

```
m_curInteractionInfo.OnBtnClick();
```

} </code></pre><p><br></p></td></tr><tr><td>双击SimpleTouchForLite.Instance.OnDoubleTap</td><td><strong>参数与返回值细节：</strong>双击回调事件，回调函数没有参数和返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。<br></td><td><pre class="language-c#"><code class="lang-c#">1）添加双击事件
SimpleTouchForLite.Instance.OnDoubleTap.AddListener(OnDoubleTapCall);
2）移除双击事件
SimpleTouchForLite.Instance.OnDoubleTap.RemoveListener(OnDoubleTapCall);

// 事件函数示例
public void OnDoubleTapCall()
{
CloseLevel2();
} </code></pre></td></tr><tr><td>三击SimpleTouchForLite.Instance.OnTripleTap<br></td><td><strong>参数与返回值细节：</strong>三击回调事件，回调函数没有参数和返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。</td><td><pre class="language-c#"><code class="lang-c#">1）添加三击事件
SimpleTouchForLite.Instance.OnTripleTap.AddListener(OnTripleTapCall);
2）移除三击事件
SimpleTouchForLite.Instance.OnTripleTap.RemoveListener(OnTripleTapCall);

// 事件函数示例
private void OnTripleTapButtonImageRandomColor()
{
OnTripleTapButtonImage.color = new Color(Random.Range(0,1.0f), Random.Range(0, 1.0f), Random.Range(0, 1.0f));
} </code></pre></td></tr><tr><td>长按SimpleTouchForLite.Instance.OnLongPress</td><td><strong>参数与返回值细节：</strong>长按回调事件，回调函数没有参数和返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。</td><td><pre class="language-c#"><code class="lang-c#">1）添加长按事件
SimpleTouchForLite.Instance.OnLongPress.AddListener(OnLongPressCall);
2）移除长按事件
SimpleTouchForLite.Instance.OnLongPress.RemoveListener(OnLongPressCall);

// 事件函数示例
private void OnLongPress()
{
OnLongPressButton.image.color = new Color(Random.Range(0, 1.0f), Random.Range(0, 1.0f), Random.Range(0, 1.0f));
} </code></pre></td></tr><tr><td>上滑SimpleTouchForLite.Instance.OnSwipeUp</td><td><strong>参数与返回值细节：</strong>上滑回调事件，回调函数参数是滑动的位置Vector2 ，没有返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。</td><td><pre class="language-c#"><code class="lang-c#">1）添加上滑事件
SimpleTouchForLite.Instance.OnSwipeUp.AddListener(OnSwipeUp);
2）移除下滑事件
SimpleTouchForLite.Instance.OnSwipeUp.RemoveListener(OnSwipeUp);

// 事件函数示例
private void OnSwipeUp(Vector2 pos)
{
UpButton.image.color = Color.green;
DownButton.image.color = Color.white;
} </code></pre></td></tr><tr><td>下滑SimpleTouchForLite.Instance.OnSwipeDown</td><td><strong>参数与返回值细节：</strong>下滑回调事件，回调函数参数是滑动的位置Vector2 ，没有返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。</td><td><pre class="language-c#"><code class="lang-c#">1）添加下滑事件
SimpleTouchForLite.Instance.OnSwipeDown.AddListener(OnSwipeDown);
2）移除下滑事件
SimpleTouchForLite.Instance.OnSwipeDown.RemoveListener(OnSwipeDown);

// 事件函数示例
private void OnSwipeDown(Vector2 pos)
{
UpButton.image.color = Color.white;
DownButton.image.color = Color.green;
} </code></pre></td></tr><tr><td>左滑SimpleTouchForLite.Instance.OnSwipeLeft</td><td><strong>参数与返回值细节：</strong>左滑回调事件，回调函数参数是滑动的位置Vector2 ，没有返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。</td><td><pre class="language-c#"><code class="lang-c#">1）添加左滑事件
SimpleTouchForLite.Instance.OnSwipeLeft.AddListener(OnSwipeLeft);
2）移除左滑事件
SimpleTouchForLite.Instance.OnSwipeLeft.RemoveListener(OnSwipeLeft);

// 事件函数示例
private void OnSwipeLeft(Vector2 pos)
{
RightButton.image.color = Color.white;
LeftButton.image.color = Color.green;
} </code></pre></td></tr><tr><td>右滑SimpleTouchForLite.Instance.OnSwipeRight</td><td><strong>参数与返回值细节：</strong>右滑回调事件，回调函数参数是滑动的位置Vector2 ，没有返回<br><strong>异常场景说明：若没有回调函数，可以添加日志打印，并保证正确的回调函数的添加和移除</strong><br><strong>调用时机建议：回调函数注意需要前及时添加回调，不需要的时候机及时移除</strong>。</td><td><pre class="language-c#"><code class="lang-c#">1）添加右滑事件
SimpleTouchForLite.Instance.OnSwipeRight.AddListener(OnSwipeRight);
2）移除右滑事件
SimpleTouchForLite.Instance.OnSwipeRight.RemoveListener(OnSwipeRight);

// 事件函数示例
private void OnSwipeRight(Vector2 pos)
{
RightButton.image.color = Color.green;
LeftButton.image.color = Color.white;
} </code></pre></td></tr></tbody></table>

<br>

## 构建场景

搭建好基础环境，并且根据需要导入 Sample 功能能力 Demo 。

![](/files/ieemLTJl7A1gYZQqzLXK)<br>

### 1. 新建场景

新建 Unity3D 工程，取名 TouchPad<br>

### 2. 替换 MainCamera 为 XR Plugin

打开场景，删除默认的MainCamera

<figure><img src="/files/9pMlJuISZl83nLjC5uMz" alt=""><figcaption></figcaption></figure>

在 packages 目录下找到 RayNeo OPenXR ARDK - SDK - Runtime - Resources - Prefab 文件夹下 的 XR Plugin 预制体

<figure><img src="/files/vu2F3zRVQrXQYHLL8GGn" alt=""><figcaption></figcaption></figure>

把 XR Plugin 预制体 拖到场景中

<figure><img src="/files/gZpSHFZnVMZgHNMPwgPq" alt=""><figcaption></figcaption></figure>

### 3. 在场景中添加资源

鼠标右键，在场景中添加一个 Canvas

<figure><img src="/files/JJ67vv518S2hF7xfCI5x" alt=""><figcaption></figcaption></figure>

替换 Canvas 上的 GraphicRaycaster 为 XRGraphicRaycaster，移除 Canvas 上的 GraphicRaycaster

<figure><img src="/files/p5uN6ScHsyFGC9j8MdUJ" alt=""><figcaption></figcaption></figure>

在 Canvas 上，添加 XRGraphicRaycaster

<figure><img src="/files/8KNgyRV831FGwTeq3iZ9" alt=""><figcaption></figcaption></figure>

在 Canvas 下添加 Text ,作为标题显示

<figure><img src="/files/8T3Hf7iDy5EaxeAp9i0w" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/pUyJROxtS8P9DPhXkII6" alt=""><figcaption></figcaption></figure>

在 Canvas 添加一个 GameObject 命名为 level1Btns，挂载 GridLayoutGroup

<figure><img src="/files/cwEI9XUckQAcu9Kshgty" alt=""><figcaption></figcaption></figure>

在 level1Btns 下添加 Button 组件，如下图

<figure><img src="/files/gLov5o1rY9klIOlYTgXe" alt=""><figcaption></figcaption></figure>

在 level1Btns 列表中的 Button 下添加 selectedImg，作为选中后的展示

<figure><img src="/files/5FocesCYQzu9v0VtStw8" alt=""><figcaption></figcaption></figure>

其中 selectedImg 的设置如下，

<figure><img src="/files/eKfpInODfsXQ3acyOoib" alt=""><figcaption></figcaption></figure>

selectedImg 下的 border 图片位置如下图

<figure><img src="/files/PX9owc3mLY9p580hSSZR" alt=""><figcaption></figcaption></figure>

回到 selectedImg 的父物体 Button , 添加脚本 LatticeButton，并对应赋值

<figure><img src="/files/8p4p9dulVPDuephPVRZG" alt=""><figcaption></figcaption></figure>

同理实现 level2，结构如下

<figure><img src="/files/ZZ37L87NAuBNYFmWQgnK" alt=""><figcaption></figcaption></figure>

其中 level2 为Image ，设置如图

<figure><img src="/files/ujRFFIPc472TtolIdgFK" alt=""><figcaption></figcaption></figure>

level2Btns 与之前的 level1Btns 类似，添加一个 GridLayoutGroup ，设置如下

<figure><img src="/files/DDjvLPYg7IXFEYiXNfNb" alt=""><figcaption></figcaption></figure>

level2Btns 下 各个 Button 的配置也和之前 level1Btns 下的 Button 类似，添加 LatticeButton 然后对应赋值

<figure><img src="/files/11CFv9Cqg5dRVzOmLvWo" alt=""><figcaption></figcaption></figure>

level2Btns 下 各个 Button 的 selectedImg 这里不再赘述，设置如图

<figure><img src="/files/6y8crnaFDsJhgJvxXjw5" alt=""><figcaption></figcaption></figure>

最后添加一个 三击的按钮组件，作为 TouchPad 三级后 的变色响应

<figure><img src="/files/N4wxWB9KhaUU36JxVQf6" alt=""><figcaption></figcaption></figure>

OnTripleTapButton 就是一个 按钮组件，就是 Text 文本名字修改了

<figure><img src="/files/Pfh1ijjB2OfWNN8tQo1p" alt=""><figcaption></figcaption></figure>

### 4. 添加 Scene1Ctrl ，实现控制场景变化对应的 TouchPad 操控

在 Canvas 上添加 Scene1Ctrl 脚本

<figure><img src="/files/jOrL3Jy3OvyT1nYGJHAE" alt=""><figcaption></figcaption></figure>

把 Canvas 下对应的元素赋值到 Scene1Ctrl 脚本中

<figure><img src="/files/VhZjIdx8sp3NVd4cprxd" alt=""><figcaption></figcaption></figure>

<br>

### 5. 在场景中添加 LatticeBrain ，绑定对应的 TouchPad 操控事件

在场景中添加一个 GameObject ，修改名称为 LatticeBrain

<figure><img src="/files/VRQC5gduzL37w5pWN2p3" alt=""><figcaption></figcaption></figure>

在场景中的 LatticeBrain 添加对应的 LatticeBrain 脚本（其中 MovingThreshold 可以调整的移动的阈值，控制滑动交互的响应距离）

<figure><img src="/files/4VxUXL6RF74O3dTyaidM" alt=""><figcaption></figcaption></figure>

### 6. 添加双击 TP 操控板退出应用功能

在 Scripts 文件夹（没有自行创建即可）下，创建一个 QuitApp 脚本

<figure><img src="/files/qCoxAzGm5LCV0Y9cY5jJ" alt=""><figcaption></figcaption></figure>

双击脚本，打开编辑器，编写双击 TP 退出代码

```c#
using RayNeo;
using UnityEngine;

public class QuitApp : MonoBehaviour
{
    /// <summary>
    /// 退出应用
    /// </summary>
    public void ToQuitApp()
    {
        Application.Quit();
    }

    void Start()
    {
        // 添加双击事件
        SimpleTouchForLite.Instance.OnDoubleTap.AddListener(ToQuitApp);
    }

    private void OnDestroy()
    {
        if (SimpleTouchForLite.SingletonExist)
        {
            // 移除双击事件
            SimpleTouchForLite.Instance.OnDoubleTap.RemoveListener(ToQuitApp);
        }

    }
}
```

\
把 QuitApp 挂载到 LatticeBrain 物体上

<figure><img src="/files/IrKsqJaEpk0n3hhqPM3v" alt=""><figcaption></figcaption></figure>

<br>

## 编译运行场景

### 1. 编译打包 APK

把 TouchPad 场景 添加到 Scene In Build 中，点击 Build 进行 打包 APK

<figure><img src="/files/iZcNDJ8WMV40vCsl1RFq" alt=""><figcaption></figcaption></figure>

### 2. 连接设备

X3pro 眼镜通过设备线，连接电脑，（其中，电脑 ADB 环境参见手机已经配置好环境），使用 adb devices ，查看连接的设备

<figure><img src="/files/Oo1uqbVeACnd2TYlNdqA" alt=""><figcaption></figcaption></figure>

### 3. 安装应用

之前编译打包好的应用，使用 adb install -r xxx.apk 进行安装

<figure><img src="/files/wsQxIA1hXU6XeQ2Rk7gV" alt=""><figcaption></figcaption></figure>

### 4. 查看运行应用

可以在眼镜上看到刚刚安装的应用

<figure><img src="/files/58MrLJCMv5vSefiNlDvd" alt=""><figcaption></figcaption></figure>

单击 TP 操作板，运行应用，简单效果如下

<figure><img src="/files/oi0TtmFRXa9S3awTxM0u" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://rayneo.gitbook.io/rayneo-devdoc/x-xi-lie/unity-kai-fa/ji-chu-neng-li-api/touchpad-cao-kong.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
