পিক্সেলকে ডিপিতে রূপান্তর করা হচ্ছে


826

প্যানটেক ডিভাইসটির রেজোলিউশন হিসাবে পিক্সেলগুলিতে দেওয়া উচ্চতা এবং প্রস্থের সাথে আমি আমার অ্যাপ্লিকেশন তৈরি করেছি 480x800

আমাকে জি 1 ডিভাইসের জন্য উচ্চতা এবং প্রস্থকে রূপান্তর করতে হবে।
আমি ভেবেছিলাম এটিকে ডিপিতে রূপান্তর করা সমস্যার সমাধান করবে এবং উভয় ডিভাইসের জন্য একই সমাধান সরবরাহ করবে।

পিক্সেলকে ডিপিতে রূপান্তর করার কোনও সহজ উপায় আছে কি?
কোন পরামর্শ?


1
আপনি যদি এক-অফ রূপান্তর করতে চাইছেন (উদাহরণস্বরূপ ফটোশপ থেকে স্প্রিট রফতানি করার জন্য), এখানে নিফটি রূপান্তরকারী
পল ল্যামার্টসমা


উত্তর:


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

331
দ্রষ্টব্য: উপরেরটি ডিআইপিগুলি পিক্সেলগুলিতে রূপান্তর করছে। মূল প্রশ্নটি জিজ্ঞেস করেছিল যে পিক্সেলগুলি কীভাবে ডিপসে রূপান্তর করতে হয়!
ইউরিগ জোন্স 13'12

12
: এখানে ওপি করার জন্য একটি বাস্তব উত্তর stackoverflow.com/questions/6656540/...
qix

119
মজার বিষয়টি কীভাবে উত্তরটি আরও সহায়ক যখন এটি সত্যই প্রশ্নের উত্তর দেয় না __- আমি ভেবেছিলাম যে প্রশ্নটি জিজ্ঞাসা করেছিল তখন আমি বুঝতে পেরেছিলাম আমি না! তাই দুর্দান্ত উত্তর। আমার একটা প্রশ্ন আছে আমি কীভাবে সর্বশেষ পরামিতিটি পেতে applyDimensionপারি? আমি কি শুধু করতে পারি getResource().getDisplayMetrics(), না অন্য কিছু আছে?
অ্যান্ডি

11
দ্রষ্টব্য: অপেক্ষাকৃত ব্যয়বহুল অপারেশন। দ্রুত
অ্যাকসেসের

8
যদি Contextঅবজেক্ট ব্যবহারের অ্যাক্সেস না থাকেResources.getSystem().getDisplayMetrics()
ফারশাদ তাহমসবি

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
বেশিরভাগ পদ্ধতিতে একটি পূর্ণসংখ্যার মান আশা করায় কোনও ইন্ট ম্যাথ.গ্রাউন্ড (পিক্স) ফেরানোর উপযুক্ত হতে পারে
রাজ লাবানা

3
@ মুহম্মদবাবার এটি কারণ 160 ডিপিআই (এমডিপিআই) হ'ল বেসলাইন বংশ যা থেকে অন্যান্য ঘনত্ব গণনা করা হয়। উদাহরণস্বরূপ এইচডিপিআইকে এমডিপিআই-এর ঘনত্ব 1.5x বলে বিবেচনা করা হয় যা 240 ডিপিআই বলার অন্য উপায় way সমস্ত ঘনত্বের জন্য নীচে জসোল্ট সাফরানির উত্তর দেখুন।
স্টিফেন

19
@ টমটাসচে: Resource.getSystem()(জোর খনি) এর জন্য ডকগুলি থেকে : "একটি বৈশ্বিক শেয়ার্ড রিসোর্সস অবজেক্টটি ফিরিয়ে দিন যা কেবলমাত্র সিস্টেম সংস্থানগুলিতে অ্যাক্সেস সরবরাহ করে (কোনও অ্যাপ্লিকেশন সংস্থান নেই), এবং বর্তমান পর্দার জন্য কনফিগার করা হয়নি ( মাত্রা ইউনিট ব্যবহার করতে পারে না, পরিবর্তন হয় না) does ওরিয়েন্টেশন ভিত্তিক, ইত্যাদি) "
ভিকি চিজওয়ানি

