Android單位轉(zhuǎn)換----常用單位轉(zhuǎn)換工具類

前言

有一定開發(fā)經(jīng)驗(yàn)的小伙伴肯定會(huì)發(fā)現(xiàn)這樣一個(gè)問題,當(dāng)我們用xml來寫布局的時(shí)候,通常用的是dp、sp碉哑。(相信大家都知道為什么這樣用)。當(dāng)我們用Java代碼來創(chuàng)建View控件時(shí)亮蒋,會(huì)發(fā)現(xiàn)方法接收的參數(shù)都是以px為單位的扣典,當(dāng)然我們不希望直接使用px的(相信大家都知道為什么不希望使用px為單位)。這個(gè)時(shí)候大家很自然的會(huì)想到轉(zhuǎn)換一下就OK啦慎玖。dp贮尖、sp與px之間有一定的轉(zhuǎn)換公式,但每用一次就寫一次這不是程序員的風(fēng)格趁怔。所以這里就總結(jié)了一個(gè)工具類湿硝,希望可以幫助到大家。

GitHub地址

https://github.com/chaohengxing/MyUtils.git

代碼

內(nèi)容比較簡單润努,話不多說关斜,直接上代碼


/**
 * 常用單位轉(zhuǎn)換的工具類
 */
public class DensityUtils {
    private DensityUtils() {
        
    }

    /**
     * dp轉(zhuǎn)px
     * 
     * @param context
     * @return
     */
    public static int dp2px(Context context, float dpVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, context.getResources()
                .getDisplayMetrics());
    }

    /**
     * sp轉(zhuǎn)px
     * 
     * @param context
     * @return
     */
    public static int sp2px(Context context, float spVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, context.getResources()
                .getDisplayMetrics());
    }

    /**
     * px轉(zhuǎn)dp
     * 
     * @param context
     * @param pxVal
     * @return
     */
    public static float px2dp(Context context, float pxVal) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (pxVal / scale);
    }

    /**
     * px轉(zhuǎn)sp
     * 
     * @param pxVal
     * @return
     */
    public static float px2sp(Context context, float pxVal) {
        return (pxVal / context.getResources().getDisplayMetrics().scaledDensity);
    }
    /**
     * 得到屏幕寬度
     *
     * @param context
     * @return
     */
    public static int getDisplayWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 得到屏幕高度
     *
     * @param context
     * @return
     */
    public static int getDisplayHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }
}

實(shí)際上,核心內(nèi)容還是Android API里面的內(nèi)容铺浇,這里只不過是對Android API進(jìn)行了一次封裝痢畜,讓自己更容易記憶,在開發(fā)中效率更高鳍侣。

我們點(diǎn)進(jìn)去TypedValue.applyDimension();這個(gè)方法丁稀,源碼如下,源碼很清晰倚聚,相信大家一眼就能看明白线衫。

  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;
    }

補(bǔ)充

補(bǔ)充三個(gè)方法:

  • 獲取狀態(tài)欄的高度
  • 獲取當(dāng)前屏幕截圖但不包含狀態(tài)欄
  • 獲取當(dāng)前屏幕截圖包含狀態(tài)欄。

這一類代碼惑折,并不需要死記硬背授账,收集好枯跑,用的時(shí)候可以快速找到即可。

    /**
     * 獲得狀態(tài)欄的高度
     *
     * @param context
     * @return
     */
    public static int getStatusHeight(Context context) {

        int statusHeight = -1;
        try {
            Class<?> clazz = Class.forName("com.android.internal.R$dimen");
            Object object = clazz.newInstance();
            int height = Integer.parseInt(clazz.getField("status_bar_height").get(object).toString());
            statusHeight = context.getResources().getDimensionPixelSize(height);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusHeight;
    }


    /**
     * 獲取當(dāng)前屏幕截圖矗积,包含狀態(tài)欄
     *
     * @param activity
     * @return
     */
    public static Bitmap snapShotWithStatusBar(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        int width = getDisplayWidth(activity);
        int height = getDisplayHeight(activity);
        Bitmap bp = null;
        bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
        view.destroyDrawingCache();
        return bp;

    }


    /**
     * 獲取當(dāng)前屏幕截圖全肮,不包含狀態(tài)欄
     *
     * @param activity
     * @return
     */
    public static Bitmap snapShotWithoutStatusBar(Activity activity) {
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bmp = view.getDrawingCache();
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;

        int width = getDisplayWidth(activity);
        int height = getDisplayHeight(activity);
        Bitmap bp = null;
        bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return bp;

    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棘捣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌休建,老刑警劉巖乍恐,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異测砂,居然都是意外死亡茵烈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門砌些,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呜投,“玉大人,你說我怎么就攤上這事存璃÷丶觯” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵纵东,是天一觀的道長粘招。 經(jīng)常有香客問我,道長偎球,這世上最難降的妖魔是什么洒扎? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮衰絮,結(jié)果婚禮上袍冷,老公的妹妹穿的比我還像新娘。我一直安慰自己猫牡,他們只是感情好胡诗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镊掖,像睡著了一般乃戈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亩进,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天症虑,我揣著相機(jī)與錄音,去河邊找鬼归薛。 笑死谍憔,一個(gè)胖子當(dāng)著我的面吹牛匪蝙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播习贫,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼逛球,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苫昌?” 一聲冷哼從身側(cè)響起颤绕,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎祟身,沒想到半個(gè)月后奥务,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜硫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年氯葬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婉陷。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帚称,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秽澳,到底是詐尸還是另有隱情闯睹,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布肝集,位于F島的核電站瞻坝,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏杏瞻。R本人自食惡果不足惜所刀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捞挥。 院中可真熱鬧浮创,春花似錦、人聲如沸砌函。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讹俊。三九已至垦沉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仍劈,已是汗流浹背厕倍。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贩疙,地道東北人讹弯。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓况既,卻偏偏與公主長得像,于是被迫代替她去往敵國和親组民。 傳聞我的和親對象是個(gè)殘疾皇子棒仍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容