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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android踩坑日记:Android字体属性及测量(FontMetrics)

發布時間:2025/3/20 Android 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android踩坑日记:Android字体属性及测量(FontMetrics) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android字體屬性及測量(FontMetrics)

  • 字體的幾個參數,以Android API文檔定義為尊,見下圖

要點如下:

  • 基準點是baseline
  • Ascent是baseline之上至字符最高處的距離
  • Descent是baseline之下至字符最低處的距離
  • Leading文檔說的很含糊,其實是上一行字符的descent到下一行的ascent之間的距離
  • Top指的是指的是最高字符到baseline的值,即ascent的最大值
  • bottom指的是最下字符到baseline的值,即descent的最大值
  • 為了幫助理解,我特此搜索了不同的示意圖。對照示意圖,會很容易理解FontMetrics的參數。

    圖1

    圖2

    圖3

    圖4

    圖5

    圖6

    • 測試
      我們使用自定義的View和Textview里的字符串作為研究對象
    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000000"android:orientation="vertical"><!--PaintView畫字體--><video.ketu.com.fontmeasure.PaintView android:id="@+id/v_fontview"android:layout_width="match_parent"android:layout_height="1dp"android:layout_weight="1"/><!--Textview設置文字--><TextView android:id="@+id/tv_fontview1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="中國話fgiq????ú"android:textColor="@android:color/white"android:textSize="80px"android:layout_weight="1"/> </LinearLayout>

    MainActivity.class

    public class MainActivity extends AppCompatActivity {TextView textView;View paintView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);paintView = findViewById(R.id.v_fontview);textView = (TextView) findViewById(R.id.tv_fontview1);//String text = "中國話fgiq????úcqazweyghnhgd;lc,kjssnhjjomoomcod";String text = "中國話fgiq????ú";/*設置字體帶下80px*/textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,80);textView.setText(text);Paint.FontMetrics fontMetrics = textView.getPaint().getFontMetrics();Log.d("textView", "fontMetrics.top is:" + fontMetrics.top);Log.d("textView", "fontMetrics.ascent is:" + fontMetrics.ascent);Log.d("textView", "fontMetrics.descent is:" + fontMetrics.descent);Log.d("textView", "fontMetrics.bottom is:" + fontMetrics.bottom);Log.d("textView", "fontMetrics.leading is:" + fontMetrics.leading);} }

    PaintView.class

    public class PaintView extends View {private Paint mPaint = new Paint();public PaintView(Context context) {super(context);}public PaintView(Context context, AttributeSet attrs) {super(context, attrs);}public PaintView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubmPaint.reset();mPaint.setColor(Color.WHITE);/*設置字體帶下80px*/mPaint.setTextSize(80);//設置字體為斜體//mPaint.setTypeface(Typeface.create("", Typeface.ITALIC));// FontMetrics對象Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();String text = "中國話fgiq????ú";// 計算每一個坐標float textWidth = mPaint.measureText(text);float baseX = 0;float baseY = 100;float topY = baseY + fontMetrics.top;float ascentY = baseY + fontMetrics.ascent;float descentY = baseY + fontMetrics.descent;float bottomY = baseY + fontMetrics.bottom;float leading = baseY + fontMetrics.leading;Log.d("paintview", "baseX is:" + baseX);Log.d("paintview", "baseY is:" + baseY);Log.d("paintview", "fontMetrics.top is:" + fontMetrics.top);Log.d("paintview", "fontMetrics.ascent is:" + fontMetrics.ascent);Log.d("paintview", "fontMetrics.descent is:" + fontMetrics.descent);Log.d("paintview", "fontMetrics.bottom is:" + fontMetrics.bottom);Log.d("paintview", "fontMetrics.leading is:" + fontMetrics.leading);Log.d("paintview", "topY is:" + topY);Log.d("paintview", "ascentY is:" + ascentY);Log.d("paintview", "descentY is:" + descentY);Log.d("paintview", "bottomY is:" + bottomY);

    截面圖


    PaintView和TextView設置的字體大小都是80px,Log打印結果

    PaintView結果

    TextView結果


    ??????Note 1:以上可見,字體屬性類的FontMetrics類的top,ascent,descent,bottom,leading的值是正負數,是以基線baseline為0的相對值。當baseline是100時,各個參數的坐標就是正數。
    所以對于文本框的文字的行高:fontMetrics.top-fontMetrics.bottom

    ??????Note 2:以上的TextView的文本長度是單行,獲得leading=0,那么如果TextView的文本是多行,并且設置行間距后,leading的變化

    public class MainActivity extends AppCompatActivity {TextView textView;View paintView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);paintView = findViewById(R.id.v_fontview);textView = (TextView) findViewById(R.id.tv_fontview1);String text = "中國話fgiq????úcqazweyghnhgd;lc,kjssnhjjomoomcod";//String text = "中國話fgiq????ú";/*設置字體帶下80px*/textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,80);textView.setText(text);Paint.FontMetrics fontMetrics = textView.getPaint().getFontMetrics();Log.d("textView", "fontMetrics.top is:" + fontMetrics.top);Log.d("textView", "fontMetrics.ascent is:" + fontMetrics.ascent);Log.d("textView", "fontMetrics.descent is:" + fontMetrics.descent);Log.d("textView", "fontMetrics.bottom is:" + fontMetrics.bottom);Log.d("textView", "fontMetrics.leading is:" + fontMetrics.leading);} <TextViewandroid:id="@+id/tv_fontview1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="中國話fgiq????úcqazweyghnhgd;lc,kjssnhjjomoomcod"android:textColor="@android:color/white"android:lineSpacingExtra="5px"android:textSize="80px"android:layout_weight="1"/>


    截面圖

    結果Log

    Note:顯然,即使是多行,并且設置5px行距的情況下,仍不能獲得leading。

    總結

    以上是生活随笔為你收集整理的Android踩坑日记:Android字体属性及测量(FontMetrics)的全部內容,希望文章能夠幫你解決所遇到的問題。

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