অ্যান্ড্রয়েডে রানটাইমে ডিপি বা ডিপের ক্ষেত্রে কীভাবে পর্দার প্রস্থ নির্ধারণ করবেন?


193

আমাকে ডিপ / ডিপি (জাভা ফাইলগুলিতে) ব্যবহার করে অ্যান্ড্রয়েড উইজেটগুলির লেআউট কোড করতে হবে। রানটাইমে যদি আমি কোড করি

int pixel=this.getWindowManager().getDefaultDisplay().getWidth();

এটি পিক্সেল (পিক্সেল) এর পর্দার প্রস্থ ফেরত দেয়। এটিকে ডিপিতে রূপান্তর করতে, আমি কোড দিয়েছিলাম:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

এটি সঠিক উত্তরটি ফেরত বলে মনে হচ্ছে না। আমি ডাব্লুভিজিএ 800 এর এমুলেটর তৈরি করেছি যার স্ক্রিন রেজোলিউশন 480 বাই 800। এই এমুলেটরটি 240 ডিপিআই যার স্কেল ফ্যাক্টরটি 0.75 হবে।

উত্তর:


377

এটা চেষ্টা কর

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

অথবা

ধন্যবাদ @ টোম হুবলেক

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

91
কেন উইন্ডো ম্যানেজার কল করা প্রয়োজন? এই কোড সম্পর্কে কি? ডিসপ্লেমেট্রিক্স ডিসপ্লেমেট্রিক্স = রিসোর্স.জেটডিসপ্লেমেট্রিক্স (); ফ্লোট স্ক্রিনউইথডিপি = ডিসপ্লেমেট্রিক্স.উইথপিক্সেলস / ডিসপ্লেমেট্রিক্স.ডেনসিটি;
টোম হুবলেক

2
এটি খুব উচ্চ ঘনত্বের স্ক্রিন ব্যবহার করে আমার পক্ষে কাজ করে না। মনে হচ্ছিল এটি পর্দার একটি ছোট অংশ পেয়েছে। এই সমাধান আমার জন্য কাজ: stackoverflow.com/a/18712361/956975 । ডিসপ্লে প্রদর্শন = getWindowManager () getDefaultDisplay (); পয়েন্ট আকার = নতুন পয়েন্ট (); display.getSize (আকার); int প্রস্থ = আকার.x; int উচ্চতা = আকার.y;
মেরিঙ্কে

1
@dsdsdsdd: প্রসঙ্গটি প্রসঙ্গ শ্রেণীর কোনও উদাহরণ। সর্বাধিক উল্লেখযোগ্যভাবে, ক্রিয়াকলাপ প্রসঙ্গের একটি উপ শ্রেণি (সুতরাং এটি কোনও ক্রিয়াকলাপে এটি ব্যবহার করুন এবং একটি বিভাগে getActivity () নিন)। অ্যাপ্লিকেশন এবং পরিষেবাও প্রসঙ্গের সাব ক্লাস।
ফ্রান্সোইস পোয়ার

112

আমি গুগল থেকে এই প্রশ্নে হোঁচট খেয়েছি, এবং পরে আমি API> = 13 এর জন্য কার্যকর একটি সহজ সমাধান পেয়েছি।

ভবিষ্যতের রেফারেন্সের জন্য:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.

দেখুন কনফিগারেশন বর্গ রেফারেন্স

সম্পাদনা: নিক বাইকোইয়ানু দ্বারা উল্লিখিত হিসাবে , এটি পর্দার ব্যবহারযোগ্য প্রস্থ / উচ্চতা (যা বেশিরভাগ ব্যবহারে আকর্ষণীয় হওয়া উচিত) প্রদান করে। আপনার যদি প্রয়োজন হয় প্রকৃত প্রদর্শন মাত্রা উপরের উত্তরে আটকে থাকে।


23
কনফিগারেশনের স্ক্রিনউইথডিপি / স্ক্রিনহাইটডিপি বনাম ডিসপ্লেমেট্রিক্স প্রস্থ / পিক্সেল / উচ্চতাপিক্সেল ব্যবহারের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য কনফিগারেশনটি ব্যবহারযোগ্য ডিসপ্লে ডাইমেনশন (মাইনাস স্ট্যাটাস বার ইত্যাদি) প্রদান করে, যখন ডিসপ্লেমেট্রিক্স পুরো স্ক্রিনের মাত্রা দেয় returns
নিক বাইকোইয়ানু

