Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:创建一个可绘制的表格,以不同的字体和大小显示两行文字,一行在另一行的上方?_Android_Android Canvas_Android Drawable_Floating Action Button - Fatal编程技术网

Android:创建一个可绘制的表格,以不同的字体和大小显示两行文字,一行在另一行的上方?

Android:创建一个可绘制的表格,以不同的字体和大小显示两行文字,一行在另一行的上方?,android,android-canvas,android-drawable,floating-action-button,Android,Android Canvas,Android Drawable,Floating Action Button,我想创建一个显示两行文字的可绘制表格,一行在另一行之上。每行文本都必须使用自己的字体和文本大小,并且必须创建一个可绘制的文本,因为我想将其设置为浮动操作按钮的可绘制文本 private void updateFloatingButtonText(String headlineText, String subHeadlineText, FloatingActionButton floatingActionButton) { int headlineTextSize = getResour

我想创建一个显示两行文字的可绘制表格,一行在另一行之上。每行文本都必须使用自己的字体和文本大小,并且必须创建一个可绘制的文本,因为我想将其设置为浮动操作按钮的可绘制文本

private void updateFloatingButtonText(String headlineText, String subHeadlineText, FloatingActionButton floatingActionButton) {

    int headlineTextSize = getResources().getDimensionPixelSize(R.dimen.headlineTextSize);
    int subheadlineTextSize = getResources().getDimensionPixelSize(R.dimen.subheadlineTextSize);

    Spannable spannableStringHeadline = new SpannableString(headlineText);
    Spannable spannableStringSubheadline = new SpannableString(subHeadlineText);

    CustomTypefaceSpan boldSpan = new CustomTypefaceSpan("FontOne", FontCache.get("FontOne.ttf", this));
    CustomTypefaceSpan regularSpan = new CustomTypefaceSpan("FontTwo", FontCache.get("FontTwo.ttf", this));

    // set typeface headline
    spannableStringHeadline.setSpan(regularSpan, 0,
            headlineText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE
    );


    // set typeface subtitle
    spannableStringSubheadline.setSpan(boldSpan, 0,
            subHeadlineText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE
    );

       // set text size headline
    spannableStringHeadline.setSpan(new AbsoluteSizeSpan(headlineTextSize), 0,
            headlineText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE
    );

     // set text size subline
    spannableStringSubheadline.setSpan(new AbsoluteSizeSpan(subheadlineTextSize), 0,
            subHeadlineText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE
    );

    String finalString = TextUtils.concat(spannableStringHeadline, "\n", spannableStringSubheadline);

    floatingActionButton.setImageDrawable([put the resulting drawable here]);
}
我已经编写了这个方法,创建了一个完全按照我需要的方式格式化的字符串,但是我仍然有一个问题,那就是如何创建一个可绘制的字符串

我曾尝试使用这个第三方库,但尽管它以正确的字体显示文本,但它不会更改文本行的文本大小


有没有一种琐碎的(或非平凡的)方法可以做到这一点

通过创建如下所示的新类来解决:

public class TextToDrawable extends Drawable {

    private String headlineText = "";
    private String subHeadlineText = "";
    private final TextPaint headlinePaint = new TextPaint();
    private final TextPaint subHeadlinePaint = new TextPaint();

    public TextToDrawable(Context context, String headlineText, String subHeadlineText) {

        this.headlineText = headlineText;
        headlinePaint.setAntiAlias(true);
        headlinePaint.setTypeface(FontCache.get("FontA.ttf", context));
        headlinePaint.setTextSize(context.getResources().getDimensionPixelSize(R.dimen.headlineTextSize));
        headlinePaint.setColor(ContextCompat.getColor(context, android.R.color.white));
        headlinePaint.setStyle(Paint.Style.FILL);
        headlinePaint.setTextAlign(Paint.Align.LEFT);

        this.subHeadlineText = subHeadlineText;
        subHeadlinePaint.setAntiAlias(true);
        subHeadlinePaint.setTypeface(FontCache.get("FontB.ttf", context));
        subHeadlinePaint.setTextSize(context.getResources().getDimensionPixelSize(R.dimen.subheadlineTextSize));
        subHeadlinePaint.setColor(ContextCompat.getColor(context, android.R.color.white));
        subHeadlinePaint.setStyle(Paint.Style.FILL);
        subHeadlinePaint.setTextAlign(Paint.Align.LEFT);
    }

    @Override
    public void draw(Canvas canvas) {

        Rect headlineWidth = new Rect();
        Rect subheadlineWidth = new Rect();

        headlinePaint.getTextBounds(headlineText, 0, headlineText.length(), headlineWidth);
        subHeadlinePaint.getTextBounds(subHeadlineText, 0, subHeadlineText.length(), subheadlineWidth);

        Rect bounds = new Rect();
        headlinePaint.getTextBounds(headlineText, 0, headlineText.length(), bounds);
        int x = getBounds().width() / 2 - (headlineWidth.width()/2);
        int y = (getBounds().height() / 2);

        canvas.drawText(headlineText, x, y, headlinePaint);

        x = getBounds().width()/2 - (subheadlineWidth.width()/2);
        y += headlinePaint.getFontSpacing();

        canvas.drawText(subHeadlineText, x, y, subHeadlinePaint);

    }

    @Override
    public void setAlpha(int alpha) {
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {

    }

    @Override
    public int getOpacity() {
        return 0;
    }

}
mFloatingActionButton.setImageDrawable(new TextToDrawable(this, "Headline", "Subheadline"));
然后像这样使用新类:

public class TextToDrawable extends Drawable {

    private String headlineText = "";
    private String subHeadlineText = "";
    private final TextPaint headlinePaint = new TextPaint();
    private final TextPaint subHeadlinePaint = new TextPaint();

    public TextToDrawable(Context context, String headlineText, String subHeadlineText) {

        this.headlineText = headlineText;
        headlinePaint.setAntiAlias(true);
        headlinePaint.setTypeface(FontCache.get("FontA.ttf", context));
        headlinePaint.setTextSize(context.getResources().getDimensionPixelSize(R.dimen.headlineTextSize));
        headlinePaint.setColor(ContextCompat.getColor(context, android.R.color.white));
        headlinePaint.setStyle(Paint.Style.FILL);
        headlinePaint.setTextAlign(Paint.Align.LEFT);

        this.subHeadlineText = subHeadlineText;
        subHeadlinePaint.setAntiAlias(true);
        subHeadlinePaint.setTypeface(FontCache.get("FontB.ttf", context));
        subHeadlinePaint.setTextSize(context.getResources().getDimensionPixelSize(R.dimen.subheadlineTextSize));
        subHeadlinePaint.setColor(ContextCompat.getColor(context, android.R.color.white));
        subHeadlinePaint.setStyle(Paint.Style.FILL);
        subHeadlinePaint.setTextAlign(Paint.Align.LEFT);
    }

    @Override
    public void draw(Canvas canvas) {

        Rect headlineWidth = new Rect();
        Rect subheadlineWidth = new Rect();

        headlinePaint.getTextBounds(headlineText, 0, headlineText.length(), headlineWidth);
        subHeadlinePaint.getTextBounds(subHeadlineText, 0, subHeadlineText.length(), subheadlineWidth);

        Rect bounds = new Rect();
        headlinePaint.getTextBounds(headlineText, 0, headlineText.length(), bounds);
        int x = getBounds().width() / 2 - (headlineWidth.width()/2);
        int y = (getBounds().height() / 2);

        canvas.drawText(headlineText, x, y, headlinePaint);

        x = getBounds().width()/2 - (subheadlineWidth.width()/2);
        y += headlinePaint.getFontSpacing();

        canvas.drawText(subHeadlineText, x, y, subHeadlinePaint);

    }

    @Override
    public void setAlpha(int alpha) {
    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {

    }

    @Override
    public int getOpacity() {
        return 0;
    }

}
mFloatingActionButton.setImageDrawable(new TextToDrawable(this, "Headline", "Subheadline"));
这不是一个很好的解决方案,因为它只支持两行文本——这里没有动态变化。然而,我认为重写它将相当容易,以支持更多的行和更多的字体,它解决了当前的问题