কীভাবে অ্যান্ড্রয়েড স্ক্রিনের আকারটি প্রোগ্রামেমেটিকভাবে একবারে এবং সকলের জন্য পাবেন?


132

টাচ ইভেন্টগুলি ব্যবহার করা ইউনিটগুলিতে এবং পরিমাপ / বিন্যাস দেখুন কীভাবে আমি আমার স্ক্রিনের আকার প্রোগ্রামটিমে খুঁজে পেতে পারি? অন্য কথায়, আমি স্ক্রিনের নীচে-ডান কোণার স্থানাঙ্কগুলি, টাচ ইভেন্টগুলি ব্যবহার করা স্থানাঙ্ক ব্যবস্থায় ' getRawX()/getRawY()এবং View.getLocationOnScreen()

আমি পছন্দসই ইভেন্ট / ভিউ ইউনিটগুলিকে "পিক্সেল" বলতে দ্বিধায় রয়েছি যেহেতু স্পষ্টতই বিভিন্ন ফোনে আমার ফোনে "পিক্সেল" এর বিভিন্ন ধারণা রয়েছে এবং তারা একটি ধারাবাহিক গল্প জুড়ে দিচ্ছে না।

আমি এই জিজ্ঞাসা করা হয়েছে এবং Stackoverflow উপর এবং অন্যত্র অনেক বললেন, কিন্তু দেখতে কেউ উত্তর আমার ফোনে আসলে কাজের (4 Droid, 4.1.2 Android) সব মোড মধ্যে:

(কি দারুন!)

এটি লাইব্রেরি কোডের জন্য যা অ্যাপ্লিকেশনটি "স্ক্রিনের সামঞ্জস্যতা মোডে" (অর্থাত্ টার্গেটএসডিপি ভার্সন <= 10 ম্যানিফেস্টে) আছে কিনা তা বিবেচনা করেই কাজ করা দরকার এবং আমি অবস্থান, আকার সম্পর্কে কোনও অনুমানও করতে চাই না , বা স্ট্যাটাস বার বা অন্য কোনও অনুরূপ স্ক্রিন সজ্জায় অস্তিত্ব।


এখানে তথ্যগুলি:

  1. আমার ফোনে (একটি অ্যান্ড্রয়েড 4 চলমান অ্যান্ড্রয়েড 4.1.2) এর 540x960 শারীরিক পিক্সেল রয়েছে, অর্থাত্ সামান্য রঙিন আলোকিত বিন্দু।

  2. অ্যাপ্লিকেশনটি স্ক্রিনের কম্প্যাট মোডে না থাকাকালীন অ্যাপ্লিকেশনটি স্ক্রিনের কম্প্যাট মোডে থাকা অবস্থায় টাচ ইভেন্টগুলি এবং দেখুন পরিমাপগুলি দেখার থেকে পছন্দসই ইউনিটগুলির পর্দার আকার 360x640 হয়। এগুলি আমি খুঁজে পাওয়ার জন্য টাচ ইভেন্টগুলি বা ভিউগুলিকে ব্যঙ্গ না করে প্রোগ্রামগতভাবে সন্ধান করতে চাইছি তবে এই সংখ্যাগুলি ফিরে আসবে এমন কোনও API খুঁজে পেতে আমার চরম অসুবিধা হচ্ছে।

  3. প্রদর্শন এবং প্রদর্শনমেট্রিক্স অবজেক্টগুলি বিভিন্ন উপায়ে প্রাপ্ত সমস্ত দাবি করে পর্দার আকার 540x960 "পিক্সেল" (স্ক্রিনের কম্প্যাট মোডে থাকুক না কেন)। সুনির্দিষ্ট হওয়ার জন্য, নিম্নলিখিতগুলি সর্বদা 540x960 বলে: ডিসপ্লেমেট্রিক্স {প্রস্থ, উচ্চতা} পিক্সেল, ডিসপ্লে.গেটসাইজ (), প্রদর্শন.বিগ্রহী আকার (), ডিসপ্লে.জেট {প্রস্থ, উচ্চতা} (),

  4. কনফিগারেশন অবজেক্টগুলি বিভিন্ন উপায়ে প্রাপ্ত স্ক্রিন {প্রস্থ, উচ্চতা} ডিপি = 360x614 (স্ক্রিনের কম্প্যাট মোডে থাকুক না কেন) বলবে। আমি বিশ্বাস করি না যে পুরো পর্দার প্রতিনিধিত্ব করে, কারণ দিক অনুপাতটি ভুল। (আমি মনে করি এটি পুরো স্ক্রিনটি স্ট্যাটাস বারকে বিয়োগ করবে; আমার পুরো স্ক্রিনটি প্রয়োজন)) আমি নিরাপদ বলেছি যে পুরো পর্দাটি 360x640 ডিপি, যদিও আমি এমন কোনও এপিআই জানি না যা 640 ফেরত দেয়।

  5. বিভিন্ন উপায়ে প্রাপ্ত ডিসপ্লেমেট্রিক্স বলে যে স্ক্রিনের কমপ্যাট মোডে "ঘনত্ব" 1.0f, স্ক্রিনের কমপ্যাট মোডে না থাকাকালীন 1.5f is

  6. ক্রিয়াকলাপটি getWindow().getAttributes().{width,height} সহায়ক নয় কারণ এটিতে MATCH_PARENT প্রকৃত আকারের চেয়ে সাধারণত থাকে । কিন্তু আমি দৃশ্যত থেকে পছন্দসই উত্তর পেতে পারেন একটি কার্যকলাপ এর getWindow().getDecorView().getMeasured{Width,Height}() (যা আসলে যেহেতু কার্যকলাপ রয়েছে উইন্ডোর decorView নেই বিস্ময়কর চেহারা মত পুরো পর্দা আপ নিচ্ছে এটা দেখে মনে হচ্ছে এটা পর্দা বিয়োগ স্ট্যাটাস বার গ্রহণ করা হয়েছে)। তবে আমি এটির উপর নির্ভর করতে চাই না কারণ উইন্ডোটি যদি কখনও আকার পরিবর্তন করে (নরম কীবোর্ড প্রদর্শিত হয়? কেউ উইন্ডোটি সেট করে Aঅ্যাট্রিবিউটস ()? অথবা সম্ভবত আমি কোনও ক্রিয়াকলাপে আছি না), এটি স্পষ্টভাবে সব কিছু হতে চলেছে ভুল।

