【问题标题】:How can I put image under text in the middle of the text?如何将图像放在文本中间的文本下方?
【发布时间】:2020-03-19 05:24:31
【问题描述】:

我需要将图像放在文本中间,如下图所示。并且应该根据文本中的数字来调整图像依赖关系。

我可以使用 SpannableString 执行此操作吗?也许没有根据文本中的数量调整大小?

【问题讨论】:

  • 是的,我想。您可以为此创建自定义 Span .. 关注 This example..

标签: android


【解决方案1】:

方法一:

你可以使用xml作为:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:gravity="center"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/first_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingRight="10dp"
        android:text="Hello"
        android:textSize="25sp" />

    <TextView
        android:id="@+id/middle_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/round_yellow"
        android:padding="20dp"
        android:text="3000"
        android:textSize="25sp" />

    <TextView
        android:id="@+id/last_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"
        android:text="World"
        android:textSize="25sp" />

</LinearLayout>

分割字符串使用:

 currentstring ="Hello World";
    String[] separated = CurrentString.split(" ");
    separated[0]; // this will contain "Hello"
    separated[1]; // this will contain "World"

note: the image will stretch according to the width of the text as in your screen shot.

方法二:

要在可跨度字符串中使用:创建跨度类。

public class SpanClass extends ReplacementSpan {

    private final int mBackgroundColor;
    private final int mTextColor;
    private final float mCornerRadius;
    private final float mPaddingStart;
    private final float mPaddingEnd;
    private final float mMarginStart;

    public SpanClass(int backgroundColor, int textColor, float cornerRadius, float paddingStart, float paddingEnd, float marginStart) {
        super();
        mBackgroundColor = backgroundColor;
        mTextColor = textColor;
        mCornerRadius = cornerRadius;
        mPaddingStart = paddingStart;
        mPaddingEnd = paddingEnd;
        mMarginStart = marginStart;
    }

    @Override
    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        return (int) (mPaddingStart + paint.measureText(text.subSequence(start, end).toString()) + mPaddingEnd);
    }

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
        float width = paint.measureText(text.subSequence(start, end).toString());
        RectF rect = new RectF(x - mPaddingStart + mMarginStart, top, x + width + mPaddingEnd + mMarginStart, bottom);
        paint.setColor(mBackgroundColor);
        canvas.drawRoundRect(rect, mCornerRadius, mCornerRadius, paint);
        paint.setColor(mTextColor);
        canvas.drawText(text, start, end, x + mMarginStart, y, paint);
    }
}

然后在代码中使用它:

 int flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
        SpannableString firstSpan = new SpannableString("Hello");
        SpannableString middleSpan = new SpannableString(" 30 ");
        SpannableString lastSpan = new SpannableString("World");
        middleSpan.setSpan(new StyleSpan(Typeface.BOLD), 0, middleSpan.length(), flag);
        middleSpan.setSpan(new SpanClass(Color.BLACK, Color.WHITE, 90, 10, 10, 10), 0, middleSpan.length(), flag);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        builder.append(firstSpan);
        builder.append(middleSpan);
        builder.append(lastSpan);
        my_textview.setText(builder);

Screenshot

参考:Android Spannablecontent With Rounded Corners

【讨论】:

  • 我可以用 SpannableString 做这种行为吗?
  • 编辑答案以获得与 SpannableString 的使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2021-10-01
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多