gpt4 book ai didi

java - 如何通过 spannable 方法使用自定义字体设置所选文本的字体样式

转载 作者:行者123 更新时间:2023-11-29 09:31:10 34 4
gpt4 key购买 nike

我想使用自定义字体 为从EditText 中选择的文本设置样式。我在编译时遇到错误。 构造函数 StyleSpan(Typeface) 未定义

下面是我正在申请的代码。

int start=editbox.getSelectionStart();
int end=editbox.getSelectionEnd();
Spannable span=(Spannable)editbox.getText();
StyleSpan f = new StyleSpan(
Typeface.createFromAsset(getAssets(),
"fonts/genbkbasr.ttf"));
span.setSpan(f, start,end, 0);

谢谢。

最佳答案

我写了一个类来解决这个限制。它似乎在有限的测试中起作用,但我还没有编写我需要它的应用程序。请注意,它假定自定义字体作为 Assets 可用,并且它进行静态调用以检索应用程序的上下文(它需要它来访问资源)。更好的方法是将 Context 传递给构造函数..

import android.content.Context;

public class TypefaceResourceSpan extends MetricAffectingSpan implements ParcelableSpan {

private String resourceName_;
private Typeface tf_;

public TypefaceResourceSpan(String resourceName) {
super();
resourceName_=resourceName;
tf_=createTypeface(resourceName_);
}

public TypefaceResourceSpan(Parcel src) {
resourceName_ = src.readString();
tf_=createTypeface(resourceName_);
}

private Typeface createTypeface(String resourceName) {
Typeface result=null;
Context c=TikunKorimMain.getAppContext();
if (c==null) {
Log.e("TypefaceResourceSpan", "Application context is null!");
}
AssetManager am=c.getAssets();
if (am==null) {
Log.e("TypefaceResourceSpan", "AssetManager is null!");
}
result=Typeface.createFromAsset(am, resourceName);
return result;
}

public void writeToParcel(Parcel dest, int flags) {
dest.writeString(resourceName_);
}

@Override
public void updateMeasureState(TextPaint p) {
Typeface old=p.getTypeface();
if ( old != null && !old.isBold() && tf_.isBold() ) {
p.setFakeBoldText(true);
}
if ( old != null && !old.isItalic() && tf_.isItalic() ) {
p.setTextSkewX(-0.25f);
}
p.setTypeface(tf_);
}

@Override
public void updateDrawState(TextPaint tp) {
Typeface old=tp.getTypeface();
if ( old != null && !old.isBold() && tf_.isBold() ) {
tp.setFakeBoldText(true);
}
if ( old != null && !old.isItalic() && tf_.isItalic() ) {
tp.setTextSkewX(-0.25f);
}
tp.setTypeface(tf_);
}

public int getSpanTypeId() {
// TODO does this work???!?
return 123456;
}

public int describeContents() {
return 0;
}
}

关于java - 如何通过 spannable 方法使用自定义字体设置所选文本的字体样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710300/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com