অ্যান্ড্রয়েডে পিক্সেল হিসাবে কীভাবে পর্দার মাত্রা পাবেন


1840

আমি কিছু কাস্টম উপাদান তৈরি করেছি এবং আমি প্রোগ্রামের ভিত্তিতে এগুলি উপরের ডান কোণে ( nশীর্ষ প্রান্ত mথেকে পিক্সেল এবং ডান প্রান্ত থেকে পিক্সেল) রাখতে চাই। সুতরাং আমার পর্দার প্রস্থ এবং পর্দার উচ্চতা এবং তারপরে অবস্থান নির্ধারণ করা দরকার:

int px = screenWidth - m;
int py = screenHeight - n;

আমি কীভাবে পেতে পারি screenWidthএবং screenHeightমূল ক্রিয়াকলাপে?


Px এর পরিবর্তে dp ব্যবহার করুন। কারণ এটি অন্যান্য ডিভাইসের সাথে আপনার বিন্যাসকে বিকৃত করবে ..
জাওয়াদ জেব

গেটআরসোর্সগুলি () দিয়ে গুন করতে ভুলবেন না get ডিসপ্লে স্কেলিং জন্য অ্যাকাউন্টে ঘনত্ব
জ্যামাকুলেট করুন

এটি প্রমাণ করে যে সর্বাধিক ভোট দেওয়া উত্তর সর্বদা সেরা হয় না (এবং প্রচুর লোকেরা উত্তরের জন্য পুনরাবৃত্তি করে)। গেটসাইজ এবং অবহেলিত গেটউইথ / গেটহাইট কম্বো (ত্রুটি উপেক্ষা করে) পরিবর্তে বালাজি.কে এর চেষ্টা করুন getMetrics। নিকের তার উত্তরে মন্তব্য এমনকি getDisplayMetricsসিস্টেম / স্ট্যাটাস বারের আকার বিবেচনা করার জন্য ব্যাখ্যা করে। এছাড়াও আপনি ব্যবহার করতে পারেন ঘনত্ব jmaculate এবং LoungeKatt আছে ব্যাখ্যা EXACT মান: DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;অ্যান্ড্রয়েড v2.2 (API এর 8) এবং ভালো ফলাফল এবং সঙ্গে v4.0 পরীক্ষিত কোনো ত্রুটি / সতর্কবার্তা
আর্মফুট

ডিসপ্লেমেট্রিক্স ডিসপ্লেমেট্রিক্স = নতুন ডিসপ্লেমেট্রিক্স (); । getWindowManager () getDefaultDisplay () getMetrics (displaymetrics)। int উচ্চতা = প্রদর্শনমেট্রিক্স.হাইটপিক্সেল; int প্রস্থ = প্রদর্শনমেট্রিক্স.উইথপিক্সেল;
আজাহার

অন্য উপায় DisplayMetrics পেতে: Resources.getSystem().getDisplayMetrics()Contextএগুলি পেতে আপনার কোনও প্রয়োজন হবে না ।
তাগ

উত্তর:


3478

আপনি যদি পিক্সেলগুলিতে প্রদর্শনের মাত্রা চান তবে আপনি এটি ব্যবহার করতে পারেন getSize:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

আপনি যদি না থাকেন তবে আপনি Activityডিফল্টর Displayমাধ্যমে পেতে পারেন WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

আপনি যদি কোনও খণ্ডে থাকেন এবং কেবলমাত্র এটি Activity.WindowManager (Xamarin.Android এ) ব্যবহার করুন বা getActivity ()। GetWindowManager () (জাভাতে) ব্যবহার করুন।

এর আগে getSizeপ্রবর্তন করা হয়েছিল (এপিআই স্তরে ১৩), আপনি এখন অবহিত হওয়া পদ্ধতি getWidthএবং getHeightপদ্ধতিগুলি ব্যবহার করতে পারেন :

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

