घनत्व-स्वतंत्र पिक्सेल के रूप में लेआउटपरम पर प्रोग्रामेटिक रूप से ऊँचाई सेट करें


123

क्या किसी लेआउटपरम्स की ऊंचाई / चौड़ाई को घनत्व-स्वतंत्र पिक्सल (डीपी) के रूप में सेट करने का कोई तरीका है ? यह ऊंचाई / चौड़ाई की तरह दिखता है, जब प्रोग्राम सेट किया जाता है, पिक्सेल में होता है और डीपी नहीं होता है।

जवाबों:


271

आपको अपने डिप वैल्यू को पिक्सल में बदलने की जरूरत है:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());

मेरे लिए यह टोटका करता है।


10
मुझे लगता है कि getActivity ()। GetResources ()। GetDimension (रिसोर्सआईडी) सही रूप से परिवर्तित संचालन करते हैं।
StErMi

3
मेरे लिए काम करता है, लेकिन यह अलग है ... अगर मैं एक ImageView की चौड़ाई / ऊँचाई को xml का उपयोग करके ऊपर की विधि का उपयोग करके सेट करता हूं। एक्सएमएल में मैंने 85 डीपी सेट किया है जबकि ऊपर की विधि समान आकार का उत्पादन करने के लिए "75" की आवश्यकता है। कोई विचार क्यों?
डर्क

1
जब आप इसे प्रोग्रामेटिक रूप से सेट करते हैं (आमतौर पर कोड में सेट करते समय आपको स्वयं को पेडिंग निर्दिष्ट करना होता है) XML या कोड में dp सेट करने के बीच अंतर नहीं होना चाहिए।
टियागो

11
 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }

फ़ंक्शन को इस तरह से कॉल करें,

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);

यह है ... वास्तव में गलत है। आपके पास केवल निश्चित संख्या में घनत्व का समर्थन करने के लिए हार्ड-कोडित है। यदि आप घनत्व स्केलिंग फैक्टर द्वारा स्केल करना चाहते हैं, तो बस developer.android.com/reference/android/util/… से गुणा करें, जो कि कर (आकार * मेट्रिक्स। डेंसिटी डीपीआई) / DisplayMetrics.DENSICAL_DEFAULT के समान होगा।
हैकबॉड

1
हां आपका नया जवाब वाजिब है। या जैसा कि मैंने कहा, सिर्फ मेट्रिक्स.डाईसेंस द्वारा गुणा करें। जो है, उसके लिए है।
हैकबॉड

6

चूंकि इसका कई बार उपयोग किया जा सकता है:

public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}

मुझे रूपांतरण दर का उपयोग करना अधिक व्यावहारिक लगा, क्योंकि हमारे लिए एक से अधिक मूल्य को परिवर्तित करना पड़ता है। चूंकि रूपांतरण दर में परिवर्तन नहीं होता है, इसलिए यह थोड़ा प्रसंस्करण समय बचाता है।

/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}

5

यहाँ मेरा स्निपेट है:

public class DpiUtils {

    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }

}

कहाँ पे DisplayMetrics metrics = getResources().getDisplayMetrics()


0

जवाब दिया समाधान मेरे लिए काम नहीं किया, दृश्य की ऊंचाई अभी भी बंद था। मैंने इसे समाप्त किया, जो अच्छी तरह से काम करता है:

protected int dp2px(int dp){
    final float scale = getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}

और अगर आप दूसरे रास्ते चाहते हैं, पिक्सेल से डीपी ...

protected float px2dp(float px){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float dp = px / (metrics.densityDpi / 160f);
    return Math.round(dp);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.