android中static方法,StaticLayout如何在Android中使用?

StaticLayout(similar to DynamicLayout and BoringLayout)用于在画布上布局和绘制文本.它通常用于以下任务:

>测量布局后多行文字的大小.

>在位图图像上绘制文本.

>创建一个处理自己的文本布局的自定义视图(而不是使用嵌入的TextView创建复合视图). TextView本身使用StaticLayout internally.

测量文字大小

单线

如果您只有一行文本,则可以使用Paint或TextPaint进行测量.

String text = "This is some text."

TextPaint myTextPaint = new TextPaint();

mTextPaint.setAntiAlias(true);

mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);

mTextPaint.setColor(0xFF000000);

float width = mTextPaint.measureText(text);

float height = -mTextPaint.ascent() + mTextPaint.descent();

多行

但是,如果有换行并且您需要高度,那么最好使用StaticLayout.您提供宽度,然后您可以从StaticLayout获取高度.

String text = "This is some text. This is some text. This is some text. This is some text. This is some text. This is some text.";

TextPaint myTextPaint = new TextPaint();

myTextPaint.setAntiAlias(true);

myTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);

myTextPaint.setColor(0xFF000000);

int width = 200;

Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;

float spacingMultiplier = 1;

float spacingAddition = 0;

boolean includePadding = false;

StaticLayout myStaticLayout = new StaticLayout(text, myTextPaint, width, alignment, spacingMultiplier, spacingAddition, includePadding);

float height = myStaticLayout.getHeight();

新API

如果您想使用较新的StaticLayout.Builder(可从API 23获得),您可以获得如下布局:

StaticLayout.Builder builder = StaticLayout.Builder.obtain(text, 0, text.length(), myTextPaint, width);

StaticLayout myStaticLayout = builder.build();

您可以使用点表示法来添加额外设置:

StaticLayout.Builder builder = StaticLayout.Builder.obtain(text, 0, text.length(), myTextPaint, width)

.setAlignment(Layout.Alignment.ALIGN_NORMAL)

.setLineSpacing(spacingMultiplier, spacingAddition)

.setIncludePad(includePadding)

.setMaxLines(5);

StaticLayout myStaticLayout = builder.build();

在图像上写文字

我可能会在将来扩展它,但是现在请参阅this post以获取使用StaticLayout并返回位图的方法的示例.

进行自定义文本处理视图

以下是使用StaticLayout的自定义视图的示例.它的行为类似于简单的TextView.当文本太长而无法放在屏幕上时,它会自动换行并增加其高度.

a2da38d894c1ec016dc1a08f5eeb8de8.png

MyView.java

public class MyView extends View {

String mText = "This is some text.";

TextPaint mTextPaint;

StaticLayout mStaticLayout;

// use this constructor if creating MyView programmatically

public MyView(Context context) {

super(context);

initLabelView();

}

// this constructor is used when created from xml

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

initLabelView();

}

private void initLabelView() {

mTextPaint = new TextPaint();

mTextPaint.setAntiAlias(true);

mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);

mTextPaint.setColor(0xFF000000);

// default to a single line of text

int width = (int) mTextPaint.measureText(mText);

mStaticLayout = new StaticLayout(mText, mTextPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);

// New API alternate

//

// StaticLayout.Builder builder = StaticLayout.Builder.obtain(mText, 0, mText.length(), mTextPaint, width)

// .setAlignment(Layout.Alignment.ALIGN_NORMAL)

// .setLineSpacing(1, 0) // multiplier, add

// .setIncludePad(false);

// mStaticLayout = builder.build();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// Tell the parent layout how big this view would like to be

// but still respect any requirements (measure specs) that are passed down.

// determine the width

int width;

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int widthRequirement = MeasureSpec.getSize(widthMeasureSpec);

if (widthMode == MeasureSpec.EXACTLY) {

width = widthRequirement;

} else {

width = mStaticLayout.getWidth() + getPaddingLeft() + getPaddingRight();

if (widthMode == MeasureSpec.AT_MOST) {

if (width > widthRequirement) {

width = widthRequirement;

// too long for a single line so relayout as multiline

mStaticLayout = new StaticLayout(mText, mTextPaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);

}

}

}

// determine the height

int height;

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int heightRequirement = MeasureSpec.getSize(heightMeasureSpec);

if (heightMode == MeasureSpec.EXACTLY) {

height = heightRequirement;

} else {

height = mStaticLayout.getHeight() + getPaddingTop() + getPaddingBottom();

if (heightMode == MeasureSpec.AT_MOST) {

height = Math.min(height, heightRequirement);

}

}

// Required call: set width and height

setMeasuredDimension(width, height);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

// do as little as possible inside onDraw to improve performance

// draw the text on the canvas after adjusting for padding

canvas.save();

canvas.translate(getPaddingLeft(), getPaddingTop());

mStaticLayout.draw(canvas);

canvas.restore();

}

}

activity_main.xml中

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:padding="@dimen/activity_vertical_margin"

tools:context="com.example.layoutpractice.MainActivity">

android:layout_centerHorizontal="true"

android:background="@color/colorAccent"

android:padding="10dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

笔记

> This,this和this对于学习如何创建自定义文本处理视图很有用.

>如果要添加可以从代码或xml设置的自定义属性,请参阅Creating a View Class.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值