আপনি যেভাবে ব্যবহার করছেন তার ক্ষেত্রে, বিন্যাসে একটি মার্জিন / প্যাডিং বেশি উপযুক্ত বলে মনে হচ্ছে।

আর একটি উপায়: ডিসপ্লেমেট্রিক্স

এটির আকার, ঘনত্ব এবং ফন্ট স্কেলিংয়ের মতো কোনও প্রদর্শন সম্পর্কিত সাধারণ তথ্য বর্ণনা করে এমন একটি কাঠামো। ডিসপ্লেমেট্রিক্স সদস্যদের অ্যাক্সেস করতে, এই জাতীয় কোনও বস্তুর সূচনা করুন:

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

আমরা এর widthPixelsজন্য তথ্য পেতে ব্যবহার করতে পারি:

"পিক্সেলগুলিতে প্রদর্শনের পরম প্রস্থ" "

উদাহরণ:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

13
getWidth () বা getSize ()? আমি যদি অ্যাপ্লিকেশন <13 এর পাশাপাশি এপিআই> 13 এ চালানোর জন্য আমার অ্যাপ্লিকেশনটির প্রয়োজন হয় তবে আমি কী ব্যবহার করব?
ক্যারল

52
চেষ্টা করুন {display.getSize (আকার); প্রস্থ = আকার.x; উচ্চতা = আকার.y; } ধরা (NoSuchMethodError e) {প্রস্থ = প্রদর্শন.জিটভিডথ (); উচ্চতা = display.getHeight (); }
আরনাউদ

248
আপনি দেখতে পাচ্ছেন না কেন আপনি এই try/catchজাতীয় চেক ব্যবহার করতে চান ? কেন কেবল if (android.os.Build.VERSION.SDK_INT >= 13)কোনও ছোঁড়া ব্যতিক্রম ছাড়াই ব্যবহার করবেন না? আমি try/catchএকটি সাধারণ অ্যাপ্লিকেশন প্রবাহকে খারাপ অভ্যাস হিসাবে ভাবি ।
প্যাট্রিক

2
@ এ-লাইভ তখন অ্যাপ্লিকেশনটিও ভেঙে যাবে (তবে ক্রাশ হবে না)। আমাদের বিকাশকারীদের অবশ্যই এটির একটি নতুন ওএস সংস্করণ প্রাক-চেক করতে হবে এবং এটি সম্ভবত কোনও সমস্যা গোপন করবে। এছাড়াও এই যুক্তির সাহায্যে কেউ চেষ্টা / ধরার সাথে প্রতি কয়েকটি কোড লাইন ঘিরে রাখতে পারে / যা আমার মতে ইতিমধ্যে উল্লিখিত হিসাবে খারাপ অভ্যাস।
প্যাট্রিক

11
আপনি যদি নেভিগেশন বার এবং / বা বিজ্ঞপ্তি দণ্ড বাদ দিয়ে স্ক্রিনের আকার পেতে চান
অ্যান্ড্রয়েড বিকাশকারী

374

একটি উপায়:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

এটি অবহেলা করা হয়েছে এবং এর পরিবর্তে আপনার নীচের কোডটি চেষ্টা করা উচিত। কোডের প্রথম দুটি লাইন আপনাকে DisplayMetricsআপত্তিগুলি দেয় । এই অবজেক্টের মত ক্ষেত্র রয়েছে heightPixels, widthPixels

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

int height = metrics.heightPixels;
int width = metrics.widthPixels;

14
দ্রষ্টব্য যে ডিভাইসের ঘূর্ণনের উপর নির্ভর করে মেট্রিকগুলি (প্রস্থ, উচ্চতা) পরিবর্তন হয়।
টনি চ্যান

8
মেট্রিকগুলি ডিসপ্লেটির আকারটি ফিরিয়ে দেবে, তবে হানিকম্ব এবং তার উপরে, আপনার ক্রিয়াকলাপটি সিস্টেম বারের কারণে ফিরে আসার চেয়ে কম স্থান পাবে।
লোক

