Android踩坑日记:Android字体属性及测量(FontMetrics)
生活随笔
收集整理的這篇文章主要介紹了
Android踩坑日记:Android字体属性及测量(FontMetrics)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android字體屬性及測量(FontMetrics)
- 字體的幾個參數,以Android API文檔定義為尊,見下圖
要點如下:
為了幫助理解,我特此搜索了不同的示意圖。對照示意圖,會很容易理解FontMetrics的參數。
圖1圖2
圖3
圖4
圖5
圖6
- 測試
我們使用自定義的View和Textview里的字符串作為研究對象
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android自定义ViewGroup的
- 下一篇: Android踩坑日记:Okhttp设置