Android और dp इकाइयों में क्रमिक रूप से चौड़ाई और ऊंचाई सेट करना


304

मैं कर रहा हूँ:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

डॉक्स के अनुसार चौड़ाई और ऊंचाई (ऊपर दोनों 65) के लिए इकाइयाँ "पिक्सेल" हैं। आप इसे स्वतंत्र पिक्सेल, या "dp" डिवाइस के लिए कैसे बाध्य करते हैं?

जवाबों:


541

आपको डिस्प्ले स्केल फैक्टर का उपयोग करके इसे dps से पिक्सेल में बदलना होगा।

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

111
सही रूपांतरण है (int) (dps * scale + 0.5f)। यह वह सूत्र है जिसका हम पूरे ढांचे में उपयोग करते हैं।
रोमेन गाइ

8
सूत्र डॉक्स में है। आगे पढ़ने के लिए, developer.android.com/guide/practices/… के
SK9

34
@RomainGuy, क्या आप कृपया API से एक उपयोगिता फ़ंक्शन जोड़ सकते हैं ताकि से कनवर्ट किया जा dpसके px? धन्यवाद।
एलिकएल्ज़िन-किलाका

3
यहाँ क्या है? im "dps को एक चर" त्रुटि के लिए हल नहीं किया जा सकता है? किस प्रकार के "डीपीएस" को घोषित करने की आवश्यकता है ??
दीपक

5
"Dps" चर वह इनपुट मान है जिसे आप कनवर्ट करना चाहते हैं।
रॉबी पॉन्ड

233

मुझे पता है कि यह एक पुराना सवाल है लेकिन मैंने इस रूपांतरण को करने का एक बहुत पुराना तरीका ढूंढ लिया है।

जावा

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

Kotlin

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
यह कैसे करना है यह पता लगाने के लिए अच्छा किया गया। मैं कई जगहों पर एक फार्मूला दोहराने का प्रशंसक नहीं हूं! धन्यवाद।

2
यदि नहीं, तो सूत्र के साथ फ़ंक्शन बनाएं
Sayka

1
@Kenobi यह आपके लिए DP से PX में रूपांतरण करता है। 65ऊपर डीपी मूल्य आप के लिए PX परिवर्तित करना चाहते है
drspaceboo

7
यह स्वीकृत उत्तर होना चाहिए, वर्तमान में नहीं जहां ये संख्या (0.5) जादुई रूप से नहीं आ रही है
जॉनी 19

1
@ जॉनी 19 0.5 कोई जादू नहीं है। यह सिर्फ एक अस्थायी बिंदु संख्या को गोल करने के बजाय निकटतम पूर्णांक पर गोल करने का तरीका है। अधिक विस्तार के लिए रॉबी पॉन्ड के उत्तर पर मेरी टिप्पणी देखें।
मैरेडेचेस

38

अपनी आवश्यकता को देखते हुए, वैकल्पिक समाधान भी है। ऐसा लगता है कि आप संकलन समय पर डीपी में आयामों को जानते हैं, इसलिए आप संसाधनों में एक डिमेन प्रविष्टि जोड़ सकते हैं। फिर आप डिमेन प्रविष्टि को क्वेरी कर सकते हैं और यह स्वचालित रूप से इस कॉल में पिक्सेल में परिवर्तित हो जाएगा:

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

और आपका dimens.xml होगा:

<dimen name="dimen_entry_in_dp">72dp</dimen>

इस विचार का विस्तार करते हुए, आप केवल 1dp या 1sp के मान को एक डिमेन प्रविष्टि के रूप में संग्रहीत कर सकते हैं और मान को क्वेरी कर सकते हैं और इसे एक गुणक के रूप में उपयोग कर सकते हैं। इस दृष्टिकोण का उपयोग करके आप गणित सामग्री से कोड को इंसुलेट करेंगे और गणना करने के लिए लाइब्रेरी पर भरोसा करेंगे।


ध्यान दें कि रिटर्न वैल्यू वास्तव में एक इंट है, इसलिए यह एक फ्लोट में डाली जाती है।
CorayThan

यह एक बुरा जवाब है क्योंकि यह गतिशील होने का किराया है
जोहनी 19

37

सबसे सरल तरीका (और एपीआई 1 से भी काम करता है) जो परीक्षण किया गया है:

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

दस्तावेज़ों से:

कच्चे पिक्सल में एक आकार के रूप में उपयोग के लिए एक विशेष संसाधन आईडी के लिए एक आयामी प्राप्त करें। यह getDimension (int) के समान है, सिवाय इसके कि लौटा मूल्य एक आकार के रूप में उपयोग करने के लिए पूर्णांक पिक्सेल में बदल जाता है। एक आकार रूपांतरण में आधार मूल्य को गोल करना शामिल है, और यह सुनिश्चित करना कि गैर-शून्य आधार मूल्य कम से कम एक पिक्सेल आकार में है।

हाँ, यह मूल्य को बढ़ाता है, लेकिन यह बहुत बुरा नहीं है (सिर्फ hdpi और ldpi उपकरणों पर विषम मान में, जब ldpi बहुत आम नहीं है, तो मुझे थोड़ा मूल्य जोड़ना होगा) मैंने xxhdpi डिवाइस में परीक्षण किया है जो 4dp को 16 (पिक्सल) में परिवर्तित करता है और वह है सच।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.