3
@ গুয় এটি আপনার প্রয়োগের উপর নির্ভর করে। আপনি স্থিতি বারটি আড়াল করতে পারেন: অনুরোধ উইন্ডো ফিচার (উইন্ডো.এফইএটিচার_এনওআরএল); getWindow ()। setFlags (উইন্ডো ম্যানেজ। লেআউটপ্যারামস.এফএলএজি_ফুলসস্ক্রিন, উইন্ডো ম্যানেজ। লেআউটপ্যারামস.ফ্ল্যাগ_ফুলসস্ক্রেন);
হাজাই এল

79
এছাড়াও এইভাবে বিদ্যমান: getContext ()। GetResferences ()। GetDisplayMetics ()। প্রশস্তপিক্সেল
নিক

চূড়ান্ত ফ্লোট স্কেল = getResferences ()। getDisplayMetrics ()। ঘনত্ব; int প্রস্থ = (অন্তর্) (মেট্রিক্স.উইথপিক্সেল * স্কেল + 0.5f); - এইভাবে এটি করার সময় আপনাকে ডিভাইসের ঘনত্বের জন্য অ্যাকাউন্ট করতে হবে।
পরিত্যক্ত কার্ট

119

এটি আপনার প্রশ্নের উত্তর নাও দিতে পারে, তবে এটি জেনে রাখা কার্যকর হতে পারে (আমি যখন এই প্রশ্নটি এসেছিলাম তখন আমি নিজেই এটি সন্ধান করছিলাম) যে আপনার যদি কোনও ভিউয়ের মাত্রা প্রয়োজন হয় তবে আপনার কোডটি কার্যকর করা হচ্ছে যখন তার বিন্যাসটি এখনও বের করা হয়নি (ইন উদাহরণস্বরূপ onCreate()) আপনি সেটআপ একটি ক্যান ViewTreeObserver.OnGlobalLayoutListenerসঙ্গে View.getViewTreeObserver().addOnGlobalLayoutListener()এবং প্রাসঙ্গিক কোড যে দৃশ্য এর মাত্রা প্রয়োজন হবে। শ্রোতার কলব্যাক কল করা হবে যখন বিন্যাসটি আউট করা হবে।


বা কেবল ভিউ.পোস্ট লিখুন
লুকাশ হানাসেক

ভিউ.পোস্ট যদিও কাজ করার গ্যারান্টিযুক্ত নয়। এটি ঠিক একটি কর্মক্ষেত্র।
মার্শবারে

@ মার্সবার যেখানে এটি বলে View.post()যে কাজ করার নিশ্চয়তা নেই? আমি কৌতূহলী কারণ আমিও বিন্যাসের পরে ভিউয়ের আকার পাওয়ার জন্য এই পদ্ধতির উপর নির্ভর করি এবং এটি অবিশ্বস্ত ছিলাম।
টনি চান

@ টার্বো আমি বলি যে: পি আমরা সেই পরিশ্রম আগেই ব্যবহার করেছিলাম এবং এটি অবিশ্বাস্য বলে প্রমাণিত হয়েছিল। প্রাথমিকভাবে বিন্যাসটি একই ইউআইটিথ্রেড টার্নের মধ্যে ইনিশিয়েশন হিসাবে সম্পন্ন করা হয় um অতএব আপনি পোস্টটি () এর মাধ্যমে পরবর্তী UI টার্নের আগে চালানোর জন্য আপনার কোডটি নির্ধারণ করতে পারেন এবং ভাল হয়ে উঠবেন। দেখা গেছে যে নির্দিষ্ট পরিস্থিতিতে লেআউটিংটি আরও বেশি সময় নিতে পারে এবং পোস্ট কোডটি দৌড়ানোর সময় এখনও দৃশ্যটি বিন্যাস করা হয়নি। আমি এখন যা করি তা হ'ল অনক্রিয়ারে ভিউটি ট্রিউবার্সার যুক্ত করুন এবং প্রথম অন-লেআউটয়ের পরে এটিকে সরিয়ে দিন। লেআউট চলাকালীন প্রথম আপনার জিনিসগুলি শুরু করুন।
মার্শবারে

