DensityUtil【尺寸轉換工具類(px、dp互相轉換)】


版權聲明:本文為HaiyuKing原創文章,轉載請注明出處!

前言

用於項目中dp、px、sp之間的轉換以及指定縮放值下的轉換。

效果圖

暫不需要

代碼分析

常用的方法是px2dip、dip2px;

px2dipRatio、dip2pxRatio方法的應用場景可以理解為一個占滿全屏的控件,要求等比例縮放顯示到占原屏幕0.95的容器中。此時,可以考慮 使用這兩個方法對這個控件的寬度和高度值進行等比例縮放。

使用步驟

一、項目組織結構圖

注意事項:

1、導入類文件后需要change包名以及重新import R文件路徑

2、Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制里面的內容,不要整個覆蓋

二、導入步驟

 將DensityUtil文件復制到項目中即可。

package com.why.project.densityutildemo.util;

import android.content.Context;
import android.util.DisplayMetrics;

/**
 * Used 尺寸轉換工具類(全)
 */
public class DensityUtil {
    public static float RATIO = 0.95F;//縮放比例值

    /**
     * px 轉 dp【按照一定的比例】*/
    public static int px2dipRatio(Context context, float pxValue) {
        float scale = getScreenDendity(context) * RATIO;
        return (int)((pxValue / scale) + 0.5f);
    }

    /**
     * dp轉px【按照一定的比例】*/
    public static int dip2pxRatio(Context context, float dpValue) {
        float scale = getScreenDendity(context) * RATIO;
        return (int)((dpValue * scale) + 0.5f);
    }

    /**
     * px 轉 dp
     * 48px - 16dp
     * 50px - 17dp*/
    public static int px2dip(Context context, float pxValue) {
        float scale = getScreenDendity(context);
        return (int)((pxValue / scale) + 0.5f);
    }

    /**
     * dp轉px
     * 16dp - 48px
     * 17dp - 51px*/
    public static int dip2px(Context context, float dpValue) {
        float scale = getScreenDendity(context);
        return (int)((dpValue * scale) + 0.5f);
    }

    /**獲取屏幕的寬度(像素)*/
    public static int getScreenWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;//1080
    }

    /**獲取屏幕的寬度(dp)*/
    public static int getScreenWidthDp(Context context) {
        float scale = getScreenDendity(context);
        return (int)(context.getResources().getDisplayMetrics().widthPixels / scale);//360
    }

    /**獲取屏幕的高度(像素)*/
    public static int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;//1776
    }

    /**獲取屏幕的高度(像素)*/
    public static int getScreenHeightDp(Context context) {
        float scale = getScreenDendity(context);
        return (int)(context.getResources().getDisplayMetrics().heightPixels / scale);//592
    }
    /**屏幕密度比例*/
    public static float getScreenDendity(Context context){
        return context.getResources().getDisplayMetrics().density;//3
    }

    /**獲取狀態欄的高度 72px
     * http://www.2cto.com/kf/201501/374049.html*/
    public static int getStatusBarHeight(Context context) {
        int statusHeight = -1;
        try {
            Class<?> aClass = Class.forName("com.android.internal.R$dimen");
            Object object = aClass.newInstance();
            int height = Integer.parseInt(aClass.getField("status_bar_height").get(object).toString());
            statusHeight = context.getResources().getDimensionPixelSize(height);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return statusHeight;

        //依賴於WMS(窗口管理服務的回調)【不建議使用】
        /*Rect outRect = new Rect();
        ((Activity)context).getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
        return outRect.top;*/
    }

    /**
     * 指定機型(displayMetrics.xdpi)下dp轉px
     * 18dp - 50px*/
    public static int dpToPx(Context context, int dp) {
        return Math.round(((float)dp * getPixelScaleFactor(context)));
    }

    /**
     * 指定機型(displayMetrics.xdpi)下px 轉 dp
     * 50px - 18dp*/
    public static int pxToDp(Context context, int px) {
        return Math.round(((float)px / getPixelScaleFactor(context)));
    }

    /**獲取水平方向的dpi的密度比例值
     * 2.7653186*/
    public static float getPixelScaleFactor(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        return (displayMetrics.xdpi / 160.0f);
    }
}

三、使用方法

package com.why.project.densityutildemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.why.project.densityutildemo.util.DensityUtil;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
    }

    private void initData(){
        /**====================================DensityUtil========================================*/
        int screenWidth = DensityUtil.getScreenWidth(this); int screenHeight = DensityUtil.getScreenHeight(this);
        Log.w(TAG,"screenWidth="+screenWidth);
        Log.w(TAG,"screenHeight="+screenHeight);

        int dp = DensityUtil.px2dip(this,50); int px = DensityUtil.dip2px(this,dp);
        Log.w(TAG,"dp="+dp);
        Log.w(TAG,"px="+px);

        DensityUtil.RATIO = 0.95f; int dpRatio = DensityUtil.px2dipRatio(this,50); int pxRatio = DensityUtil.dip2pxRatio(this,dpRatio);
        Log.w(TAG,"dpRatio="+dpRatio);
        Log.w(TAG,"pxRatio="+pxRatio);

        int statusBarHeight = DensityUtil.getStatusBarHeight(this);
        Log.w(TAG,"barHeight="+statusBarHeight);
    }
}

打印日志如下:

 

混淆配置

參考資料

Andorid獲取狀態欄高度

http://www.2cto.com/kf/201501/374049.html

項目demo下載地址

https://github.com/haiyuKing/DensityUtilDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM