Подтвердить что ты не робот

Как создать вертикально выровненный верхний индекс и индекс в TextView

В примере ниже:

enter image description here

Как сделать так, чтобы верхние и нижние индексы были выровнены для создания общей научной нотации, как показано ниже.

enter image description here

в TextView? Если есть способ использовать Spannable или ReplacementSpan, я бы хотел увидеть рабочий пример. Спасибо.

4b9b3361

Ответ 1

Возможно, вы захотите попробовать что-то вроде этого.

Он basicall a ReplacementSpan, который принимает текст, на который он применяется, отделяет его на две части и рисует на холсте. Коэффициент размера и y перевод несколько подобраны. Я надеюсь, что это будет полезно (или, по крайней мере, вы или кто-то другой можете на нем поработать).

public class SuperSubSpan extends ReplacementSpan
{
    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, FontMetricsInt fm)
    {
        text = text.subSequence(start, end);
        String[] parts = text.toString().split(",");

        Paint p = getSuperSubPaint(paint);
        return (int) Math.max(p.measureText(parts[0]), p.measureText(parts[1]));
    }

    private static TextPaint getSuperSubPaint(Paint src)
    {
        TextPaint paint = new TextPaint(src);
        paint.setTextSize(src.getTextSize() / 2.5f);
        return paint;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint)
    {
        text = text.subSequence(start, end);
        String[] parts = text.toString().split(",");

        Paint p = getSuperSubPaint(paint);

        float width1 = p.measureText(parts[0]);
        float width2 = p.measureText(parts[1]);
        float maxWidth = Math.max(width1, width2);

        canvas.drawText(parts[0], x + (maxWidth - width1), y - (bottom - top) / 3f, p);
        canvas.drawText(parts[1], x + (maxWidth - width2), y + (bottom - top) / 10f, p);
    }
}

Затем используйте его как:

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

который дает следующий результат:

Sample

Несколько лучше было бы иметь специальный формат для этих строк (например, "{9,4}Be -> {2000,127}Jo") и иметь регулярное выражение для обработки строки и добавить соответствующий SuperSubSpans, чтобы вам не нужно было это вручную, Но фактическая часть Span будет более или менее одинаковой.

Ответ 2

Если вам просто нужен индекс и надстрочный индекс, используйте SubscriptSpannable и SuperscriptSpannable. Если вам не нравится, как вытягиваются по какой-то причине, вы всегда можете сделать пользовательский spannable и нарисовать его самостоятельно.

Ответ 3

используйте этот код для решения....

TextView txt = (TextView)findViewById(R.id.txt_label); txt.setText(Html.fromHtml("<sup>9</sup><sub>4</sub>Be"));

Ответ 4

вы можете следовать за мной шаг за шагом. Вы получите помощь от этого. таких как

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

    }

}

здесь надстрочный надстрочный надстрочный и вспомогательный индексы.

А 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>

Удачи!

Ответ 5

Я бы не попытался согнуть виджет TextView, чтобы сделать это. Вместо этого вы можете легко создать собственный виджет с двумя разными красками: один для имени элемента (большой размер шрифта) и один для чисел (малый размер, курсив).

Вы создадите правильные сеттеры и сохраните каждое свойство отдельно, вместо того, чтобы хранить большую spannable или string.

Вы также сможете легко выровнять по горизонтали и по вертикали (цифры сверху и снизу имени элемента)

Чтобы вычислить ширину, вы можете иметь свойство для корректировки отступов между числами и именем элемента. Затем вы можете использовать каждую краску для вычисления ширины текста и добавить все это (не забудьте добавить значения дополнений виджета).

Ответ 6

вы также можете отсылать мой ответ в этой ссылка Просто используйте SpannableString, чтобы решить вашу проблему.

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

и поставьте android:textAllCaps="false"