@ মার্সবার থেকে Viewআপনি কী পেলেন তাতে কিছু আসে ViewTreeObserverযায় না? না তারা সবাই কি একই ভাগ করে দেয়?
টনি চ্যান

109

(২০১২ এর উত্তর, পুরানো হতে পারে) আপনি যদি প্রাক হানিকম্বকে সমর্থন করতে চান তবে আপনাকে এপিআই 13 এর আগে পশ্চাদপটে সামঞ্জস্যতা রাখতে হবে। এর মতো কিছু:

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

অবশ্যই অবহেলিত পদ্ধতিগুলি শেষ পর্যন্ত সর্বাধিক সাম্প্রতিক এসডিকে থেকে সরিয়ে নেওয়া হবে, তবে আমরা এখনও অ্যান্ড্রয়েড ২.১, ২.২ এবং ২.৩ থাকা আমাদের বেশিরভাগ ব্যবহারকারীর উপর নির্ভর করি, তবে আমাদের এটাই বাকি রয়েছে।


হ্যাঁ, এটি ২০১২ সালে ফিরে
এসেছিল

দুঃখিত, আমি কী বলতে চাইছিলাম তা আমাকে পরিষ্কার করার অনুমতি দিন। এটি অত্যন্ত সম্ভাবনা নেই যে কেউ 6/22/2015 অনুসারে <14 এআইপিআই সমর্থন করবে
সুডোকোডার

69

আমি সমস্ত সম্ভাব্য "সমাধান" ব্যর্থ চেষ্টা করেছি এবং আমি লক্ষ্য করেছি যে এলিয়ট হিউজেস "ডালভিক এক্সপ্লোরার" অ্যাপটি যে কোনও অ্যান্ড্রয়েড ডিভাইস / ওএস সংস্করণে সর্বদা সঠিক মাত্রা দেখায়। আমি তার ওপেন সোর্স প্রকল্পটি দেখেছি যা এখানে পাওয়া যাবে: https://code.google.com/p/enh/

এখানে সমস্ত প্রাসঙ্গিক কোড:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

সম্পাদনা: সামান্য উন্নত সংস্করণ (অ সমর্থিত ওএস সংস্করণে ফায়ারিং ব্যতিক্রম এড়ানো):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

9
এটি এখানে একমাত্র পোস্ট যা উইন্ডো সজ্জা (স্ট্যাটাসবার / মেনু বার) বিবেচনা করে। আমার জন্য দুর্দান্ত কাজ
অ্যান্ডি

5
দুর্দান্ত, তবে আপনার কখনই ব্যবসায়িক লজিক আগুন ব্যতিক্রম আশা করা উচিত নয়। ব্যতিক্রম গুলি (এমনকি ধরা পড়লেও) পারফরম্যান্সের জন্য ভয়ঙ্কর। এছাড়াও আপনি এসডিকে.এনপিটি> 13 থাকলে প্রয়োজনের চেয়ে আরও বেশি কাজ করছেন Instead
এরিক বি

3
@ এরিক বি, আমি সম্মত। আমি উন্নত সংস্করণ যুক্ত করেছি। তবুও আমি "এসডিকে 1 এর পর থেকে" অংশটি রেখেছি যখন কিছু চেষ্টা / ধরার ক্ষেত্রে কিছু ভুল হয়ে যায় (আমি অ্যান্ড্রয়েডে অনেকগুলি খারাপ জিনিস দেখেছি বিশেষত যখন আপনি মনে করেন যে এটির কিছু ভুল হওয়া অসম্ভব তাই আমি এটি নিরাপদ রাখতে চাই :)) । যাই হোক না কেন খুব বেশি মাউথ ওভারহেড হওয়া উচিত নয় যেহেতু এই গণনাটি একবারেই করা উচিত (উদাহরণস্বরূপ মানগুলি কিছু স্থির বৈশিষ্ট্যে রাখা যেতে পারে)।
ড্রাগন মারজানভিভিć

