日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Canvas的drawText()和文字居中方案

發布時間:2023/12/13 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Canvas的drawText()和文字居中方案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自定義View是繪制文本有三類方法:

// 第一類 public void drawText (String text, float x, float y, Paint paint) public void drawText (String text, int start, int end, float x, float y, Paint paint) public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint) public void drawText (char[] text, int index, int count, float x, float y, Paint paint)// 第二類 public void drawPosText (String text, float[] pos, Paint paint) public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)// 第三類 public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint) public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

說明:

  • drawText():最常用
  • drawPosText():是根據一個個坐標點指定文字位置
  • drawTextOnPath():是根據路徑繪制。

其中drawText()的x,y參數是干嘛的呢?


先來看下下面這段代碼的運行效果:

@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint=new Paint();paint.setStyle(Paint.Style.FILL);paint.setStrokeWidth(12);paint.setTextSize(100);String text="測試:my text";canvas.drawText(text, 200, 400, paint);//畫兩條線標記位置paint.setStrokeWidth(4);paint.setColor(Color.RED);canvas.drawLine(0, 400, 2000, 400, paint);paint.setColor(Color.BLUE);canvas.drawLine(200, 0, 200, 2000, paint); }

左對齊-left

可以看到,x,y并不是指定文字的中點位置,并且x,y與文字對齊方式有關(通過setTextAlign()指定,默認為left)


居中對齊-center

右對齊-right

注:為了使文字完整,上面調整了下x,y的值。


從上面三種情況得出結論,x所對應的豎線:

  • 左對齊 — 文字的左邊界
  • 居中對齊 — 文字的中心位置
  • 右對齊 — 文字的左邊界

y對應的橫線并不是文字的下邊界,而是基準線Baseline



  • Top:文字的最頂部
  • Baseline:基準線
  • Bottom:文字的底部

那這些值如何獲取呢?

Paint.FontMetrics fontMetrics=paint.getFontMetrics();fontMetrics.topfontMetrics.ascentfontMetrics.descentfontMetrics.bottom

記得要在設置完Paint的文字大小,寬度之類屬性后再獲取FontMetrics,Baseline對應對應值為0,在它下面的descent和bottom值為正,top和ascent為負。

那文字的高度為: bottom - top


所以,實際繪制的時候取決于基線上一個點來繪制文字,而這個點有三種分別對應為left,center,right。


好啦,把drawText()中x,y參數講清楚后實現文字居中就很容易了。

直接上代碼:

@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);//矩形背景Paint bgRect=new Paint();bgRect.setStyle(Paint.Style.FILL);bgRect.setColor(Color.YELLOW);RectF rectF=new RectF(200, 200, 800, 600);canvas.drawRect(rectF, bgRect);Paint textPaint=new Paint();textPaint.setStyle(Paint.Style.FILL);textPaint.setStrokeWidth(8);textPaint.setTextSize(50);textPaint.setTextAlign(Paint.Align.CENTER);String text="測試:my text";//計算baselinePaint.FontMetrics fontMetrics=textPaint.getFontMetrics();float distance=(fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom;float baseline=rectF.centerY()+distance;canvas.drawText(text, rectF.centerX(), baseline, textPaint); }

效果:

將對齊方式設置為center,那要讓文字居中顯示,x值就為矩形中心x值,y值也就是Baseline的計算看下圖:

y = 矩形中心y值 + 矩形中心與基線的距離

距離 = 文字高度的一半 - 基線到文字底部的距離(也就是bottom)= (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom

總結

以上是生活随笔為你收集整理的Android Canvas的drawText()和文字居中方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。