এটি কেবলমাত্র এপিআই লেভেল 13 এবং আপ
Ono

@ নিকবাইকাইকানুর মন্তব্যে যোগ করতে, getConfigration () এবং getDisplayMetrics () দুটি পদ্ধতিই বহু-উইন্ডো মোডে কাজ করে। অর্থাত্ পর্দা নয়, মাপগুলি উইন্ডোটির প্রতিফলন করে।
এনএমডব্লু

7

আপনি 160 এর ডিফল্ট ঘনত্বের মূল্য অনুপস্থিত।

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

অন্য কথায়, আপনি যদি প্রতিকৃতি মোডে 160 ডিপ এর সমান প্রস্থের সাথে লেআউট ডিজাইন করেন তবে এটি সমস্ত এলডিপি / এমডিপিআই / এইচডিপিআই ডিভাইসে স্ক্রিনের অর্ধেক হবে (ট্যাবলেটগুলি বাদে, আমার মনে হয়)


আপনি যা উত্তর দিয়েছেন তা হ'ল আমার প্রশ্নের পিছনে যৌক্তিক যুক্তি। আমি এটা বুঝতে পেরেছি. আমার জাভাতে এটি কীভাবে কোড করা উচিত যাতে রানটাইমের সময় স্ক্রিনের রেজোলিউশন যাই হোক না কেন, সঠিক ডিপিআই প্রস্থটি কোডটি বাছাই করে?
খুশবু

আশা করি আমি এখনই এটি পেয়ে যাব :) DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);ক্রিয়াকলাপের মধ্যে ব্যবহার করুন । তারপরে, দস্তাবেজগুলিতেoutMetrics.density যেমন বলা হয়েছে, আপনাকে বর্তমান ডিভাইসের স্কেল ফ্যাক্টর দেবে
মাইখাইলো গাইদাই

6

পরিবর্তে এটি ব্যবহার সম্পর্কে কীভাবে?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

6
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;

8
কিছু ব্যাখ্যা দেওয়ার জন্য বিবেচনা করুন
বিগবাউন্টি

5

কোটলিনে উত্তর:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

4

কোটলিনের জন্য সরলীকৃত:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }

2

কিছু ভাল সাজসজ্জার সাথে ডিপির ক্ষেত্রে স্ক্রিন প্রস্থ এবং উচ্চতা পান:

পদক্ষেপ 1: ইন্টারফেস তৈরি করুন

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

পদক্ষেপ 2: প্রয়োগকারী শ্রেণি তৈরি করুন

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

পদক্ষেপ 3: ক্রিয়ায় প্রস্থ এবং উচ্চতা পান:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();

এই রিটার্ন উচ্চতা এবং প্রস্থ পিক্সেল বা dp হয়?
তাসলিম ওসেনি

হিসাবে ডাকা হয়। ঘনত্ব সেই কারণেই এটি আপনাকে ডিপিতে দেয়
আলী আজাজ আলম

কোনও সহজ কাজ সমাধানের জন্য আপনার অ্যাপ্লিকেশনটিতে কোডের টোন যুক্ত করা ভাল ধারণা বলে আমি মনে করি না
রুসলান বেরোজভ

স্যার এটি আপনার উপর নির্ভর করে ক্লাসটি প্রয়োগ করবেন বা সরাসরি কোড করুন কিনা। সংজ্ঞায়িত শ্রেণি থেকে আপনি সরাসরি বাস্তবায়নের জন্য কোডটি সহজেই বের করতে পারেন।
আলী আজাজ আলম

0

আপনি যদি কেবল নিজের পর্দার প্রস্থ সম্পর্কে জানতে চান তবে আপনি কেবল আপনার বিকাশকারী বিকল্পগুলিতে "ক্ষুদ্রতম পর্দার প্রস্থ" অনুসন্ধান করতে পারেন। আপনি এটি সম্পাদনা করতে পারেন।



-5

নির্ভুলতা হারাতে আপনার সমস্যাটি একটি ইন্টিতে ফ্লোট castালাইয়ের সাথে। আপনারও ফ্যাক্টরের সাথে গুণ করা উচিত এবং ভাগ না করা।

এটা কর:

int dp = (int)(pixel*getResources().getDisplayMetrics().density);

3
এই উত্তরটি ভুল। বিকাশকারী.অ্যান্ড্রয়েড .com/guide/practices/… থেকে , পিক্সেল = ডিপি * ঘনত্ব।
ভ্যান্স-টার্নার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.