Chuyển đổi pixel sang dp


827

Tôi đã tạo ứng dụng của mình với chiều cao và chiều rộng được tính bằng pixel cho thiết bị Pantech có độ phân giải 480x800.

Tôi cần chuyển đổi chiều cao và chiều rộng cho thiết bị G1.
Tôi nghĩ chuyển đổi nó thành dp sẽ giải quyết vấn đề và cung cấp cùng một giải pháp cho cả hai thiết bị.

Có cách nào dễ dàng để chuyển đổi pixel sang dp không?
Bất kỳ đề xuất?


1
Nếu bạn đang tìm cách thực hiện chuyển đổi một lần (ví dụ để xuất các họa tiết từ Photoshop), thì đây là một trình chuyển đổi tiện lợi .
Paul Lammertsma


Câu trả lời:


1037
// Converts 14 dip into its equivalent px
float dip = 14f;
Resources r = getResources();
float px = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP,
    dip,
    r.getDisplayMetrics()
);

332
Lưu ý: Trên đây là chuyển đổi các DIP thành Pixels. Câu hỏi ban đầu hỏi làm thế nào để chuyển đổi pixel thành Dips!
Eurig Jones

12
Đây là câu trả lời thực sự cho OP: stackoverflow.com/questions/6656540/ cấp
qix

119
Thật buồn cười khi câu trả lời hữu ích hơn khi nó không thực sự trả lời câu hỏi -_- Tôi nghĩ tôi muốn những gì câu hỏi được hỏi thì tôi nhận ra mình đã không làm! Vì vậy, câu trả lời tuyệt vời. Tôi có một câu hỏi. Làm thế nào tôi có thể có được thông số cuối cùng cho applyDimension? Tôi chỉ có thể làm getResource().getDisplayMetrics(), hoặc có cái gì khác?
Andy

11
LƯU Ý: hoạt động tương đối tốn kém. Cố gắng lưu trữ các giá trị để tăng tốc nhanh hơn
Entreco

8
Nếu không có quyền truy cập vào Contextđối tượng sử dụngResources.getSystem().getDisplayMetrics()
Farshad Tahmasbi

871
/**
 * This method converts dp unit to equivalent pixels, depending on device density. 
 * 
 * @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent px equivalent to dp depending on device density
 */
