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);