欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么在Android中動態(tài)設(shè)置字體大小

本篇文章為大家展示了怎么在Android中動態(tài)設(shè)置字體大小,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、武鄉(xiāng)網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城系統(tǒng)網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為武鄉(xiāng)等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

在java代碼中取在dimens.xml中定義的值一共有三種:
  1. getDimension()

  2. getDimensionPixelOffset()

  3. getDimensionPixelSize()

getDimension()

  /**
   * Retrieve a dimensional for a particular resource ID. Unit 
   * conversions are based on the current {@link DisplayMetrics} associated
   * with the resources.
   * 
   * @param id The desired resource identifier, as generated by the aapt
   *      tool. This integer encodes the package, type, and resource
   *      entry. The value 0 is an invalid identifier.
   * 
   * @return Resource dimension value multiplied by the appropriate 
   * metric.
   */
  public float getDimension(@DimenRes int id) throws NotFoundException {   
  }

通過注釋我們不難發(fā)現(xiàn),getDimension()是根據(jù)指定id獲取一個基于當前DisplayMetrics的值。這個值究竟是什么也沒有說,只知道是float,并且單位轉(zhuǎn)換是基于當前資源的,但肯定不是像素,如果是像素應(yīng)該是int。

getDimensionPixelSize

  /**
   * Retrieve a dimensional for a particular resource ID for use
   * as a size in raw pixels. This is the same as
   * {@link #getDimension}, except the returned value is converted to
   * integer pixels for use as a size. A size conversion involves
   * rounding the base value, and ensuring that a non-zero base value
   * is at least one pixel in size.
   * 
   * @param id The desired resource identifier, as generated by the aapt
   *      tool. This integer encodes the package, type, and resource
   *      entry. The value 0 is an invalid identifier.
   * 
   * @return Resource dimension value multiplied by the appropriate 
   * metric and truncated to integer pixels.
   */
  public int getDimensionPixelSize(@DimenRes int id) throws NotFoundException {
 
  }

getDimensionPixelSize()的功能與getDimension()類似,不同的是將結(jié)果轉(zhuǎn)換為int,并且小數(shù)部分四舍五入,這個結(jié)果將作為尺寸。getDimensionPixelSize()進行了尺寸轉(zhuǎn)換,這個轉(zhuǎn)換實際是上四舍五入的結(jié)果,并且保證返回值是一個至少是1像素的非零數(shù)值。

getDimensionPixelOffset()

  /**
   * Retrieve a dimensional for a particular resource ID for use
   * as an offset in raw pixels. This is the same as
   * {@link #getDimension}, except the returned value is converted to
   * integer pixels for you. An offset conversion involves simply
   * truncating the base value to an integer.
   * 
   * @param id The desired resource identifier, as generated by the aapt
   *      tool. This integer encodes the package, type, and resource
   *      entry. The value 0 is an invalid identifier.
   * 
   * @return Resource dimension value multiplied by the appropriate 
   * metric and truncated to integer pixels.
   */
  public int getDimensionPixelOffset(@DimenRes int id) throws NotFoundException {
  }

getDimensionPixelOffset()與getDimension()功能類似,不同的是將結(jié)果轉(zhuǎn)換為int,這個結(jié)果將用作原始像素的偏移量。偏移轉(zhuǎn)換(offset conversion,函數(shù)命名中的offset是這個意思)的作用之一是將基礎(chǔ)值簡單地截短為整數(shù),注意直接截斷小數(shù)位,即取整(其實就是把float強制轉(zhuǎn)化為int,注意不是四舍五入)。

階段性總結(jié)

由此可見,這三個函數(shù)返回的都是絕對尺寸,而不是相對尺寸(dp\sp等)。如果getDimension()返回結(jié)果是30.5f,那么getDimensionPixelSize()返回結(jié)果就是31,getDimensionPixelOffset()返回結(jié)果就是30。
至此,應(yīng)該說getDimensionPixelSize() getDimension() getDimensionPixelOffset()我們已經(jīng)大致有所了解了,但是如果想更深入了解一下,就需要深入源碼以驗證上述解釋。

扒源碼