public static float convertDpToPixel(float dp, Context context){
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

/**
 * This method converts device specific pixels to density independent pixels.
 * 
 * @param px A value in px (pixels) unit. Which we need to convert into db
 * @param context Context to get resources and device specific display metrics
 * @return A float value to represent dp equivalent to px value
 */
public static float convertPixelsToDp(float px, Context context){
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

8
Có thể đáng để trả về một int Math.round (px) vì hầu hết các phương thức đều mong đợi một giá trị nguyên
Raj Labana 7/07/2015

3
@MuhammadBabar Điều này là do 160 dpi (mdpi) là giá trị cơ bản mà từ đó các mật độ khác được tính toán. Ví dụ, hdpi được coi là 1,5 lần mật độ của mdpi, đây thực sự chỉ là một cách khác để nói 240 dpi. Xem câu trả lời của Zsolt Safrany dưới đây cho tất cả các mật độ.
Stephen

19
@TomTasche: Từ các tài liệu cho Resource.getSystem()(nhấn mạnh của tôi): "Trả về một đối tượng Tài nguyên được chia sẻ toàn cầu chỉ cung cấp quyền truy cập vào tài nguyên hệ thống (không có tài nguyên ứng dụng) và không được định cấu hình cho màn hình hiện tại ( không thể sử dụng đơn vị thứ nguyên , không thay đổi dựa trên định hướng, v.v.). "
Vicky Chijwani

2
Nhà phát triển có một sự lựa chọn để trần / sàn giá trị. Nó là tốt hơn để cung cấp kiểm soát cho nhà phát triển.
Muhammad Nabeel Arif

7
Tôi sẽ giới thiệu và DisplayMetrics.DENSITY_DEFAULTthay vì 160f developer.android.com/reference/android/util/ từ
milcaepsilon

285

Tốt nhất là đặt trong một lớp Util.java

public static float dpFromPx(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

public static float pxFromDp(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}

5
Điều này không hoạt động trên tất cả các thiết bị! Kết quả của câu trả lời này so với việc sử dụng TypedValue.applyDimension không giống nhau trên OnePlus 3T (có lẽ vì OnePlus có tỷ lệ tùy chỉnh được tích hợp trong HĐH). Sử dụng TypedValue.applyDimension gây ra hành vi nhất quán trên các thiết bị.
Ben De La Haye

197
float density = context.getResources().getDisplayMetrics().density;
float px = someDpValue * density;
float dp = somePxValue / density;

density bằng

  • .75trên ldpi( 120dpi)
  • 1.0trên mdpi( 160dpi; đường cơ sở)
  • 1.5trên hdpi( 240dpi)
  • 2.0trên xhdpi( 320dpi)
  • 3.0trên xxhdpi( 480dpi)
  • 4.0trên xxxhdpi( 640dpi)

Sử dụng trình chuyển đổi trực tuyến này để chơi xung quanh với các giá trị dpi.

EDIT: Dường như không có mối quan hệ 1: 1 giữa dpixô và density. Có vẻ như bản Nexus 5Xthể xxhdpidensitygiá trị 2.625(thay vì 3). Xem cho chính mình trong Số liệu thiết bị .


3
"Có vẻ như Nexus 5X là xxhdpi có giá trị mật độ là 2,6 (thay vì 3)" - Về mặt kỹ thuật, Nexus 5X là 420dpi và Nexus 6 / 6P là 560dpi, không rơi trực tiếp vào một trong các thùng tiêu chuẩn, giống như Nexus 7 với tvdpi (213dpi). Vì vậy, trang web liệt kê những cái đó là xxdpi và xxxhdpi là một trò hề. Biểu đồ của bạn là chính xác và các thiết bị đó sẽ chia tỷ lệ chính xác dựa trên một thùng dpi "đặc biệt" của chúng.
Steven Byle

108

Bạn có thể sử dụng cái này .. không có ngữ cảnh

public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

Như @Stan đã đề cập .. sử dụng phương pháp này có thể gây ra sự cố nếu hệ thống thay đổi mật độ. Vì vậy, hãy nhận thức về điều đó!

Cá nhân tôi đang sử dụng Bối cảnh để làm điều đó. Đó chỉ là một cách tiếp cận khác mà tôi muốn chia sẻ với bạn


11
Bạn có thể không muốn sử dụng này. Tài liệu cho getSystem () - "Trả về một đối tượng Tài nguyên được chia sẻ toàn cầu chỉ cung cấp quyền truy cập vào tài nguyên hệ thống (không có tài nguyên ứng dụng) và không được định cấu hình cho màn hình hiện tại (không thể sử dụng đơn vị thứ nguyên, không thay đổi dựa trên hướng, v.v.) . "
Stan

Phân biệt những gì @Stan đang nói: điều này rất nguy hiểm và bạn không nên sử dụng nó, đặc biệt là bây giờ khi các yếu tố hình thức thiết bị đang trở nên quá phức tạp.
Saket

93

Nếu bạn có thể sử dụng các kích thước XML thì rất đơn giản!

Trong của bạn res/values/dimens.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="thumbnail_height">120dp</dimen>
    ...
    ...
</resources>

Sau đó, trong Java của bạn:

getResources().getDimensionPixelSize(R.dimen.thumbnail_height);

Vì px đến dp phụ thuộc vào mật độ màn hình, tôi không biết làm thế nào OP có 120 ở vị trí đầu tiên, trừ khi người đó đã thử nghiệm phương pháp px to dp trên tất cả các kích thước màn hình khác nhau.
John61590

75

Theo Hướng dẫn phát triển Android:

px = dp * (dpi / 160)

Nhưng thường thì bạn sẽ muốn thực hiện điều này theo cách khác khi bạn nhận được một thiết kế được ghi bằng pixel. Vì thế:

dp = px / (dpi / 160)

Nếu bạn đang sử dụng thiết bị 240dpi thì tỷ lệ này là 1,5 (như đã nêu trước đây), vì vậy điều này có nghĩa là biểu tượng 60px tương đương 40dp trong ứng dụng.



7
160 là không đổi, câu trả lời trên giường
dùng25

2
@ user25 Câu trả lời tuyệt vời thực sự. Bạn chưa đọc tài liệu nào trên màn hình Android phải không? 160 là một hằng số phổ biến ở mọi nơi khi nói về mật độ màn hình Android. Trích dẫn từ các tài liệu: "màn hình mật độ trung bình (mdpi) (~ 160dpi). (Đây là mật độ cơ sở)". Thôi nào, anh bạn
mykolaj

70

Không có Context, phương thức tĩnh thanh lịch:

public static int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

public static int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

24
Resources.getSystem()javadoc nói "Trả về một đối tượng Tài nguyên được chia sẻ toàn cầu chỉ cung cấp quyền truy cập vào tài nguyên hệ thống (không có tài nguyên ứng dụng) và không được định cấu hình cho màn hình hiện tại (không thể sử dụng đơn vị thứ nguyên, không thay đổi dựa trên định hướng, v.v.)." Điều này khá nhiều nói rằng bạn không nên làm điều này ngay cả khi nó bằng cách nào đó hoạt động.
Austyn Mahoney

Tôi mới đọc bình luận của @ AustynMahoney và nhận ra câu trả lời này không tuyệt vời như tôi nghĩ ban đầu, nhưng SO sẽ không để tôi hoàn tác lại ! Argh!
Vicky Chijwani

45

Dành cho DP to Pixel

Tạo một giá trị trong dimens.xml

<dimen name="textSize">20dp</dimen>

Nhận giá trị đó pixeldưới dạng:

int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.textSize);

39

Do đó, bạn có thể sử dụng công thức sau để tính toán lượng pixel phù hợp từ thứ nguyên được chỉ định trong dp

public int convertToPx(int dp) {
    // Get the screen's density scale
    final float scale = getResources().getDisplayMetrics().density;
    // Convert the dps to pixels, based on density scale
    return (int) (dp * scale + 0.5f);
}

4
Điều này chuyển đổi dp thành pixel nhưng bạn đã gọi phương thức của mình convertToDp.
Qwertie

4
+ 0,5f được giải thích tại đây -> developer.android.com/guide/practices/ ,. Nó được sử dụng để làm tròn đến số nguyên gần nhất.
Bae

Câu trả lời đúng duy nhất. bạn có thể thêm nhà phát triển
nguồn.android.com/guide/practices/ trên

web.archive.org/web/20140808234241/http://developer.android.com/ cho một liên kết vẫn có nội dung được đề cập
caw

39

Đối với bất cứ ai sử dụng Kotlin:

val Int.toPx: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

val Int.toDp: Int
    get() = (this / Resources.getSystem().displayMetrics.density).toInt()

Sử dụng:

64.toPx
32.toDp

Từ các tài liệu cho Resource.getSystem (): "Trả về một đối tượng Tài nguyên được chia sẻ toàn cầu chỉ cung cấp quyền truy cập vào tài nguyên hệ thống (không có tài nguyên ứng dụng) và không được định cấu hình cho màn hình hiện tại (không thể sử dụng đơn vị thứ nguyên, không thay đổi dựa trên định hướng, v.v.). "
HendraWD

@HendraWD Các tài liệu có thể gây nhầm lẫn, các đơn vị kích thước mà nó đang đề cập là cấp ứng dụng của bạn làm giảm tài nguyên. displayMetrics không phải là tài nguyên cấp ứng dụng. Nó là một tài nguyên hệ thống và nó trả về các giá trị chính xác. Mã này đang hoạt động tốt trên tất cả các ứng dụng Prod của tôi. Không bao giờ có vấn đề.
Gunhan

33

Có một ứng dụng mặc định trong SDK Android: http://developer.android.com/reference/android/util/TypedValue.html

float resultPix = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())

Bạn nên sử dụng cái này Như một phần thưởng, nó cũng sẽ làm SP.
Đánh dấu Renouf

2
resultPixnên thuộc kiểu int. int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
vovahost

27

sử dụng phần mở rộng kotlin làm cho nó tốt hơn

fun Int.toPx(context: Context): Int = (this * context.resources.displayMetrics.density).toInt()

fun Int.toDp(context: Context): Int = (this / context.resources.displayMetrics.density).toInt()

CẬP NHẬT:

Do displayMetricslà một phần của Tài nguyên được chia sẻ toàn cầu , chúng tôi có thể sử dụngResources.getSystem()

fun Int.toPx(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()

fun Int.toDp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()

4
Tại sao bạn lại thêm nó dưới dạng phần mở rộng của Int, trách nhiệm không phải làm bất cứ điều gì với loại Int.
htafoya

19

Điều này sẽ cung cấp cho bạn chuyển đổi dp thành pixel:

public static int dpToPx(int dp)
{
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

Điều này sẽ cung cấp cho bạn các pixel chuyển đổi thành dp:

public static int pxToDp(int px)
{
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

19

Kotlin

fun convertDpToPixel(dp: Float, context: Context): Float {
    return dp * (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

fun convertPixelsToDp(px: Float, context: Context): Float {
    return px / (context.resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)
}

Java

public static float convertDpToPixel(float dp, Context context) {
    return dp * ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

public static float convertPixelsToDp(float px, Context context) {
    return px / ((float) context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

12

Có lẽ cách tốt nhất nếu bạn có thứ nguyên bên trong các giá trị / giảm là lấy kích thước trực tiếp từ phương thức getDimension (), nó sẽ trả về cho bạn thứ nguyên đã được chuyển đổi thành giá trị pixel.

context.getResources().getDimension(R.dimen.my_dimension)

Chỉ để giải thích rõ hơn về điều này,

getDimension(int resourceId) 

sẽ trả về kích thước đã được chuyển đổi thành pixel AS A FLOAT.

getDimensionPixelSize(int resourceId)

sẽ trả lại như cũ nhưng bị cắt cụt thành int, vì vậy NHƯ MỘT INTEGER.

Xem tài liệu tham khảo Android


9
Để chuyển đổi dp thành pixel.
public static int dp2px(Resources resource, int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,   dp,resource.getDisplayMetrics());
}
Để chuyển đổi pixel sang dp.
  public static float px2dp(Resources resource, float px)  {
    return (float) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px,resource.getDisplayMetrics());
}

trong đó tài nguyên là bối cảnh.getResource ().


8
Câu trả lời là sai, vì bạn không chuyển đổi pixel thành dp - bạn đang chuyển đổi pixel thành pixel!
Yar Tư

Px2dp sai - sẽ trả về cùng giá trị tính bằng pixel.
natario

8

như thế này:

public class ScreenUtils {

    public static float dpToPx(Context context, float dp) {
        if (context == null) {
            return -1;
        }
        return dp * context.getResources().getDisplayMetrics().density;
    }

    public static float pxToDp(Context context, float px) {
        if (context == null) {
            return -1;
        }
        return px / context.getResources().getDisplayMetrics().density;
    }
}

phụ thuộc vào Bối cảnh, trả về giá trị float, phương thức tĩnh

từ: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15


8

Cách tiếp cận thanh lịch hơn bằng cách sử dụng chức năng mở rộng của kotlin

/**
 * Converts dp to pixel
 */
val Int.dpToPx: Int get() = (this * Resources.getSystem().displayMetrics.density).toInt()

/**
 * Converts pixel to dp
 */
val Int.pxToDp: Int get() = (this / Resources.getSystem().displayMetrics.density).toInt()

Sử dụng:

println("16 dp in pixel: ${16.dpToPx}")
println("16 px in dp: ${16.pxToDp}")

Yêu việc sử dụng phần mở rộng ở đây. Tôi đọc các hàm là "convert to function name" mà tôi nhận ra là ngược trong trường hợp này. Để làm rõ ý định của từng chức năng, tên của các chức năng có thể được cập nhật để đọc dpToPx và pxToDp tương ứng.
Maxwell

Từ các tài liệu cho Resource.getSystem (): "Trả về một đối tượng Tài nguyên được chia sẻ toàn cầu chỉ cung cấp quyền truy cập vào tài nguyên hệ thống (không có tài nguyên ứng dụng) và không được định cấu hình cho màn hình hiện tại (không thể sử dụng đơn vị thứ nguyên, không thay đổi dựa trên định hướng, v.v.). "
HendraWD

7
float scaleValue = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scaleValue + 0.5f);

2
Đây có phải không giống như những gì được đề cập trong nhiều câu trả lời khác cho câu hỏi này không?
TZHX

7

Trong trường hợp bạn phát triển một ứng dụng quan trọng về hiệu năng, vui lòng xem xét lớp được tối ưu hóa sau:

public final class DimensionUtils {

    private static boolean isInitialised = false;
    private static float pixelsPerOneDp;

    // Suppress default constructor for noninstantiability.
    private DimensionUtils() {
        throw new AssertionError();
    }

    private static void initialise(View view) {
        pixelsPerOneDp = view.getResources().getDisplayMetrics().densityDpi / 160f;
        isInitialised = true;
    }

    public static float pxToDp(View view, float px) {
        if (!isInitialised) {
            initialise(view);
        }

        return px / pixelsPerOneDp;
    }

    public static float dpToPx(View view, float dp) {
        if (!isInitialised) {
            initialise(view);
        }

        return dp * pixelsPerOneDp;
    }
}

Nó chỉ có ý nghĩa nếu bạn thực hiện chuyển đổi thực sự thường xuyên. Trong trường hợp của tôi, tôi làm.
Pavel

160f là gì? Tại sao bạn sử dụng nó, tại sao nó là 160?
dephinera

160 => 160dpi và đây là để chuyển đổi các biện pháp vì công thức
xAqweRx

6

để chuyển đổi Pixels sang dp, hãy sử dụng TypedValue .

Như tài liệu đã đề cập: Container cho một giá trị dữ liệu được gõ động.

và sử dụng phương thức applicationDimension :

public static float applyDimension (int unit, float value, DisplayMetrics metrics) 

mà Chuyển đổi một giá trị dữ liệu phức tạp chưa được đóng gói giữ một thứ nguyên thành giá trị dấu phẩy động cuối cùng của nó như sau:

Resources resource = getResources();
float dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 69, resource.getDisplayMetrics());

Mong rằng sẽ giúp.


6

Đây là cách nó hoạt động với tôi:

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int  h = displaymetrics.heightPixels;
float  d = displaymetrics.density;
int heightInPixels=(int) (h/d);

Bạn có thể làm tương tự cho chiều rộng.



4

Bạn nên sử dụng dp giống như pixel của bạn. Đó là tất cả những gì họ đang có; hiển thị pixel độc lập. Sử dụng cùng một số bạn có trên màn hình mật độ trung bình và kích thước sẽ chính xác một cách kỳ diệu trên màn hình mật độ cao.

Tuy nhiên, có vẻ như những gì bạn cần là tùy chọn fill_parent trong thiết kế bố trí của bạn. Sử dụng fill_parent khi bạn muốn chế độ xem hoặc điều khiển của mình mở rộng sang tất cả các kích thước còn lại trong vùng chứa chính.


thực sự vấn đề của tôi là ứng dụng của tôi được mã hóa cho màn hình mật độ cao và bây giờ nó cần được chuyển đổi sang màn hình mật độ thấp ..
Indhu

sửa đổi pixel của bạn cho màn hình mật độ trung bình (bạn có thể thiết lập màn hình mật độ trung bình trong trình giả lập) và thay thế pixel bằng dp. Tuy nhiên, các ứng dụng linh hoạt hơn có thể được thực hiện bằng cách sử dụng fill_parent và nhiều bố cục.
Michael Lowman

Cuối cùng, tôi không có lựa chọn nào khác ngoài việc thay đổi tất cả px thành dp bằng tay .. :(
Indhu

1
Ít nhất là lần tới bạn sẽ sử dụng dp trước và sẽ không phải thay đổi gì cả :) Mặc dù có thể sử dụng bố cục không yêu cầu định vị tuyệt đối cho hầu hết mọi thứ.
Michael Lowman

Vì đó là ứng dụng đầu tiên của tôi .. tôi đã mắc lỗi này ... tôi sẽ không bao giờ làm lại ... :)
Indhu

4

PXDPkhác nhau nhưng tương tự nhau.

DPlà độ phân giải khi bạn chỉ tính đến kích thước vật lý của màn hình. Khi bạn sử dụng, DPnó sẽ mở rộng bố cục của bạn sang các màn hình có kích thước tương tự khác với pixelmật độ khác nhau .

Đôi khi bạn thực sự muốn pixels, và khi bạn xử lý các kích thước trong mã, bạn luôn luôn xử lý thực pixels, trừ khi bạn chuyển đổi chúng.

Vì vậy, trên một thiết bị Android, hdpimàn hình kích thước bình thường , 800x480 is 533x320trong DP(tôi tin). Để chuyển đổi DPthành pixels /1.5, để chuyển đổi trở lại *1.5. Điều này chỉ dành cho một kích thước màn hình và dpi, nó sẽ thay đổi tùy theo thiết kế. Các nghệ sĩ của chúng tôi cho tôi pixelsmặc dù và tôi chuyển đổi DPvới 1.5phương trình trên .


3

Nếu bạn muốn các giá trị Integer thì sử dụng Math.round () sẽ làm tròn số float đến số nguyên gần nhất.

public static int pxFromDp(final float dp) {
        return Math.round(dp * Resources.getSystem().getDisplayMetrics().density);
    }

3

Câu trả lời tốt nhất đến từ chính khung Android: chỉ cần sử dụng sự bình đẳng này ...

public static int dpToPixels(final DisplayMetrics display_metrics, final float dps) {
    final float scale = display_metrics.density;
    return (int) (dps * scale + 0.5f);
}

(chuyển đổi dp thành px)


2

Công việc này đối với tôi (C #):

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);

Không phải là một câu trả lời cho câu hỏi này nhưng đối với C # nó hoạt động. Cảm ơn
Yekmer Simsek

2

kotlin

   fun spToPx(ctx: Context, sp: Float): Float {
    return sp * ctx.resources.displayMetrics.scaledDensity
}

fun pxToDp(context: Context, px: Float): Float {
    return px / context.resources.displayMetrics.density
}

fun dpToPx(context: Context, dp: Float): Float {
    return dp * context.resources.displayMetrics.density
}

java

   public static float spToPx(Context ctx,float sp){
    return sp * ctx.getResources().getDisplayMetrics().scaledDensity;
}

public static float pxToDp(final Context context, final float px) {
    return px / context.getResources().getDisplayMetrics().density;
}

public static float dpToPx(final Context context, final float dp) {
    return dp * context.getResources().getDisplayMetrics().density;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.