setWidth (int พิกเซล) ใช้ dip หรือ px หรือไม่


95

setWidth (พิกเซล int) ใช้พิกเซลอิสระของอุปกรณ์หรือพิกเซลทางกายภาพเป็นหน่วยหรือไม่ ตัวอย่างเช่น setWidth (100) ตั้งค่าความกว้างของมุมมองเป็น 100 dips หรือ 100 px หรือไม่

ขอบคุณ.

คำตอบ:


222

ใช้พิกเซล แต่ฉันแน่ใจว่าคุณสงสัยว่าจะใช้ dips แทนได้อย่างไร TypedValue.applyDimension()คำตอบคือใน นี่คือตัวอย่างวิธีการแปลง dips เป็น px ในโค้ด:

// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));

64
คุณยังสามารถเรียกใช้ nbDips * getResources () getDisplayMetrics () ความหนาแน่น
Romain Guy

9
ในความเป็นจริงนั่นคือสิ่งที่ TypedValue.applyDimension () ทำ ฉันคิดว่าจะโพสต์สิ่งนั้น แต่ฉันชอบที่จะผ่าน API ในกรณีที่มีอะไรเปลี่ยนแปลง ... แม้ว่าฉันคิดว่ามันปลอดภัยที่จะใช้วิธีนั้นถ้าคุณยอม :)
Dan Lew

12
รุ่น applyDimension () รันโค้ดมากขึ้นและหาอ่านยากกว่าเล็กน้อย FWIW บรรทัดที่ฉันโพสต์คือสิ่งที่เราใช้จริงในกรอบงานและแอปมาตรฐาน
Romain Guy

1
สวัสดีฉันลองสองตัวอย่างข้างต้นแล้วและดูเหมือนจะคำนวณพิกเซลไม่ถูกต้อง แต่กลับเป็นค่าที่แน่นอนที่ฉันระบุในมุมมองของฉัน: android: layout_width = "50dip" ในกรณีของฉัน มันจะส่งคืนค่าที่แน่นอนในไฟล์ xml ให้ฉัน 50 จากนั้นฉันตรวจสอบสิ่งนี้ในแอพและตามที่คาดไว้ค่าไม่ถูกต้องและดึงมุมมองที่ใหญ่เกินไปที่คาดไว้
Jonathan

ทางออกเดียวที่ฉันพบสำหรับการแปลง px เป็น pt ดีมาก
A-Live

24

วิธีที่ถูกต้องในการรับจำนวน DIP ในโค้ดคงที่คือการสร้างไฟล์ XML ของรีซอร์สที่มีค่า dp เช่น:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="image_width">100dp</dimen>
    <dimen name="image_height">75dp</dimen>
</resources>

จากนั้นอ้างถึงทรัพยากรในรหัสของคุณดังนี้:

float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));

โฟลตที่คุณส่งคืนจะถูกปรับขนาดตามความหนาแน่นของพิกเซลของอุปกรณ์ดังนั้นคุณจึงไม่จำเป็นต้องจำลองวิธีการแปลงซ้ำตลอดแอปพลิเคชันของคุณ


ในสถานการณ์ของฉันโซลูชันนี้ทำงานได้ดีที่สุดเมื่อฉันมีกล่องโต้ตอบแบบกำหนดเองซึ่งมีมุมมองรายการและต้องการตั้งค่าความกว้างของป้ายชื่อส่วนหัวและคอลัมน์ใน ListView ให้มีความกว้างเท่ากัน
Wayne Phipps

ประโยคแรกของคุณคือนะตลก, คุณมีพื้นบอกว่าการสร้างไฟล์ XML เป็นวิธีที่เหมาะสมในการ"ระบุ [บางสิ่งบางอย่าง] ในรหัส" ฉันคิดว่าคุณแค่ใช้ค่าคงที่ในรหัสไม่ได้ระบุ :)
Joffrey

@ Joffrey ใช่ฉันเข้าใจว่าคุณหมายถึงอะไรฉันจึงได้อัปเดตข้อความเล็กน้อย
SDJMcHattie

7

วิธี setWidth (100) ตั้งค่าความกว้าง 100 px (ไม่ใช่ dp) ดังนั้นคุณอาจประสบปัญหาความกว้างที่แตกต่างกันในโทรศัพท์ Android รุ่นต่างๆดังนั้นให้ใช้การวัดเป็น dp แทนพิกเซลใช้รหัสด้านล่างเพื่อรับการวัดเป็น dp ของความกว้างตัวอย่าง = 300px และ height = 400px

int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());

int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());


0

พิกเซลแน่นอนวิธีนี้ขอให้พิกเซลเป็นพารามิเตอร์


1
หากอยู่ในไฟล์ xml รูปแบบเราสามารถระบุ android: layout_width = "100dip" หรือ android: layout_width = "100px" ในซอร์สโค้ดเราไม่สามารถระบุความกว้างของเลย์เอาต์เป็น 100dip?
user256239

ไม่โดยตรงคุณต้องแปลงตัวเองโดยใช้ DisplayMetrics.density
Romain Guy

0

จากคำตอบข้างต้นซึ่งใช้ได้ดีสำหรับฉันฉันสร้างวิธีการช่วยเหลือบางอย่างเพียงแค่เพิ่มเข้าไปในยูทิลิตี้ของคุณเพื่อใช้ในโครงการทั้งหมด

   // value in DP
   public static int getValueInDP(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInDP(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
    }

    // value in PX
    public static int getValueInPixel(Context context, int value){
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }

    public static float getValueInPixel(Context context, float value){
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.