8
নোট করুন যে এই কোডটি জিপিএল ভি 3 এর অধীনে লাইসেন্সযুক্ত রয়েছে যা উত্পাদন অ্যাপ্লিকেশনগুলিতে ব্যবহারের জন্য জড়িত।
টকলিটলে

জিপিএল এবং কল করার পদ্ধতিগুলির প্রতিবিম্বের উপর নির্ভর করে যা ভবিষ্যতে অ্যান্ড্রয়েড সংস্করণগুলিতে উপস্থিত নাও হতে পারে। Mhhh
মিশেল

47

সহজ উপায়:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

46

অ্যান্ড্রয়েড ডিভাইসের স্ট্যাটাস বারের উচ্চতা অ্যাক্সেসের জন্য, আমরা এটি পাওয়ার জন্য একটি প্রোগ্রাম্যাটিক পদ্ধতিতে পছন্দ করি:

কোডের উদাহরণ

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

পরিবর্তনশীল resultপিক্সেল মধ্যে উচ্চতা দেয়।

দ্রুত অ্যাক্সেসের জন্য

এখানে চিত্র বিবরণ লিখুন

উচ্চতা সম্পর্কে আরও তথ্যের জন্য Title bar, Navigation barএবং অ্যান্ড্রয়েড ডিভাইস স্ক্রিন আকারগুলিContent View দয়া করে দেখুন ।


ঠিক যেটা আমার দরকার ছিল! getResources().getDisplayMetrics().heightPixels + resultপ্রকৃত পূর্ণস্ক্রিন উচ্চতা দেয়। ড্রাগন মারজানোভিয়ের উত্তরটিও কার্যকর হয় তবে আমি এটি আরও সংক্ষিপ্ত এবং সহজ সমাধানটি পছন্দ করি।
মিশেল

এই পদ্ধতির অ্যান্ড্রয়েড মার্শমেলো হিসাবে পুরানো। স্ট্যাটাস বারের উচ্চতা ডিভাইস বা অ্যান্ড্রয়েড সংস্করণ থেকে পরিবর্তন করতে পারে। আরও ভাল ব্যবহার OnApplyWindowInsetsListener
হেইনরিচ

32

প্রথমে ভিউ পান (উদাহরণস্বরূপ findViewById()) এবং তারপরে আপনি নিজেই ভিউতে getWidth () ব্যবহার করতে পারেন ।


3
এটি আসলে ডকুমেন্টেশন আপনাকে এটি করতে বলে ... তবে আপনি যদি কোনও ভিউ ব্যবহার না করে থাকেন তবে এটি মূর্খ। আপনি অন্য কোনও কিছু ব্যবহার করতে পারেন, যেমন: মিলিগ্রাফারফিউজ।
gcb

2
এটি আরও ভাল কারণ পিতামাতার ভিউটি প্রদর্শনের আকার নাও হতে পারে। তবে নিশ্চিত হয়ে নিন যে এটি এমন এক পর্যায়ে হয়েছে যেখানে আপনি যে আকারটির আকার জিজ্ঞাসা করছেন তা ইতিমধ্যে প্রকাশ করা হয়েছে, যা সাধারণত অনক্রিট () এর অভ্যন্তরে থাকবে না। আপনি উইন্ডোফোকাস চেঞ্জড (বুলিয়ান হ্যানফোকাস) থেকে একটি কাস্টম কলব্যাক ব্যবহার করতে পারেন যা সমস্ত মতামত পরিমাপ করার পরে কল করা হবে এবং এরপরে, আপনার আগ্রহী দৃষ্টিভঙ্গির জন্য আপনি ভুল মাত্রা পাবেন না তা নিশ্চিত করে ...
ডরি

