文字处理以及tf使用_android原生

本文详细介绍Android中文字处理的各种技巧,包括设置字体样式、颜色、大小等,并提供了多种样式的实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文字处理
文字处理在android开发中占了很大的一块,如何进行文字处理呢!面对复杂的文字效果怎么可以妥协。

只知道android中提供了三种常见样式,怎么可以呢!
Android提供三种字体:“Sans”,“serif”和“monospace”。

下面小编写了一些关于自己使用的一些东东,小小总结了下

体颜色
textView = (TextView) findViewById(R.id.textview);  
SpannableStringBuilder builder = new SpannableStringBuilder(textView.getText().toString());  

//ForegroundColorSpan 为文字前景色,BackgroundColorSpan为文字背景色  
ForegroundColorSpan redSpan = new ForegroundColorSpan(Color.RED);  
ForegroundColorSpan whiteSpan = new ForegroundColorSpan(Color.WHITE);  
ForegroundColorSpan blueSpan = new ForegroundColorSpan(Color.BLUE);  
ForegroundColorSpan greenSpan = new ForegroundColorSpan(Color.GREEN);  
ForegroundColorSpan yellowSpan = new ForegroundColorSpan(Color.YELLOW);  



builder.setSpan(redSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
builder.setSpan(whiteSpan, 1, 2, Spannable.SPAN_INCLUSIVE_INCLUSIVE);  
builder.setSpan(blueSpan, 2, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
builder.setSpan(greenSpan, 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
builder.setSpan(yellowSpan, 4,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  

textView.setText(builder);  

代码] [Java]代码
代码2,比上面小编随手写的更加广,小小整理了下

import android.app.Activity; 
import android.content.res.ColorStateList; 
import android.content.res.XmlResourceParser; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Color; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.text.SpannableString; 
import android.text.Spanned; 
import android.text.method.LinkMovementMethod; 
import android.text.style.AbsoluteSizeSpan; 
import android.text.style.BackgroundColorSpan; 
import android.text.style.BulletSpan; 
import android.text.style.DrawableMarginSpan; 
import android.text.style.ForegroundColorSpan; 
import android.text.style.IconMarginSpan; 
import android.text.style.ImageSpan; 
import android.text.style.RelativeSizeSpan; 
import android.text.style.ScaleXSpan; 
import android.text.style.StrikethroughSpan; 
import android.text.style.StyleSpan; 
import android.text.style.SubscriptSpan; 
import android.text.style.SuperscriptSpan; 
import android.text.style.TextAppearanceSpan; 
import android.text.style.TypefaceSpan; 
import android.text.style.URLSpan; 
import android.text.style.UnderlineSpan; 
import android.widget.TextView; 

public class TextViewLinkActivity extends Activity { 
    TextView mTextView = null; 
    SpannableString msp = null;   

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        mTextView = (TextView)findViewById(R.id.myTextView); 

        //创建一个 SpannableString对象 
        msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合/bot");  

        //设置字体(default,default-bold,monospace,serif,sans-serif) 
        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

        //设置字体大小(绝对值,单位:像素) 
        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
        msp.setSpan(new AbsoluteSizeSpan(20,true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。 

        //设置字体大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍 
        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //0.5f表示默认字体大小的一半 
        msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //2.0f表示默认字体大小的两倍 

        //设置字体前景色 
        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置前景色为洋红色 

        //设置字体背景色 
        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //设置背景色为青色 

        //设置字体样式正常,粗体,斜体,粗斜体 
        msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //正常 
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗体 
        msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //斜体 
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  //粗斜体 

        //设置下划线 
        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

        //设置删除线 
        msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

        //设置上下标 
        msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //下标 
        msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);   //上标             

        //超级链接(需要添加setMovementMethod方法附加响应) 
        msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //电话 
        msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //邮件 
        msp.setSpan(new URLSpan("http://www.2cto.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //网络 
        msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //短信   使用sms:或者smsto: 
        msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //彩信   使用mms:或者mmsto: 
        msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);     //地图    

        //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍 
        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变 

        //设置字体(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色) 
        ColorStateList csllink = null; 
        ColorStateList csl = null; 
        XmlResourceParser xppcolor=getResources().getXml (R.color.color); 
        try { 
            csl= ColorStateList.createFromXml(getResources(),xppcolor); 
        }catch(XmlPullParserException e){ 
            // TODO: handle exception 
            e.printStackTrace(); 
        }catch(IOException e){ 
            // TODO: handle exception 
            e.printStackTrace(); 
        } 

        XmlResourceParser xpplinkcolor=getResources().getXml(R.color.linkcolor); 
        try { 
            csllink= ColorStateList.createFromXml(getResources(),xpplinkcolor); 
        }catch(XmlPullParserException e){ 
            // TODO: handle exception 
            e.printStackTrace(); 
        }catch(IOException e){ 
            // TODO: handle exception 
            e.printStackTrace(); 
        } 
        msp.setSpan(new TextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  

        //设置项目符号 
        msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH,Color.GREEN), 0 ,msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色 

        //设置图片 
        Drawable drawable = getResources().getDrawable(R.drawable.icon); 
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
        msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

        mTextView.setText(msp); 
        mTextView.setMovementMethod(LinkMovementMethod.getInstance()); 
    } 
} 

字体需要注意一下问题偶:
在很多的时候我们需要把TextView变粗,可是仅仅只是设置文本的
android:textStyle=”bold”或者是通过获取textview的getPaint然后设置中文变粗(textView.getpaint().setFakeBoldText(true))发现还是不行,这个时候我们要如何把字体变粗呢!
我用了一个很投机取巧的方法,利用textview的阴影效果,

其中需要设置

 android:shadowDy="0"--y轴上面偏移的位置
        android:shadowDx="2"--x轴上面偏移的位置
        android:shadowRadius="1"--偏移的圆角
 android:shadowColor="#483010"--阴影颜色

但是需要知道的是,您设置的位移偏移量会很大程度的影响偏移颜色和字体颜色之间的距离,如果距离过大,那么这不是加粗,就是搞笑了偶。

除了上面的用android自带的处理文字,还有使用tf文字样式 库也是可以的偶,tf如何才能够加载在文件里面呢?
Android提供三种字体:“Sans”,“serif”和“monospace”。
1、在Android XML文件中设置字体
可 以采用android:typeface,例如android:typeface=”monospace”。在这里例子中我们在Activity中对 android:text=”Hello, World! 您好”分别进行了四种显示方式,依次为“Sans”,“serif”,“monospace”和系统缺省方式(经试验缺省采用采用sans)。英文字体有 差异,貌似中文字体没有差异。XML文件如下:

<?xml version=”1.0″ encoding=”utf-8″?> 
<TableLayout … … android:stretchColumns = “1″>
<TableRow>
<TextView android:text=”sans:” 
android:layout_marginRight=”4px” 
android:textSize=”20sp” />
<TextView android:text=”Hello, World! 您好”
android:typeface =”sans” <!– android:typeface用于指定字体–> 
android:textSize=”20sp” />
</TableRow>
… …类同,依次设置两个TableRow,分别将sans 修改为serif,monospace … … 
<TableRow> 
<TextView android:text=”custom:”. /> 
<TextView android:id=”@+id/c12_customandroid:text=”Hello, World! 您好” 
android:textSize=”20sp” /> 
</TableRow> 
</TableLayout>

2、使用其他字体

1)将新字体的TTF文件copy到assets/fonts/目录下面,例如我们将“*.ttf”copy了过去。字体文件类型可以是大写也可以是小写。

2)我们需要将widget设置为该字体,比较遗憾的是,不能直接在XML文件中进行,需要编写源代码。
TextView tv = (TextView)findViewById(R.id.c12_custom);
//从assert中获取有资源,获得app的assert,采用getAserts(),通过给出在assert/下面的相对路径。在实际使用中,字体库可能存在于SD卡上,可以采用createFromFile()来替代createFromAsset。
**Typeface face = Typeface.createFromAsset (getAssets() , “fonts/timesi.ttf” );
tv.setTypeface (face);**
我 在模拟器中先后导入华文行楷的字体,大约4M,但是系统无法识别出该字体,没有显示,然后尝试使用英文字体timesi.ttf,正常。因此 Android并非和所有的TTF字体都能兼容,尤其在中文特殊字体的支持会存在问题,对于不兼容的字体,Android不出报错,只是无法正常显示。一 般而言我们都会使用系统缺省提供的字体。

对于华文行楷字体,我们一开始使用的文件是中文名字,出现报错,后来我们将之改为全小写的英文名称就不会出错,所以在文件命名上需要注意。
其中需要特别注意的是:此方法只试用于 extends Activity的class,并不是试用于比如extends RelativeLayout继extends view的。所以在使用前一定要注意,同时在公司的开发过程中,该方法使用的甚少。

3、一些注意
使用其他字库,都会消耗程序的空间,这是要非常注意的。而且这些字库有时并不能完全提供你所需要的文字。
举 个例子,省略方式。当文字太多的时候,可以通过省略号省略后面的内容,省略号是使用“…”作为一个字体,可通过android:ellipsize属性进 行设置。如果我们需要使用省略功能,需要确保字体具有省略号。此外,为了保证长度的一直,Android会进行填充处理,除了将一个字符更换为省略符合 外,后面的字符将更换为一个特殊的Unicode字符,‘ZERO WIDTH NO-BREAK SPACE’ (U+FEFF)。这个字符并占用任何可视的位置,但是保障了string具有同样的长度。不是所有的字体都支持这个特殊的字符,可能会引发一些乱码现 象。
Android是支持国际语言的,但是我们仍需要对custom的字体小心处理。

下面是小编在lua和android中分别写的TF文件使用
**–测试的方法
function initUI(context,dir)
print(“开始布局”);
getScreenDpi(context);
loadIdentifierResource(context);
local dlayout=RelativeLayout(context);
local ddd=TextView(context);
local typeface=luajava.bindClass(“android.graphics.Typeface”):createFromAsset(context:getAssets(),”fonts/fzcyt.ttf”);
ddd:setTypeface(typeface);
ddd:setText(“我来看看你的小小效果”);
dlayout:addView(ddd);
context:setContentView(dlayout);
print(“完成了哈”);
end
package com.example.textuser;
import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView ddd=(TextView)findViewById(R.id.ddd);
Typeface typeface = Typeface.createFromAsset(this.getAssets(),”fonts/fzcyt.ttf”);
ddd.setTypeface(typeface);
ddd.setText(“我来看看你的小小效果”);
}
}**
此文档,是小编之前写的很多文档合了一下,故有些信息重复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值