আমি বুঝতে নিম্নলিখিত সূত্র ধরে অনুমিত হয়: পিক্সেল = ডিপি * ঘনত্ব সব রিপোর্ট সংখ্যার সাথে একমত বলে মনে হয় যে ((3) (4), (5) উপরে) যখন না স্ক্রীন উপযুক্ততা মোড মধ্যে: 540x960 = 360x640 * 1.5 তবে স্ক্রিনের সামঞ্জস্যতা মোডে এটি যুক্ত হয় না: 540x960! = 360x640 * 1 সুতরাং, কিছু শঙ্কিত।

আমি মনে করি, এর সহজ ব্যাখ্যাটি হ'ল উপরের তালিকাভুক্ত পদ্ধতিগুলি (3) কেবলমাত্র পিক্সেলগুলির জন্য ভুল উত্তর দিচ্ছে যখন স্ক্রিনের কমপ্যাট মোডে থাকে - অর্থাৎ, তাদের উদ্দেশ্য ছিল 360x640 "পিক্সেল" ফিরিয়ে দেওয়া কিন্তু তারা ভুলভাবে ছিল পরিবর্তে 540x960 ফিরছে। তবে এটি দেখার অন্যান্য উপায়ও থাকতে পারে।

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

আমার রেসিপিটি এখানে:

/** get screen size in "pixels", i.e. touchevent/view units.
* on my droid 4, this is 360x640 or 540x960
* depending on whether the app is in screen compatibility mode
* (i.e. targetSdkVersion<=10 in the manifest) or not. */
public void getScreenSizePixels(int widthHeightInPixels[/*2*/])
{
    Resources resources = getResources();
    Configuration config = resources.getConfiguration();
    DisplayMetrics dm = resources.getDisplayMetrics();
    // Note, screenHeightDp isn't reliable
    // (it seems to be too small by the height of the status bar),
    // but we assume screenWidthDp is reliable.
    // Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels
    // (they get confused when in screen compatibility mode, it seems),
    // but we assume their ratio is correct.
    double screenWidthInPixels = (double)config.screenWidthDp * dm.density;
    double screenHeightInPixels = screenWidthInPixels * dm.heightPixels / dm.widthPixels;
    widthHeightInPixels[0] = (int)(screenWidthInPixels + .5);
    widthHeightInPixels[1] = (int)(screenHeightInPixels + .5);
}

পর্দার আকার খুঁজে পাওয়ার জন্য আরও ভাল / ক্লিনার কোন উপায় আছে ??