27

আমার দুটি ফাংশন রয়েছে, একটি প্রসঙ্গ প্রেরণের জন্য এবং অন্যটি পিক্সেলগুলিতে উচ্চতা এবং প্রস্থ পাওয়ার জন্য:

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

এবং

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

@SuppressLint("NewApi")সংকলন করতে সক্ষম হতে আপনাকে ক্রিয়াকলাপের স্বাক্ষরের ঠিক ওপরে যুক্ত করতে হবে।
আদিল মালিক

আমি মনে করি এআইপিআইগুলিতে পৃথক কল না করে একযোগে উচ্চতা এবং প্রস্থকে পাওয়া আরও ভাল কারণ অন্যথায় তারা সিঙ্কের বাইরে চলে যেতে পারে। আপনার কোড চলমান অবস্থায় স্ক্রিন ওরিয়েন্টেশন পরিবর্তিত হলে এটি ঘটতে পারে।
স্যাম

17

এক্সএমএল ব্যবহার করে গতিশীল স্কেলিংয়ের জন্য "অ্যান্ড্রয়েড: লেআউট_ ওয়েট" নামে একটি বৈশিষ্ট্য রয়েছে

নীচের উদাহরণটি, এই থ্রেডের সিনিকের প্রতিক্রিয়া থেকে পরিবর্তিত, এমন একটি বোতাম দেখায় যা স্ক্রিনের 75% (ওজন = .25) গ্রহণ করে এবং 25% পর্দার (ওজন = .75) গ্রহণ করে একটি পাঠ্য দর্শন দেখায়।

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>

17

এই কাজের জন্য আমি এই কোডটি ব্যবহার করি:

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

যথেষ্ট পরিচ্ছন্ন এবং তবুও অবমূল্যায়নের যত্ন নেয়।


17

এটি কি আরও ভাল সমাধান নয়? ডিসপ্লেমেট্রিক্স আপনার প্রয়োজনীয় সমস্ত কিছু নিয়ে আসে এবং এপিআই 1 থেকে কাজ করে।

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

আপনি রিয়েলমিট্রিক্স ব্যবহার করে প্রকৃত প্রদর্শন (যেমন পর্দা সজ্জা , যেমন স্ট্যাটাস বার বা সফ্টওয়্যার নেভিগেশন বার সহ) পেতে পারেন তবে এটি কেবল 17+ তে কাজ করে।

আমি কিছু অনুপস্থিত করছি?


1
এটি অন-স্ক্রিন নিয়ন্ত্রণগুলির জন্য স্থান বিয়োগ করছে না (যেমন ট্যাবলেট বা নেক্সাস ডিভাইসগুলিতে)। এছাড়াও, আমি একটি ভিন্ন মান (750 বনাম 800) আমার 10 "ট্যাবলেট উপর, উপর কিনা ভ্রমণ যখন হিসাব সম্পন্ন করা হয় সক্রিয় নির্ভর করে পেতে কিন্তু আমার উদ্দেশ্যে এই জরিমানা বেশী আপনাকে
স্টিভেন এল

15

সবেমাত্র ফ্রান্সেস্কোর উত্তরে যুক্ত হচ্ছে। অন্য পর্যবেক্ষক যে আরও উপযুক্ত, আপনি যদি উইন্ডোতে অবস্থান বা স্ক্রিনের অবস্থানটি সন্ধান করতে চান তবে হ'ল ভিউটিট্রিঅবার্সার Oঅনপ্রিড্রাইলিস্টনার ()

এটি অনক্রিয়ার () সময়ে যেমন অজানা যেমন দর্শনীয় স্ক্রোলড অবস্থান, মাপাকৃত অবস্থানের সাথে সম্পর্কিত এমন কোনও দৃশ্যের অন্যান্য বৈশিষ্ট্যগুলি অনুসন্ধান করতেও ব্যবহার করা যেতে পারে।



