0

我正在尝试创建一个用于视觉操作代数的 Android 应用程序。有没有我可以使用的库可以呈现可选的,如可点击的代数?理想的库将采用一些符号代数,例如以 MathML 形式,在屏幕上呈现它,并返回 onTouch 事件或类似的事件,这些事件表明所呈现的代数的哪一部分已被触摸。

例如,在二次公式中,用户可以触摸平方根中的 4ac,这个库会告诉我平方根中的 4ac 已被触摸,所以我可以突出显示 4ac 让用户知道它是选择,并独立于周围的代数复制它。另一个示例是在等式中选择一项,以便应用程序可以修改或替换它。

任何等价物都可以;一个可以返回方程的图形表示的库,并且还可以识别该方程的哪个部分已被象征性地触摸,给定图形上的点击坐标,就可以了。本质上,我正在寻找一个 MathML(或类似的)渲染器,它确切地知道其渲染的每一位代表什么。

我已经查看了 symja、sympy 和 MathJax,虽然我确实有点迷茫,但我还没有找到任何方法来做到这一点。这是否已经存在于某个地方?

提前致谢。

4

1 回答 1

2

最直接的方法是将“onClick”属性直接添加到您使用的 MathML 中,并从那里使用元素 ID 和 Java/JavaScript 方法绑定。但是据我所知,MathML 不(还?)支持“onClick”属性。

我所做的修改是为每个可点击的 MathML 元素添加链接,然后为 WebView 重载 WebViewClient 的 shouldOverrideUrlLoading() 方法,以捕获被调用的链接。然后,如果您在链接中的某处添加唯一的 ID 值,您可以识别单击了哪个元素。

更改您上传的 MathML

如果您的原始 MathML 如下所示:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
        <msqrt>
          <msup><mi>b</mi><mn>2</mn></msup>
          <mo>−&lt;/mo>
          <mn>4</mn><mi>a</mi><mi>c</mi>
        </msqrt>
</math>

将其更改为:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
        <msqrt href=id1>
          <msup><mi>b</mi><mn>2</mn></msup>
          <mo>−&lt;/mo>
          <mstyle href=id2><mn>4</mn><mi>a</mi><mi>c</mi></mstyle>
        </msqrt>
</math>

注意嵌套链接。当为 MathJax 使用 HTML-CSS 输出时,只有最低的链接被主动点击。但是,当使用 SVG 输出时,每个链接都按从最低级别到最高级别的顺序调用。因此,对于我的建议,您必须使用 MathJax 的 HTML-CSS 输出。如果我找到使 SVG 工作的方法,我将进行编辑。

重载 shouldOverrideUrlLoading()

这在有关此的许多 StackOverflow 问题中都有描述,您可以参考 Android Devs 网站了解详情(此处),因此我不会详细介绍。基本上, shouldOverrideUrlLoading() 将有一个 url 字符串,其中包含您为刚刚单击的 MathML 元素指定的链接。解析它的 ID 值并将其发送到可以使用它的函数,你就可以开始了。

这是我在项目中使用的代码。

public class MathmlLinksViewClient extends WebViewClient {

    //protected MainActivity activity;
    public MathmlLinksViewClient(MainActivity context) {
        activity = context;
    }
    
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // Reroutes id int value to MainActivity method
        activity.onMathmlClick(
                Integer.valueOf(
                            // Method I wrote to parse ID from URL
                            HtmlIdFormat.getIdFromString(url) ) );
        return true;
    }

}

请注意,传递给此函数的 url 并不完全是您在 MathML 元素中包含的链接。在为您的 WebView 使用 WebView.loadDataWithBaseUrl() 方法时,这些中的每一个都由指定的主机链接添加。(我假设您正在按照本指南渲染 MathML。)

如果您的视图操作任何其他 HTML 链接,您需要添加一个 if 语句来分隔对 MathML 元素链接和网站链接的操作。同样,您可以研究如何有效地使用 shouldOverrideUrlLoading()。

一个缺点是它会将蓝色链接颜色添加到所有链接对象。您应该能够在 MathML 中通过使用 mstyle 声明将所有元素的颜色设置为黑色来覆盖它,但我目前在这样做时遇到了问题。

我没有涵盖所有内容,但我希望这会有所帮助!

于 2014-06-22T17:50:47.487 回答