29
+1 দুর্দান্ত প্রশ্ন, এবং প্রচুর গবেষণা প্রচেষ্টা দেখায়।
অ্যালেক্স গিত্তেমিয়ার

1
@Don সালে ডক্স , এটা ব্যাখ্যা করা হয় যে সঙ্গতি মোড করছেন বন্ধ করবে অপারেশন পুরোনো স্থাপনার এ "মাপসই জুম"। তবে আপনার পর্যবেক্ষণ থেকে এটি "এটি কীভাবে কাজ করে" স্পষ্টভাবে ব্যাখ্যা করা হয়নি, আমি মনে করি তারা কেবল ঘনত্বের স্কেলিং বন্ধ করে, অর্থাৎ: 1px 1dp হয় p এটি হতে পারে যে এই পরিবর্তনটি কেবল রেন্ডারিং অংশে রয়েছে এবং DisplayMetricsএই জাতীয় পরিবর্তনগুলি কখনই আপডেট হয় না। মত বিষয় আছে এই ইতিমধ্যে দায়ের করেন।
এসডি

@ ব্যবহারকারী 117 - আকর্ষণীয়। ওয়েল অংশ DisplayMetrics এর 1.0 পরিবর্তিত least-- ঘনত্ব এ আপডেট করা হয়েছে। তবে প্রস্থপিক্সেল / উচ্চতাপিক্সেলগুলি ম্যাচে পরিবর্তন হয় নি, মনে হয়। উত্সাহিত ইস্যুটি সম্পর্কে, দেখে মনে হচ্ছে এটি আচরণটি 3.1 আচরণে ফিরে গেছে (যেমন আমি উচ্চতা পিক্সেলগুলিতে স্ট্যাটাস বারটি অন্তর্ভুক্ত করছি ... তবে ভুল ইউনিটে এটি মনে হয়)
ডন হ্যাচ

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

BTW! আমার সন্দেহের রেখার সাথে এখানে কিছু দেওয়া আছে: michael.richter.name/blogs/… ( উদাঃ দেখুন তার (1) পয়েন্টটি, দ্রুত তৈরি করা উত্তরগুলির মধ্যে একটি - আসলে এই প্রশ্নটির ক্ষেত্রে কেবল এটিই!)। শুভ এনওয়াই, যাইহোক (আমার 11 মিনিটের মধ্যে আসে)! :)
mlvljr

উত্তর:


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

এখন আপনি আপনার পর্দার আকার পিক্সেলে পরিমাপ করতে পারেন যা সেন্টিমিটারের চেয়ে ভাল পরিমাপের একক কারণ সমস্ত বোতাম, পাঠ্যদর্শন ইত্যাদি .. এই ইউনিটে পরিমাপ করা হয়। যা আমি সাধারণত ব্যবহার করি