15

পর্দার প্রস্থ এবং উচ্চতা সন্ধান করুন:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

এটি ব্যবহার করে, আমরা সর্বশেষ এবং উপরের এসডিকে 13 পেতে পারি।

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}



12

বলা দরকার, আপনি যদি না থাকেন Activityতবে তবে View(বা আপনার ক্ষেত্রের Viewধরণের পরিবর্তনশীল থাকতে পারে ) ব্যবহার করার দরকার নেই WINDOW_SERVICE। তারপরে আপনি কমপক্ষে দুটি উপায় ব্যবহার করতে পারেন।

প্রথম:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

দ্বিতীয়ত:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

আমরা এখানে যে সমস্ত পদ্ধতি বলি তা হ্রাস করা হয় না।


12
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}

11

স্ক্রিনের মাত্রা পাওয়ার জন্য ডিসপ্লে মেট্রিক ব্যবহার করুন

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

উচ্চতা এবং প্রস্থ পিক্সেল পান

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;

9

এটি ওপির পক্ষে কোনও উত্তর নয়, কারণ তিনি বাস্তব পিক্সেলগুলিতে প্রদর্শনের মাত্রা চেয়েছিলেন। আমি "ডিভাইস-ইন্ডিপেন্ডেন্ট-পিক্সেল" -এর মাত্রা চেয়েছিলাম এবং এখান থেকে উত্তরগুলি একত্রে https://stackoverflow.com/a/17880012/253938 এবং এখানে https://stackoverflow.com/a/6656774/253938 এ এসেছি এর সাথে:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);

9

আপনি ব্যবহার করে উচ্চতার আকার পেতে পারেন :

getResources().getDisplayMetrics().heightPixels;

এবং প্রস্থের আকার ব্যবহার করে

getResources().getDisplayMetrics().widthPixels; 

8

ডিসপ্লেমেট্রিক্স (এপিআই 1) ব্যবহার করে এটি করার একটি অ-অবহেলিত উপায় রয়েছে, যা চেষ্টা / ধরা পড়ার চেষ্টাটিকে এড়িয়ে চলে:

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

8

আমি এইভাবে getSize কোড মোড়ানো হবে:

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

এটি অ্যান্ড্রয়েড 4.0 (এপিআই 14) চালিত কোনও এমুলেটরটিতে ক্র্যাশ হয়ে গেছে।
jww

6

যিনি ব্যবহারযোগ্য পর্দার মাত্রা সন্ধান করছেন For ছাড়া স্ট্যাটাস বার এবং অ্যাকশন দণ্ডে (এছাড়াও Swapnil এর উত্তর ধন্যবাদ):

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    screen_h -= getResources().getDimensionPixelSize(resId);
}

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}

6

প্রথমে এক্সএমএল ফাইলটি লোড করুন এবং তারপরে এই কোডটি লিখুন:

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

আপনার পর্দার রেজোলিউশন অনুযায়ী প্রস্থ এবং উচ্চতা দেখান।


6

নীচের পদ্ধতিগুলি অনুসরণ করুন:

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}

6

Kotlin

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

5

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

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

যদি কোনও কারণে আপনি অ্যান্ড্রয়েড ম্যানিফেস্টে অন্য ক্রিয়াকলাপ যোগ করতে না চান তবে আপনি এটি এইভাবে করতে পারেন:

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

স্পষ্টতই, আপনি বান্ডলে উচ্চতাও পিছনে যেতে পারেন।
স্টিভ ওয়ারিং

5

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

উদাহরণস্বরূপ, যদি আপনার এক্সএমএল এর থেকে শুরু করে:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

তারপরে findViewById(R.id.entireLayout).getWidth()স্ক্রীনটির প্রস্থ findViewById(R.id.entireLayout).getHeight()ফিরে আসবে এবং স্ক্রিনের উচ্চতা ফিরে আসবে।

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