深入源碼,我們可以發(fā)現(xiàn)其實這三個函數(shù)的實現(xiàn)大同小異,以getDimension()為例:

 public float getDimension(@DimenRes int id) throws NotFoundException {
    final TypedValue value = obtainTempTypedValue();
    try {
      final ResourcesImpl impl = mResourcesImpl;
      impl.getValue(id, value, true);
      if (value.type == TypedValue.TYPE_DIMENSION) {
        return TypedValue.complexToDimension(value.data, impl.getDisplayMetrics());
      }
      throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)
          + " type #0x" + Integer.toHexString(value.type) + " is not valid");
    } finally {
      releaseTempTypedValue(value);
    }
  }

類TypedValue是動態(tài)類型數(shù)據(jù)的容器,其主要用于盛放Resources的值。上述代碼第7行就是根據(jù)id獲取TypedValue的值,getDimension()、getDimensionPixelOffset()和getDimensionPixelSize()函數(shù)體唯一的不同就是第7行:

  1. getDimension()調(diào)用的是TypedValue的complexToDimension()方法

  2. getDimensionPixelSize調(diào)用的是TypedValue的complexToDimensionPixelSize()方法

  3. getDimensionPixelOffset調(diào)用的是TypedValue的complexToDimensionPixelOffset()方法

順藤摸瓜,我們繼續(xù)深入ypedValue,查看complexToDimension()、complexToDimensionPixelSize()和complexToDimensionPixelOffset()函數(shù)的區(qū)別,會發(fā)現(xiàn)這三個函數(shù)體內(nèi)容依舊大同小異,以complexToDimension()為例:

  public static float complexToDimension(int data, DisplayMetrics metrics) {
    return applyDimension(
      (data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
      complexToFloat(data),
      metrics);
  }

complexToDimensionPixelOffset()與complexToDimension()不同的是將結(jié)果進行了強轉(zhuǎn),實際上相當直接截斷小數(shù)部分;
complexToDimensionPixelSize()是將結(jié)果進行四舍五入,并取整。這里的四舍五入實際上就是把結(jié)果加上0.5f然后進行強轉(zhuǎn)。

applyDimension()

各位看官,源碼已經(jīng)看到了這里,是否已感覺很無趣?但applyDimension()的實現(xiàn)已經(jīng)脫光了在等著你呢:

public static float applyDimension(int unit, float value,DisplayMetrics metrics) {
    switch (unit) {
    case COMPLEX_UNIT_PX:
      return value;
    case COMPLEX_UNIT_DIP:
      return value * metrics.density;
    case COMPLEX_UNIT_SP:
      return value * metrics.scaledDensity;
    case COMPLEX_UNIT_PT:
      return value * metrics.xdpi * (1.0f/72);
    case COMPLEX_UNIT_IN:
      return value * metrics.xdpi;
    case COMPLEX_UNIT_MM:
      return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
  }

在上述代碼中,我們發(fā)現(xiàn)在applyDimension()中根據(jù)單位的不同,將float乘上不同的系數(shù)。如dip/dp需乘上屏幕系數(shù),sp則需乘上字號的縮放系數(shù),pt、in、mm等也是根據(jù)相應(yīng)的算法進行換算(從COMPLEX_UNIT_PX直接返回float可以看出,該方法是將數(shù)值轉(zhuǎn)成像素數(shù))。

再次總結(jié)

通過上述探索,我們不難發(fā)現(xiàn),在Adroid并沒有在java代碼中直接獲取dimens.xml中定義的dp(dip)/sp的值的API,只有g(shù)etDimension()、getDimensionPixelOffset()和getDimensionPixelSize()這個三個方法來獲取絕對尺寸。但有時候我們確實需要動態(tài)獲取dimen.xml中的值,并為TextView設(shè)置字體大小。而這種方法直接應(yīng)用在textView.setTextSize(dimen);都是有問題的。那我們將從TextView入手,尋找一個正確的姿勢來設(shè)置字體大小。

setTextSize()

首先把代碼端上來:

 public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
  }

原來setTextSize(float)調(diào)用了他的重載方法setTextSize(int,float),并且第一個參數(shù)傳的默認值是TypedValue.COMPLEX_UNIT_SP,眼熟嗎,沒錯就是之前提到的。那么,我們繼續(xù)看看一下setTextSize(int,float)做了什么:

  public void setTextSize(int unit, float size) {
    if (!isAutoSizeEnabled()) {
      setTextSizeInternal(unit, size, true /* shouldRequestLayout */);
    }
  }

很顯然是調(diào)用了setTextSizeInternal(unit, size, true /* shouldRequestLayout */);??吹竭@累不,不過看都看了就再看看唄,說不定比蒼老師好看:

  private void setTextSizeInternal(int unit, float size, boolean shouldRequestLayout) {
    Context c = getContext();
    Resources r;
    if (c == null) {
      r = Resources.getSystem();
    } else {
      r = c.getResources();
    }
    setRawTextSize(TypedValue.applyDimension(unit, size, r.getDisplayMetrics()),shouldRequestLayout);
  }

高能?。?!TypedValue.applyDimension(unit, size, r.getDisplayMetrics())是不是很眼熟???還記得applyDimension()是怎么處理數(shù)據(jù)的嗎?

我們發(fā)現(xiàn)在applyDimension()中根據(jù)單位的不同,將float乘上不同的系數(shù)。如dip/dp需乘上屏幕系數(shù),sp則需乘上字號的縮放系數(shù),pt、in、mm等也是根據(jù)相應(yīng)的算法進行換算(從COMPLEX_UNIT_PX直接返回float可以看出,該方法是將數(shù)值轉(zhuǎn)成像素數(shù))

綜上,setTextSize(float)給傳的值的單位其實是SP,但通過getDimension()取的值卻不是這樣的。為了證實默認單位是SP,各位看官可以直接傳個16,看看和16sp是不是一樣的。所以問題是不得到了解決?

結(jié)論

Android中并不提供直接從dimens.xml獲取dp/sp數(shù)值的方法,通過getDimensionPixelSize() getDimension() getDimensionPixelOffset()獲取的值是經(jīng)過處理的。所以正確地動態(tài)設(shè)置TextView字體大小的姿勢應(yīng)該是:

int dimen = getResources().getDimensionPixelSize(R.dimen.text_size);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,dimen);