3
ওপ অনুসারে (পয়েন্ট # 3 বিশেষত), স্ক্রিন কম্প্যাট মোডে এটি ভুল হবে না?
টম

9

ডিসপ্লেমেট্রিক্স ব্যবহার করে আপনি যে কোনও ডিভাইসের স্ক্রিনের উচ্চতা এবং প্রস্থ পেতে পারেন। নোট করুন যে প্রস্থ এবং উচ্চতা ঘূর্ণনের জন্য সংবেদনশীল। এখানে কোড।

DisplayMetrics metrics; 
int width = 0, height = 0;

আপনার অনক্রিট পদ্ধতিতে

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

 height = Math.min(metrics.widthPixels, metrics.heightPixels); //height
 width = Math.max(metrics.widthPixels, metrics.heightPixels); //width

এটা চেষ্টা কর.


2
না, যেমন আমি (3) তে বলেছি, মেট্রিক্স {প্রস্থ, উচ্চতা screen পিক্সেল স্ক্রিনের সামঞ্জস্যতা মোডে যখন সঠিক উত্তর দিচ্ছে না
ডন হ্যাচ

এছাড়াও আমি আবিষ্কার করেছি: মনে হচ্ছে লাইট মেট্রিক্স he হাইপপিক্সেলগুলি স্ক্রিনটি ঘোরানো এবং তদ্বিপরীত ক্ষেত্রে প্রস্থ দিতে পারে!
জনিটেক্স

8

আপনার # In-তে আপনি নোট করেছেন যে ডেকোরভিউ আপনাকে যা চান তা প্রদান করে বলে মনে হয় তবে আপনি এটি সত্যিকারের বলে মনে করেন না। আমি বিশ্বাস করতে পারি যে আপনি আসতে পারেন কাছাকাছি। ডকুমেন্টেশন অনুসারে Window.getDecorView:

শীর্ষ স্তরের উইন্ডো সজ্জা দর্শনটি পুনরুদ্ধার করুন (এর মধ্যে স্ট্যান্ডার্ড উইন্ডো ফ্রেম / সজ্জা এবং তার মধ্যে ক্লায়েন্টের সামগ্রী রয়েছে), যা উইন্ডো ম্যানেজারটিতে উইন্ডো হিসাবে যুক্ত করা যেতে পারে।

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

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


5

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

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);   
    width = metrics.heightPixels;
    height = metrics.widthPixels;

যেমন আমি বলেছিলাম এটি সঠিক নাও হতে পারে তবে আমি জানি না তবে এটি আমার পক্ষে কাজ করেছিল।


আপনার পর্দাটি ঘোরানো হয়েছে বলেই আমি বিশ্বাস করি।
জনিটেক্স

এটা আমার বিশ্বাস ছিল না।
অভ্যদৈশ্রনেত

3

আপনি যদি এপিআই স্তরের 17 বা ততোধিক উচ্চতর ব্যবহারের জন্য getRealMetrics এবং প্রদর্শনে getRealSize ব্যবহার করেন

এপিআই স্তরের জন্য 14,15 এবং 16 এখানে দেখুন


3

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

DisplayMetrics met = new DisplayMetrics();                
this.getWindowManager().getDefaultDisplay().getMetrics(met);// get display metrics object
String strSize = 
new DecimalFormat("##.##").format(Math.sqrt(((met.widthPixels / met.xdpi) *
(met.widthPixels / met.xdpi)) +
((met.heightPixels / met.ydpi) * (met.heightPixels / met.ydpi))));
// using Dots per inches with width and height

পাইথাগোরাস অবশ্যই একজন বুদ্ধিমান ছিলেন, তিনি এত বছর আগে স্মার্ট ফোন প্রোগ্রামিংটি জানতেন: পি


1

ডিভাইসের প্রশস্ততা পেতে আমি নীচের পদ্ধতিটি ব্যবহার করি:

public static int getDeviceWidth(Context context){
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    int width=display.getWidth();
    return width;
}

এই পদ্ধতিটি হ্রাস করা হয়। দয়া করে প্রদর্শনমেট্রিক্স পদ্ধতিটি ব্যবহার করুন।
সাইমন

0

আমি মনে করি এই ফাংশনটি আপনাকে কেবল আপনার অ্যান্ড্রয়েড স্ক্রিনের আকারের প্রস্থ এবং উচ্চতা পেতে সহায়তা করবে। ফাংশনটি নীচের চিত্রের মতো পূর্ণসংখ্যার অ্যারের হিসাবে প্রস্থ এবং উচ্চতা প্রদান করে

private int[] getScreenSIze(){
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
        int h = displaymetrics.heightPixels;
        int w = displaymetrics.widthPixels;

        int[] size={w,h};
        return size;

    }

এবং আপনার তৈরি পদ্ধতির আউটপুটে আপনার প্রস্থ এবং উচ্চতা নীচের মত দেখাচ্ছে

 int[] screenSize= getScreenSIze();
        int width=screenSize[0];
        int height=screenSize[1];
        screenSizes.setText("Phone Screen sizes \n\n  width = "+width+" \n Height = "+height);

উত্স কোডটি ডাউনলোড করুন এবং এটি আপনার অ্যান্ড্রয়েড স্টুডিওতে পরীক্ষা করুন


0

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

int প্রস্থ = রিসোর্স.জেটসিস্টেম ()। getDisplayMetrics ()। প্রস্থপিক্সেল;

int উচ্চতা = রিসোর্স.জেটসিস্টেম ()। getDisplayMetrics ()। উচ্চতাপিক্সেল;

আমি আমার আইটেমগুলির প্রস্থকে অনুভূমিক পুনর্ব্যবহারকারী দৃশ্যে আপডেট করার জন্য এটি ব্যবহার করেছি ((আমার প্রয়োজনীয়তা অনুসারে) আশা করি এটি কাউকে সহায়তা করবে!


-1

কোটলিনে এই সমাধানের জন্য , এটি ব্যবহার করে দেখুন:

private fun yourFunction(){
   val metrics = DisplayMetrics()
   windowManager.defaultDisplay.getMetrics(metrics)
   val width = metrics.widthPixels
   val height = metrics.heightPixels
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.