使用StaticLayout实现文字转化为图片的效果(类似发送长微博)
使用Canvas的drawText繪制文本是不會自動換行的,即使一個很長很長的字符串,drawText也只顯示一行,超出部分被隱藏在屏幕之外。可以逐個計算每個字符的寬度,通過一定的算法將字符串分割成多個部分,然后分別調用drawText一部分一部分的顯示, 但是這種顯示效率會很低。
StaticLayout是android中處理文字換行的一個工具類,StaticLayout已經實現了文本繪制換行處理,下面是如何使用StaticLayout的例子:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private EditText textView; private ImageView imageView; private Button btn; private String content; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (EditText) findViewById(R.id.input_text); imageView = (ImageView) findViewById(R.id.input_image); imageView.setVisibility(View.INVISIBLE); btn = (Button) findViewById(R.id.btn_close); btn.setOnClickListener(this); // }public static Bitmap textAsBitmap(String text, float textSize) {TextPaint textPaint = new TextPaint(); // textPaint.setARGB(0x31, 0x31, 0x31, 0); textPaint.setColor(Color.BLACK); textPaint.setAntiAlias(true); textPaint.setTextSize(textSize); StaticLayout layout = new StaticLayout(text, textPaint, 450, Layout.Alignment.ALIGN_NORMAL, 1.3f, 0.0f, true); Bitmap bitmap = Bitmap.createBitmap(layout.getWidth() + 20, layout.getHeight() + 20, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.translate(10, 10); // canvas.drawColor(Color.GRAY); canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);//繪制透明色 layout.draw(canvas); Log.d("textAsBitmap", String.format("1:%d %d", layout.getWidth(), layout.getHeight())); return bitmap; }@Override public void onClick(View v) {switch (v.getId()) {case R.id.btn_close:content = textView.getText().toString().trim(); if (content != null && content != "") {Bitmap bitmap = textAsBitmap(content, 28); imageView.setVisibility(View.VISIBLE); imageView.setBackgroundResource(R.mipmap.liaotian); imageView.setImageBitmap(bitmap); }else{Toast.makeText(MainActivity.this,"輸入內容不能為空",Toast.LENGTH_SHORT); }}} } 布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.example.admin.enjoytalk.MainActivity"> <TextView android:id="@+id/tv_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <!--<android.support.v7.widget.RecyclerView--> <!--android:layout_centerInParent="true"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="wrap_content"--> <!--/>--> <EditText android:id="@+id/input_text" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_close" android:layout_width="match_parent" android:text="輸入完成" android:layout_height="wrap_content" /> <ImageView android:id="@+id/input_image" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
這跟TextView的效果是一樣的,其實TextView也是調用StaticLayout來實現換行的。
StaticLayout的構造函數有三個:
public StaticLayout(CharSequence source,
? ? ? ? ? ? ? ? ? ? TextPaint paint,
? ? ? ? ? ? ? ? ? ? int width,
? ? ? ? ? ? ? ? ? ? Layout.Alignment align,
? ? ? ? ? ? ? ? ? ? float spacingmult,
? ? ? ? ? ? ? ? ? ? float spacingadd,
? ? ? ? ? ? ? ? ? ? boolean includepad)
? ? ? ? ? ? ? ? ? ?
public StaticLayout(CharSequence source,
? ? ? ? ? ? ? ? ? ? int bufstart,
? ? ? ? ? ? ? ? ? ? int bufend,
? ? ? ? ? ? ? ? ? ? TextPaint paint,
? ? ? ? ? ? ? ? ? ? int outerwidth,
? ? ? ? ? ? ? ? ? ? Layout.Alignment align,
? ? ? ? ? ? ? ? ? ? float spacingmult,
? ? ? ? ? ? ? ? ? ? float spacingadd,
? ? ? ? ? ? ? ? ? ? boolean includepad)
? ? ? ? ? ? ? ? ? ?
public StaticLayout(CharSequence source,
? ? ? ? ? ? ? ? ? ? int bufstart,
? ? ? ? ? ? ? ? ? ? int bufend,
? ? ? ? ? ? ? ? ? ? TextPaint paint,
? ? ? ? ? ? ? ? ? ? int outerwidth,
? ? ? ? ? ? ? ? ? ? Layout.Alignment align,
? ? ? ? ? ? ? ? ? ? float spacingmult,
? ? ? ? ? ? ? ? ? ? float spacingadd,
? ? ? ? ? ? ? ? ? ? boolean includepad,
? ? ? ? ? ? ? ? ? ? TextUtils.TruncateAt ellipsize,
? ? ? ? ? ? ? ? ? ? int ellipsizedWidth)
android StaticLayout參數解釋
StaticLayout(CharSequence source, int bufstart, int bufend,
? ? ? ? ? ?TextPaint paint, int outerwidth,
? ? ? ? ? ?Alignment align,
? ? ? ? ? ?float spacingmult, float spacingadd,
? ? ? ? ? ?boolean includepad,
? ? ? ? ? ?TextUtils.TruncateAt ellipsize, int ellipsizedWidth)
1.需要分行的字符串
2.需要分行的字符串從第幾的位置開始
3.需要分行的字符串到哪里結束
4.畫筆對象
5.layout的寬度,字符串超出寬度時自動換行。
6.layout的對其方式,有ALIGN_CENTER, ALIGN_NORMAL, ALIGN_OPPOSITE 三種。
7.相對行間距,相對字體大小,1.5f表示行間距為1.5倍的字體高度。
8.在基礎行距上添加多少
實際行間距等于這兩者的和。
9.參數未知
10.從什么位置開始省略
11.超過多少開始省略
需要指出的是這個layout是默認畫在Canvas的(0,0)點的,如果需要調整位置只能在draw之前移Canvas的起始坐標
canvas.translate(x,y);
總結
以上是生活随笔為你收集整理的使用StaticLayout实现文字转化为图片的效果(类似发送长微博)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS下将文字转成图片方法
- 下一篇: Android中取消系统标题栏的几种方式