❶ android 如何實現豎排文字顯示
在android.graphics.Canvas類中有個沿路徑畫字的方法
void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)
Draw the text, with origin at (x,y), using the specified paint, along the specified path.
void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
Draw the text, with origin at (x,y), using the specified paint, along the specified path.
Test.java代碼://需要在layout中定義Test,且設置背景,在java代碼中設置test Text
public class Test extends View {
private Paint paint;
private Path path;
private Matrix matrix;
private int width = -1;
private int height = -1;
private float left = 3;
private float top = 18;
private String title = "";
BitmapDrawable drawable = (BitmapDrawable) getBackground();
public Test(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setColor(Color.WHITE);//定義字體顏色
paint.setTextSize(14);//定義字體大小
path = new Path();
path.lineTo(0,500);//定義字元路徑
matrix = new Matrix();
Log.v("onMeasure", "2");
}
@Override
protected void onDraw(Canvas canvas) {
//畫背景
Bitmap b = Bitmap.createBitmap(drawable.getBitmap(),0,0,width,height);
canvas.drawBitmap(b, matrix, paint);
//畫字
showText(canvas, title);
}
private void showText(Canvas canvas, String text){
float w;
final int len = text.length();
float py = 0 + top;
for(int i=0; i<len; i ++){
char c = text.charAt(i);
w = paint.measureText(text, i, i+1);//獲取字元寬度
StringBuffer b = new StringBuffer();
b.append(c);
if(py > 81){//定義字的范圍
return;
}
if(isChinese(c)){
py += w;
if(py > 81){
return;
}
canvas.drawText(b.toString(), left, py, paint); //中文處理方法
}else {
canvas.drawTextOnPath(b.toString(), path, py, -left-2, paint);//其他文字處理方法
py += w;
}
}
}
public void setText(String title){
this.title = title;
}
public String getText(){
return title;
}
private boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
//重寫View大小方法,使view大小為背景圖片大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (null != getBackground()) {
int h = drawable.getIntrinsicHeight();
int w = drawable.getIntrinsicWidth();
Log.v("onMeasure", "null != getBackground() h:" + h + " w:" + w);
width = w;
height = h;
setMeasuredDimension(w, h);
} else {
width = widthMeasureSpec;
height = heightMeasureSpec;
super.measure(widthMeasureSpec, heightMeasureSpec);
}
}
}
在Android中,若要通過程序改變屏幕顯示的方向,必須要覆蓋setRequestedOrientation()方法,而若要取得目前的屏幕方向,則需要訪問getRequestedOrientation()方法。本範例為求簡要示範更改做法,設計了一個按鈕,當單擊按鈕的同時,判斷當下的屏幕方向,例如豎排(PORTRAIT),則將其更改為橫排(LANDSCAPE);若為橫排(LANDSCAPE),則將其更改為豎排(PORTRAIT)
❷ android canvas的drawText方法 如何設置字體大小和格式。
Canvas相當於畫布,字體的大小格式在Paint上設置才正確, Paint 相當於畫筆。代碼如下,沒有具體參數:
Paint paint = new Paint();
paint.setTextSize(textSize);//設置字體大小
paint.setTypeface(typeface);//設置字體類型
canvas.drawText(text, x, y, paint);//使用畫筆paint
@Override
public void onDraw (Canvas canvas) {
Rect targetRect = new Rect(50, 50, 1000, 200);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(3);
paint.setTextSize(80);
String testString = "測試:ijkJQKA:1234";
paint.setColor(Color.CYAN);
canvas.drawRect(targetRect, paint);
paint.setColor(Color.RED);
FontMetricsInt fontMetrics = paint.getFontMetricsInt();
(2)androiddrawtext字體擴展閱讀:
Screen Space - Camera
此模式類似Screen Space - Overlay,但區別是此模式將Canvas放置於某個Camera前固定距離。此Camera負責渲染所有UI元素,則攝像機參數(Camera Settings)直接影響UI表現。
比如Camera是透視模式(Perspective),則UI元素會基於Field of View的值而扭曲變形。同樣的,若屏幕解析度變更,或者視覺平截體(CameraFrustrum)改變,則Canvas自動調整自身尺寸作自適應。
❸ [Android][canvas中drawText繪制文字垂直方向居中]
由於要實現類似注冊表單一樣,文字作用兩端對齊的效果如下圖1,所以才有下面的內容。悄信
在canvas中,調用drawText繪畫文隱運困字的時候,希望能夠在垂直方向居中畫出文字。所以需要測量出要繪畫的文字的高。但具體來說,也不是獲取文字的高,因為如果要垂直居中畫出文字,就必須拿到文字的baseline,於是在網上搜索,找到了一篇關於獲取baseline的文章(文章鏈接在本文底部列出),感覺就是我想要的,但是基於要懷疑一切的態度,不能你說是什麼就是什麼的,實踐才是檢驗真理的唯一標准,所以下面我們來驗證一下幾個觀點。
首先可以明確,5個位置分別是灶念top,ascent,baseline,descent,bottom。這五個位置受字型大小的大小影響是毋庸置疑的,這里不再討論。這里驗證了一下字體對五個位置的影響。字型大小默認是16,字體分別是系統默認,行書,小篆,方正姚體:
這5個位置分別用5條不同顏色的橫線條展示
從效果看,字體對top,ascent,baseline,descent,bottom的位置影響並不明顯。
通過Log列印的日誌可以得出結果
結果:以baseline為基準線,向上為負,向下為正是正確的。
這個不是驗證了,說了那麼多也就是為了如何在垂直方向居中繪制文字,關鍵在於獲取baseline位置。Canvas中的drawText中繪制文字的基準線是baseline。
使得ascent到View的是上邊距與descent到View下邊距距離一致即可,此段距離加上ascent的絕對值(-ascent)即為baseline的位置。
在Canvas中使用drawText繪制垂直居中文字的關鍵在於求出baseline的位置。獲取位置的公式:
https://github.com/lgygg/MeasureHeight
http://blog.csdn.net/su1216/article/details/46900617#
❹ Android里怎麼實現TextView裡面的文字一個一個逐漸顯示出來的動畫效果
在Android開發中,如果想要實現TextView中的文字一個一個逐漸顯示出來的動畫效果,可以採用自定義控制項的方式。具體實現步驟如下:
首先,需要創建一個自定義的View類,然後在該類中重寫onDraw()方法,以便於繪制文字。這一步是必要的,因為默認的TextView並不能滿足逐字顯示文字的需求。
接著,獲取需要顯示的文字內容。這部分代碼可以放在自定義View類的構造函數中,或者在外部調用時傳入需要顯示的文字。
為了實現逐字顯示文字的效果,可以使用Handler的postDelay()方法。這個方法可以實現延遲執行某個任務。通過設置適當的時間延遲,可以讓程序在指定的時間後執行顯示文字的任務。
在自定義View的onDraw()方法中,可以使用DrawText()方法來繪制文字。通過循環調用DrawText()方法,可以實現逐字顯示的效果。每次調用DrawText()時,只顯示一部分文字,然後通過Handler的postDelay()方法設定一定的時間延遲,讓程序在指定的時間後再次調用DrawText()方法,從而實現逐字顯示的效果。
值得注意的是,為了保證文字顯示的流暢性,可以適當調整postDelay()方法中的時間延遲值。如果時間間隔設置得太短,可能會導致文字顯示不夠流暢;而如果時間間隔設置得太長,則可能會使文字顯示效果過於緩慢。
通過這種方式,可以在Android應用中實現TextView中的文字一個一個逐漸顯示出來的動畫效果。這種方式不僅能夠增強界面的美觀性,還可以提高用戶體驗。