2
বিকাশকারীটির মান সিল / ফ্লোর করার পছন্দ রয়েছে। বিকাশকারীকে নিয়ন্ত্রণ দেওয়া ভাল।
মুহাম্মদ নাবিল আরিফ


285

অগ্রাধিকার হিসাবে একটি 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
এটি সমস্ত ডিভাইসে কাজ করে না! এই উত্তর বনাম টাইপডভ্যালিউ.এপ্লিডাইমেনশন ব্যবহারের ফলাফল ওয়ানপ্লাস 3 টি তে এক নয় (সম্ভবত ওয়ানপ্লাসে ওএসের মধ্যে কাস্টম স্কেলিং রয়েছে)। TypedValue.applyDimesion ব্যবহারের ফলে ডিভাইসগুলিতে সামঞ্জস্যপূর্ণ আচরণ হয়।
বেন দে লা হেই

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

density সমান

  • .75অন ldpi( 120ডিপিআই)
  • 1.0অন mdpi( 160ডিপিআই; বেসলাইন)
  • 1.5অন hdpi( 240ডিপিআই)
  • 2.0অন xhdpi( 320ডিপিআই)
  • 3.0অন xxhdpi( 480ডিপিআই)
  • 4.0অন xxxhdpi( 640ডিপিআই)

ডিপিআই মান সহ চারপাশে খেলতে এই অনলাইন রূপান্তরকারীটি ব্যবহার করুন ।

সম্পাদনা: দেখে মনে হচ্ছে dpiবালতি এবং এর মধ্যে 1: 1 সম্পর্ক নেই density। দেখে মনে Nexus 5Xহচ্ছে সত্তার xxhdpiএকটি densityমান রয়েছে 2.625(পরিবর্তে 3)। ডিভাইস মেট্রিক্সে নিজের জন্য দেখুন ।


3
"দেখে মনে হচ্ছে যে নেক্সাস 5 এক্স হ'ল এক্সএক্সএইচডিপিআই এর ঘনত্বের মান 2.6 (3 এর পরিবর্তে) রয়েছে" - প্রযুক্তিগতভাবে নেক্সাস 5 এক্স 420 ডিপিআই এবং নেক্সাস 6/6 পি 560 ডিপিআই নয়, সরাসরি স্ট্যান্ডার্ড বালতিগুলির কোনওটিতেই জমি নেই the টিভিডপিআই (213 ডিপিআই) সহ নেক্সাস 7। সুতরাং xxdpi এবং xxxhdpi হিসাবে তাদের তালিকাভুক্ত সাইটটি প্রহসন। আপনার চার্টটি সঠিক, এবং সেই ডিভাইসগুলি তাদের "বিশেষ" ডিপিআই বালতিগুলি ভিত্তিক একটিকে যথাযথভাবে স্কেল করবে।
স্টিভেন বাইলে

107

আপনি এটি ব্যবহার করতে পারেন .. কনটেক্সট ছাড়াই

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);
}

যেমন @ স্ট্যান উল্লেখ করেছে .. সিস্টেমের ঘনত্ব পরিবর্তন হলে এই পদ্ধতির ব্যবহারটি সমস্যার কারণ হতে পারে। তাই সচেতন হতে হবে!

এটি করার জন্য আমি ব্যক্তিগতভাবে কনটেক্সট ব্যবহার করছি। আমি আপনাকে ভাগ করে নিতে চেয়েছিলাম এটি কেবল একটি অন্য পদ্ধতি


11
আপনি এটি ব্যবহার করতে চাইবেন না। গেটসিস্টেমের জন্য ডকুমেন্টেশন () - "বিশ্বব্যাপী শেয়ার করা সংস্থানসমূহের অবজেক্টটি ফিরিয়ে দিন যা কেবলমাত্র সিস্টেম সংস্থানগুলিতে অ্যাক্সেস সরবরাহ করে (কোনও অ্যাপ্লিকেশন সংস্থান নেই), এবং বর্তমান পর্দার জন্য কনফিগার করা হয়নি (মাত্রা ইউনিট ব্যবহার করতে পারে না, ওরিয়েন্টেশনের ভিত্তিতে পরিবর্তিত হয় না) ইত্যাদি) । "
স্টান

