Android 如何在TextView中创建垂直对齐的上标和下标

Android 如何在TextView中创建垂直对齐的上标和下标,android,textview,subscript,superscript,Android,Textview,Subscript,Superscript,在下图的示例中: 我如何使上标和下标数字对齐以产生一个通用的科学符号,如下所示 在文本视图中?如果有一种方法可以使用Spannable或ReplacementSpan我想看看一个工作示例。谢谢。如果您只需要下标和上标,请使用下标启用和上标启用。如果出于某种原因,您不喜欢这些图形的绘制方式,您可以随时启用自定义图形并自己绘制。使用此代码解决此问题 TextView txt=(TextView)findViewById(R.id.txt_标签); txt.setText(Html.fromHtm

在下图的示例中:

我如何使上标和下标数字对齐以产生一个通用的科学符号,如下所示


文本视图中
?如果有一种方法可以使用
Spannable
ReplacementSpan
我想看看一个工作示例。谢谢。

如果您只需要下标和上标,请使用下标启用和上标启用。如果出于某种原因,您不喜欢这些图形的绘制方式,您可以随时启用自定义图形并自己绘制。

使用此代码解决此问题

TextView txt=(TextView)findViewById(R.id.txt_标签);

txt.setText(Html.fromHtml(“94Be”))

您可能想尝试类似的方法

它是一个
ReplacementSpan
,它将应用它的文本分为两部分,并在画布上绘制它们。尺寸因子和y平移多少是手工挑选的。我希望它是有用的(或者至少你或者其他人可以在它的基础上建立)

然后将其用作:

Spannable str = new SpannableString("9,4Be -> 2000,127Jo");
str.setSpan(new SuperSubSpan(), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
str.setSpan(new SuperSubSpan(), 9, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTextView.setText(str);
这将产生以下结果:


稍微好一点的解决方案是为这些字符串使用特殊格式(例如,
“{9,4}be->{2000127}Jo”
),并使用正则表达式处理字符串并添加相应的
超级子span
,这样您就不需要手动执行此操作。但实际跨度部分大致相同。

您可以一步一步地跟我来。你可以从这里得到帮助。比如

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView txtView = (TextView) findViewById(R.id.textView1);
        TextView water = (TextView) findViewById(R.id.textView2);
        txtView.setText(Html.fromHtml("a" + "<sup>" + "2" + "</sup>" + " + "
                + "b" + "<sup>" + "2" + "</sup>" + "=" + "(" + "a-b" + ")"
                + "<sup>" + "2" + "</sup>" + " + " + "2ab"));

        water.setText(Html.fromHtml("H" + "<sub>" + "2" + "</sub>" + "O"));

    }

}
公共类MainActivity扩展活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView txtView=(TextView)findViewById(R.id.textView1);
TextView水=(TextView)findViewById(R.id.textView2);
txtView.setText(Html.fromHtml(“a”+“”+“2”+“”+“+”
+“b”+“+”+“2”+“+”=“+”(“+”a-b“+”)
+“+”2“+”+“+”+“+”2ab”);
setText(Html.fromHtml(“H”+“2”+“O”);
}
}
这里有上府标和下府标

及 activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context="com.example.textview.MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

</LinearLayout>


祝你好运

我不会试图弯曲TextView小部件来实现这一点。相反,您可以轻松地制作自己的小部件,它有两种不同的颜色:一种用于元素名称(大字体),另一种用于数字(小字体,斜体)

您应该创建适当的setter并单独存储每个属性,而不是存储一个大的可扩展或字符串

您还可以轻松地水平和垂直对齐(元素名称顶部和底部的数字)


要计算宽度,可以使用一个属性来调整数字和元素名称之间的填充。然后,您可以使用每个绘制来计算文本宽度并添加所有这些内容(不要忘记添加小部件填充值)。

您也可以在本文中参考我的答案 只需使用
SpannableString
即可解决您的问题

 SpannableString styledString = new SpannableString("9-10th STD");
 styledString.setSpan(new SuperscriptSpan(), 4, 6, 0);
 textView.setText(styledString);

然后把你的
android:textAllCaps=“false”

放在。。。您希望它们水平对齐!。。。打败我。。。但现在你明白了!好吧,我唯一(可怕)的想法是。。。将两个文本视图置于另一个文本视图之上,并在其中一个文本视图上打印super或subscript字符,以便它可以占用sub/superscript字符的相同速度。你必须把同一篇文章写两遍,使两篇文章“完美”(或接近)或(这个想法比前一篇10:1)。。。创建自定义视图并自己绘制文本。然后您必须解析sub/sup标记。使用自定义替换span然后您可能需要使用自定义Spannable。它将允许您直接接管Spanable的绘图。你可以在这里看到一个例子:恐怕我对此一无所知。你能提供一个具体的例子吗?我已经搜索了所有的跨距字符串示例和教程,但没有一个是这样做的。我一点也不奇怪,大多数开发人员甚至不知道跨距字符串的存在。在安卓系统中,创建一个自定义的可能是最罕见的事情了。@Gabeschen实际上不是可扩展的,而是可扩展的,在这种情况下ReplacementSpan@pskink你完全正确,我的错。正如我所说,在Android上最难得的事情之一是:)
 SpannableString styledString = new SpannableString("9-10th STD");
 styledString.setSpan(new SuperscriptSpan(), 4, 6, 0);
 textView.setText(styledString);