android自訂換行置中CenterTextView
在我們開發app時,TextView一定是使用最多的控制項了,android內建的TextView的功能也十分強大,但還是有些小的地方不能滿足我們的需求,幾天要說的這個功能也是開發中很常見的,就是,在我們顯示一段超過螢幕寬度的 String時,TextView會自動換行,但系統預設的換行效果是頂起,而不是美工要求的置中。這時候,就需要我們對系統的TextView做一些改造,已使得換行後文字能夠置中顯示。
先看下:
這種布局在IOS上很容易就實現了,android還的自訂一個View.
思路:在看android.text包中的源碼時,發現幾個從來沒用到的類,包括:Layout,StaticLayout,DeynamicLayout等幾個類,百度後得知這幾個類的大概作用:
這三個Layout,就是用來對android的CharSequence及其子類進行布局的,為其傳入不同的Alignment,就按照不同的Alignment去處理。代碼很簡單,只要從寫TextView即可,代碼如下:
package com.example.materialdesigndemo;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.text.Layout.Alignment;import android.text.StaticLayout;import android.text.TextPaint;import android.util.AttributeSet;import android.widget.TextView;/********************************************************** * @檔案名稱:CenterTextView.java * @檔案作者:rzq * @建立時間:2015年7月2日 上午10:12:16 * @檔案描述:換行置中顯示TextView * @修改曆史:2015年7月2日建立初始版本 **********************************************************/public class CenterTextView extends TextView{private StaticLayout myStaticLayout;private TextPaint tp;public CenterTextView(Context context, AttributeSet attrs){super(context, attrs);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh){super.onSizeChanged(w, h, oldw, oldh);initView();}private void initView(){tp = new TextPaint(Paint.ANTI_ALIAS_FLAG);tp.setTextSize(getTextSize());tp.setColor(getCurrentTextColor());myStaticLayout = new StaticLayout(getText(), tp, getWidth(), Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);}@Overrideprotected void onDraw(Canvas canvas){myStaticLayout.draw(canvas);}}使用:
代碼很簡單,基本只需要重寫onDraw()方法,讓StaticLayout的執行個體去重新處理一下即可。這樣處理後弊端就是,我們的CenterTextView只能顯示文字,無法再顯示drawableLeft等,如果需要,就需要在onDraw()方法中進行更複雜的處理。