@ স্ট্যান কী বলছে তা দ্বিতীয়ত: এটি বিপজ্জনক এবং আপনার এটি ব্যবহার করা উচিত নয়, বিশেষত এখন যখন ডিভাইস ফর্মের কারণগুলি এত জটিল হয়ে উঠছে।
সায়েত

93

আপনি যদি মাত্রা এক্সএমএল ব্যবহার করতে পারেন তবে এটি খুব সাধারণ!

আপনার res/values/dimens.xml:

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

তারপরে আপনার জাভাতে:

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

যেহেতু পিএক্স টু ডিপি স্ক্রিনের ঘনত্বের উপর নির্ভরশীল, আমি জানি না যে ওপি কীভাবে প্রথম স্থানে ১২০ পেয়েছিল, যদি না তিনি বা তিনি px থেকে সমস্ত ভিন্ন স্ক্রিনের আকারে ডিপি পদ্ধতি পরীক্ষা না করে।
61590

75

অ্যান্ড্রয়েড বিকাশ গাইড অনুসারে:

px = dp * (dpi / 160)

তবে প্রায়শই আপনি পিক্সেলগুলিতে বর্ণিত একটি নকশাগুলি পেলে প্রায় অন্যভাবে এটি সম্পাদন করতে চান। তাই:

dp = px / (dpi / 160)

আপনি যদি কোনও 240 ডিপিআই ডিভাইসে থাকেন তবে এই অনুপাতটি 1.5 (আগে যেমন বলা হয়েছে), তাই এর অর্থ একটি 60px আইকনটি অ্যাপ্লিকেশনটিতে 40dp এর সমান।



7
160 ধ্রুবক, শয্যা উত্তর
ব্যবহারকারী 25

2
@ ইউজার 25 আসলে দুর্দান্ত উত্তর। আপনি অ্যান্ড্রয়েড স্ক্রিনগুলিতে কোনও ডকস পড়েন নি? অ্যান্ড্রয়েড স্ক্রীন ঘনত্বের কথা বলার সময় 160 স্থান জুড়ে একটি সাধারণ ধ্রুবক। দস্তাবেজগুলি থেকে উদ্ধৃতি: "মাঝারি ঘনত্ব (এমডিপিআই) স্ক্রিন (~ 160dpi) ((এটি বেসলাইন ঘনত্ব)"। আসুন, মানুষ
মাইকোলজ

70

ছাড়া Context, মার্জিত স্থির পদ্ধতি:

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()জাভাদোক "একটি বিশ্বব্যাপী শেয়ার্ড রিসোর্সস অবজেক্টটি ফিরিয়ে দিন যা কেবলমাত্র সিস্টেম সংস্থানগুলিতে অ্যাক্সেস সরবরাহ করে (কোনও অ্যাপ্লিকেশন সংস্থান নেই), এবং বর্তমান স্ক্রিনের জন্য কনফিগার করা হয়নি (দিকনির্দেশ ইউনিট ব্যবহার করতে পারে না, অভিমুখের ভিত্তিতে পরিবর্তন করতে পারে না")। এটি বেশিরভাগ ক্ষেত্রে বলে যে এটি কোনওভাবে কাজ করলেও আপনার এটি করা উচিত নয়।
অস্টিন মাহুনি

আমি কেবল @ অস্টনমাহনির মন্তব্যটি পড়েছি এবং বুঝতে পেরেছি যে উত্তরটি আমি প্রথমে ভেবেছিলাম তেমন দুর্দান্ত নয় তবে এসও আমাকে আমার উর্ধ্বতনটিকে পূর্বাবস্থায় ফেরাতে দেবে না ! আহা!
ভিকি চিজওয়ানি

45

জন্য DP to Pixel

মধ্যে একটি মান তৈরি করুন dimens.xml

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

এই মানটি এতে পান pixel:

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

39

অতএব আপনি 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
এটি ডিপিটিকে পিক্সেলে রূপান্তরিত করে তবে আপনি আপনার পদ্ধতিটিকে কল করেছেন convertToDp
কিওয়ার্টি

