package com.liao.intentservice;
import java.util.Arrays;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
public class AutoText extends View {
private Paint mPaint = new Paint();
public AutoText(Context context) {
this(context,null);
}
public AutoText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public AutoText(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
private void init() {
mPaint.setAntiAlias(true);
mPaint.setColor(Color.RED);
mPaint.setStyle(Style.STROKE);
mPaint.setTextSize(getRawSize(TypedValue.COMPLEX_UNIT_DIP, 15));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// setMeasuredDimension(300, 200);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//view.draw()繪製了控制項的背景
//控制項的繪製操作及順序:
/*
* Draw traversal performs several drawing steps which must be executed
* in the appropriate order:
*
* 1. Draw the background (繪製控制項設定的背景)
* 2. If necessary, save the canvas' layers to prepare for fading
* 3. Draw view's content (可以重寫, onDraw(canvas);)
* 4. Draw children (可重寫,用來分發畫布到子控制項,具體看ViewGroup。對應方法dispatchDraw(canvas);此方法依次調用了子控制項的draw()方法)
* 5. If necessary, draw the fading edges and restore layers (繪製控制項四周的陰影漸層效果)
* 6. Draw decorations (scrollbars for instance) (用來繪製捲軸,對應方法onDrawScrollBars(canvas);。
* 可以重寫onDrawHorizontalScrollBar()和onDrawVerticalScrollBar()來自訂捲軸)
*/
//可以繪製內容和捲軸。
//draw backgroud
canvas.drawColor(Color.WHITE);
//draw text
FontMetrics fm = mPaint.getFontMetrics();
float baseline = fm.descent - fm.ascent;
float x = 0;
float y = baseline; //由於系統基於字型的底部來繪製文本,所有需要加上字型的高度。
//String txt = getResources().getString("asda");
String txt = "電腦科學或相關專業領域的本科及以上學曆, 並有2年以上相關工作經驗;2、在電腦技術領域擁有紮實的技術功底,尤其在資料結構、演算法和代碼、軟體設計方面功力深厚;" +
"+3、熟悉分散式運算、網路系統設計,資料庫設計和大規模儲存系統,嫻熟的C/C++編程技巧"+
"4、熟悉HTTP協議,開發基於HTTP協議的應用;有連網應用、連網遊戲開發經驗者優先"+
"5、具備Web service/Ajax/JavaScript/Apache/Tomcat/Struts/iBatis/Spring/PHP/JSP/Python等方面經驗者優先考慮;"+
"6、熟悉TCP/IP協議,熟悉socket和多線程開發,具備高訪問量網路開發工作經驗。";
//文本自動換行
String[] texts = autoSplit(txt, mPaint, getWidth() - 5);
System.out.printf("line indexs: %s\n", Arrays.toString(texts));
for(String text : texts) {
canvas.drawText(text, x, y, mPaint); //座標以控制項左上方為原點
y += baseline + fm.leading; //添加字型行間距
}
}
/**
* 自動分割文本
* @param content 需要分割的文本
* @param p 畫筆,用來根據字型測量文本的寬度
* @param width 指定的寬度
* @return 一個字串數組,儲存每行的文本
*/
private String[] autoSplit(String content, Paint p, float width) {
int length = content.length();
float textWidth = p.measureText(content);
if(textWidth <= width) {
return new String[]{content};
}
int start = 0, end = 1, i = 0;
int lines = (int) Math.ceil(textWidth / width); //計算行數
String[] lineTexts = new String[lines];
while(start < length) {
if(p.measureText(content, start, end) > width) { //文本寬度超出控制項寬度時
lineTexts[i++] = (String) content.subSequence(start, end);
start = end;
}
if(end == length) { //不足一行的文本
lineTexts[i] = (String) content.subSequence(start, end);
break;
}
end += 1;
}
return lineTexts;
}
/**
* 擷取指定單位對應的原始大小(根據裝置資訊)
* px,dip,sp -> px
*
* Paint.setTextSize()單位為px
*
*
*
* 代碼摘自:TextView.setTextSize()
*
* @param unit TypedValue.COMPLEX_UNIT_*
* @param size
* @return
*/
public float getRawSize(int unit, float size) {
Context c = getContext();
Resources r;
if (c == null)
r = Resources.getSystem();
else
r = c.getResources();
return TypedValue.applyDimension(unit, size, r.getDisplayMetrics());
}
}
摘自 android小益的專欄