上述內(nèi)容就是怎么在Android中動態(tài)設(shè)置字體大小,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前文章:怎么在Android中動態(tài)設(shè)置字體大小
鏈接URL:http://aaarwkj.com/article38/gjjdpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、軟件開發(fā)、全網(wǎng)營銷推廣、網(wǎng)站維護網(wǎng)站收錄、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
国产精品青青在线观看爽香蕉| 国产欧美日本综合一区| 成人av免费高清在线| 蜜臀av网站在线播放| 黄色免费大片在线播放| 99久久精彩免费视频| 国产亚洲欧美日韩激情在线| 国产好大好爽在线免费观看| 亚洲男人天堂最新地址| 91看看午夜福利视频| 亚洲亚洲精品av在线动| 精品嫩模福利一区二区蜜臀| 91亚洲精品综合久久| 日韩夫妻性生活免费视频| 欧美性生活在线视频观看| 国产熟女av一区二区| 欧美一区二区三区高清正版| 天堂在线手机av观看| 日韩欧美国产成人在线观看| 麻豆视传媒短视频免费看| 亚洲熟女乱妇爽到高潮| 国产日本欧美一区二区三区| 美女呻吟被爽到高潮在线| 欧美日韩黄色的三级视频| 三级精品一区二区三区| 国产高清剧情在线观看| 91制片国产在线观看| 色婷婷av一区二区三区张| 久久五月精品综网中文字幕| 精品人妻一区二区三区不卡| 亚洲成人乱码一区二区| 国产一级成人免费视频| 我想看日韩一级黄色片| 国偷蜜桃av一区二区三区| 日本av成人激情视频| 成人高清乱码一区二区三区| 亚洲伦理在线一区二区| 国产免费不卡午夜福利在线| 丰满人妻被猛烈进入中| 色婷婷亚洲一区二区三区| 一区二区蜜桃在线观看|