4
+ 0.5f এখানে ব্যাখ্যা করা হয়েছে -> বিকাশকারী.অ্যান্ড্রয়েড . com/guide/practices/… । এটি নিকটতম পূর্ণসংখ্যা পর্যন্ত গোল করতে ব্যবহৃত হয়।
বায়ে

একমাত্র সঠিক উত্তর। আপনি উত্সটি বিকাশকারীকে
andঅ্যান্ড্রয়েড.com

web.archive.org/web/20140808234241/http://developer.android.com/… এমন লিঙ্কের জন্য যা এখনও প্রশ্নে থাকা বিষয়বস্তু রয়েছে
কাও

39

যে কেউ কোটলিন ব্যবহার করছে তার জন্য:

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

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

ব্যবহার:

64.toPx
32.toDp

রিসোর্স.জেটসিস্টেমের জন্য ডক্স থেকে (): "একটি বিশ্বব্যাপী শেয়ার করা সংস্থানসমূহ অবজেক্ট করুন যা কেবলমাত্র সিস্টেম সংস্থানগুলিতে অ্যাক্সেস সরবরাহ করে (কোনও অ্যাপ্লিকেশন সংস্থান নেই), এবং বর্তমান স্ক্রিনের জন্য কনফিগার করা হয়নি (মাত্রা ইউনিট ব্যবহার করতে পারে না, এর ভিত্তিতে পরিবর্তন হয় না) ওরিয়েন্টেশন ইত্যাদি) "
হেন্দ্রডাব্লুডি

@ হেন্দ্রডাব্লুডি ডক্সটি বিভ্রান্তিকর হতে পারে, যে ডাইমেনশন ইউনিটগুলি এটি উল্লেখ করছে তা হ'ল আপনার অ্যাপ্লিকেশন স্তরের ডাইমেন্স রিসোর্স। ডিসপ্লেমেট্রিক্স কোনও অ্যাপ্লিকেশন স্তরের সংস্থান নয়। এটি একটি সিস্টেম সংস্থান এবং এটি সঠিক মান প্রদান করে। এই কোডটি আমার সমস্ত প্রোড অ্যাপ্লিকেশনগুলিতে দুর্দান্ত কাজ করছে। কখনও সমস্যা ছিল না।
গুণহান

33

অ্যান্ড্রয়েড এসডিকে একটি ডিফল্ট ব্যবহার রয়েছে: http://developer.android.com/references/android/util/TededValue.html

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

আপনার এটি ব্যবহার করা উচিত। বোনাস হিসাবে এটি এসপিও করবে।
মার্ক রেনুফ

2
resultPixটাইপ int হতে হবে। int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
ভোভোস্ট ইস্ট

27

কোটলিন-এক্সটেনশন ব্যবহার করা আরও ভাল করে তোলে

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

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

হালনাগাদ:

কারণ বিশ্বব্যাপী ভাগ করা সংস্থানগুলিরdisplayMetrics অংশ , আমরা ব্যবহার করতে পারিResources.getSystem()

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

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

4
আপনি এটিকে ইন্টের এক্সটেনশান হিসাবে কেন যুক্ত করবেন, দায়টি ইন্ট টাইপের সাথে কিছু করার দরকার নেই।
htafoya

19

এটি আপনাকে পিক্সেলগুলিতে রূপান্তর দেবে:

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);
}

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)
}

জাভা

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

সম্ভবত সর্বোত্তম উপায় যদি আপনার মান / মাত্রার অভ্যন্তরের মাত্রা থাকে তবে getDimesion () পদ্ধতি থেকে সরাসরি মাত্রাটি পাওয়া যায়, এটি আপনাকে ইতিমধ্যে পিক্সেল মানের রূপান্তরিত মাত্রা ফিরিয়ে দেবে।

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

এটি আরও ভালভাবে ব্যাখ্যা করার জন্য,

getDimension(int resourceId) 

ইতিমধ্যে একটি ফ্লাট হিসাবে পিক্সেল রূপান্তরিত মাত্রা ফিরে আসবে।

getDimensionPixelSize(int resourceId)

একই কিন্তু সংখ্যায় ছাঁটাই হবে, সুতরাং একটি সংকেত হিসাবে।

অ্যান্ড্রয়েড রেফারেন্স দেখুন


9
পিপিএলে ডিপি রূপান্তর করতে।
public static int dp2px(Resources resource, int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,   dp,resource.getDisplayMetrics());
}
পিক্সেলকে ডিপিতে রূপান্তর করতে।
  public static float px2dp(Resources resource, float px)  {
    return (float) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, px,resource.getDisplayMetrics());
}

যেখানে রিসোর্স কনটেক্সট.টেট রিসোর্সস ()।


8
উত্তরটি ভুল, কারণ আপনি পিক্সেলকে ডিপিতে রূপান্তর করছেন না - আপনি পিক্সেলকে পিক্সেলে রূপান্তর করছেন!
ইয়ারোস্লাভ

Px2dp ভুল - একই মানটি পিক্সেলগুলিতে ফিরিয়ে দেবে।
নটারিও

8

এটার মত:

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;
    }
}

প্রসঙ্গের উপর নির্ভর করে, রিটার্ন ফ্লোট মান, স্থির পদ্ধতি

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


8

কোটলিনের এক্সটেনশন ফাংশনটি ব্যবহার করে আরও মার্জিত পদ্ধতি

/**
 * 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()

ব্যবহার:

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

এখানে এক্সটেনশনের ব্যবহার পছন্দ করুন। আমি "রূপান্তর" হিসাবে ফাংশনগুলি পড়ি function nameযা আমি বুঝতে পারি যে এই ক্ষেত্রে পিছনে রয়েছে। প্রতিটি ফাংশনের উদ্দেশ্য স্পষ্ট করার জন্য, ফাংশনগুলির নাম যথাক্রমে dpToPx এবং pxToDp পড়তে আপডেট করা যেতে পারে।
ম্যাক্সওয়েল

রিসোর্স.জেটসিস্টেমের জন্য ডক্স থেকে (): "একটি বিশ্বব্যাপী শেয়ার করা সংস্থানসমূহ অবজেক্ট করুন যা কেবলমাত্র সিস্টেম সংস্থানগুলিতে অ্যাক্সেস সরবরাহ করে (কোনও অ্যাপ্লিকেশন সংস্থান নেই), এবং বর্তমান স্ক্রিনের জন্য কনফিগার করা হয়নি (মাত্রা ইউনিট ব্যবহার করতে পারে না, এর ভিত্তিতে পরিবর্তন হয় না) ওরিয়েন্টেশন ইত্যাদি) "
হেন্দ্রডাব্লুডি

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

2
এটি কি এই প্রশ্নের অন্যান্য উত্তরগুলির অনেকের সাথেই আবৃত হয় না?
TZHX

7

আপনি যদি কোনও পারফরম্যান্স সমালোচনামূলক অ্যাপ্লিকেশন বিকাশ করেন তবে দয়া করে নীচের অনুকূলিত শ্রেণিটি বিবেচনা করুন:

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;
    }
}

আপনি যদি সত্যই ঘন ঘন রূপান্তর করেন তবেই এটি সংবেদন তৈরি করে। আমার ক্ষেত্রে আমি করি।
পাভেল

160f কি? আপনি কেন এটি ব্যবহার করেন, এটি 160 কেন?
ডিফাইনরা

160 => 160 ডিপিআই এবং এটি সূত্র
xAqweRx এর

6

পিক্সেলকে ডিপিতে রূপান্তর করতে টাইপডভ্যালু ব্যবহার করুন ।

ডকুমেন্টেশনের উল্লেখ হিসাবে: একটি গতিশীল টাইপ করা ডেটা মানের জন্য ধারক।

এবং প্রয়োগের মাত্রা পদ্ধতিটি ব্যবহার করুন :

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

যা একটি আনপ্যাকড জটিল ডেটা মানকে নীচের মত চূড়ান্ত ভাসমান বিন্দুতে রূপান্তরিত করে:

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

আশা করি এইটি কাজ করবে .


6

এটি আমার পক্ষে এটি কাজ করে:

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

প্রস্থের জন্য আপনি একই কাজ করতে পারেন।



4

আপনার পিক্সেল যেমন dp ব্যবহার করা উচিত। এগুলিই এগুলি; স্বতন্ত্র পিক্সেল প্রদর্শন করুন। আপনি মাঝারি ঘনত্বের স্ক্রিনে একই নম্বরগুলি ব্যবহার করুন, এবং উচ্চ ঘনত্বের স্ক্রিনে আকারটি যাদুতে সঠিক হবে।

তবে, এটি আপনার লেআউটের ডিজাইনের ফিল-প্যারেন্ট বিকল্পটি যা প্রয়োজন তা মনে হচ্ছে। যখন আপনি নিজের মতামতটি বা পিতামাতার ধারক বাকী সমস্ত আকারে প্রসারিত করতে চান তখন নিয়ন্ত্রণ করুন Use


আসলে আমার সমস্যাটি হ'ল আমার অ্যাপ্লিকেশনটি উচ্চ ঘনত্বের পর্দার জন্য কোডেড এবং এখন এটি কম ঘনত্বের স্ক্রিনে রূপান্তরিত হওয়া দরকার ..
ইন্ধু

মাঝারি ঘনত্বের স্ক্রিনের জন্য আপনার পিক্সেলগুলি সংশোধন করুন (আপনি এমুলেটরটিতে একটি মাঝারি ঘনত্বের স্ক্রিন সেটআপ করতে পারেন) এবং পিক্সেলটিকে ডিপি দিয়ে প্রতিস্থাপন করুন। তবে ফিল_প্যারেন্ট এবং একাধিক লেআউট ব্যবহার করে আরও নমনীয় অ্যাপ্লিকেশন তৈরি করা যেতে পারে।
মাইকেল লোম্যান 12

সবশেষে, আমার কাছে সমস্ত পিক্সেল ম্যানুয়ালি ডিপি পরিবর্তন করার বিকল্প ছিল না .. :(
ইন্দু

1
কমপক্ষে পরের বার আপনি প্রথমে ডিপি ব্যবহার করবেন এবং কোনও কিছুই পরিবর্তন করতে হবে না :) যদিও এটি এমন লেআউটগুলি ব্যবহার করা উচিত যা বেশিরভাগ ক্ষেত্রে নিখুঁত অবস্থানের প্রয়োজন হয় না।
মাইকেল লোম্যান

যেহেতু এটি আমার প্রথম অ্যাপ্লিকেশন ছিল .. আমি এই ভুলটি করেছি ... আমি এটি আর কখনও করব না ... :)
ইন্ধু

4

PXএবং DPবিভিন্ন কিন্তু একই।

DPরেজোলিউশনটি যখন আপনি কেবলমাত্র পর্দার দৈহিক আকারকে ফ্যাক্ট করেন। আপনি যখন DPএটি ব্যবহার করবেন তখন আপনার বহির্বিন্যাসটি বিভিন্ন pixelঘনত্বের সাথে অন্যান্য অনুরূপ আকারের স্ক্রিনগুলিতে স্কেল করবে ।

কখনও কখনও আপনি আসলে pixelsযদিও চান এবং আপনি যখন কোডের মাত্রা নিয়ে কাজ করেন তখন আপনি সর্বদা বাস্তবের সাথে আচরণ করছেন pixels, যদি না আপনি সেগুলি রূপান্তর করেন।

সুতরাং একটি Android ডিভাইস, স্বাভাবিক আকারের উপর hdpiপর্দা, 800x480 is 533x320মধ্যে DP(আমি বিশ্বাস করি)। রূপান্তর DPকরতে pixels /1.5, ফিরে রূপান্তর করতে *1.5। এটি কেবলমাত্র একটি পর্দার আকারের জন্য এবং dpiএটি ডিজাইনের উপর নির্ভর করে পরিবর্তিত হবে। আমাদের শিল্পীরা pixelsযদিও আমাকে দেন এবং আমি DPউপরের 1.5সমীকরণের সাথে রূপান্তর করি ।


3

আপনি যদি পূর্ণসংখ্যার মান চান তবে ম্যাথ.গ্রাউন্ড () ব্যবহার করে ভাসমানটি নিকটতম পূর্ণসংখ্যার সাথে গোল করবে।

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


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
}

জাভা

   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;
}

2

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক থেকেই সর্বোত্তম উত্তর আসে: কেবল এই সমতাটি ব্যবহার করুন ...

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

(dp কে px এ রূপান্তর করে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.