ඇන්ඩ්‍රොයිඩ් හි තිරයේ මානයන් පික්සෙල් ලෙස ලබා ගන්නේ කෙසේද


1850

මම අභිරුචි අංග කිහිපයක් නිර්මාණය කළ අතර, ඒවා ක්‍රමයෙන් ඉහළ දකුණු කෙළවරට තැබීමට මට අවශ්‍යය ( nඉහළ දාරයේ සිට mපික්සල් සහ දකුණු දාරයේ සිට පික්සෙල්). එබැවින් මට තිරයේ පළල සහ තිරයේ උස ලබා ගත යුතු අතර පසුව පිහිටීම සැකසිය යුතුය:

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

මම කොහොමද ලබා ගන්නේ කෙසේද screenWidthහා screenHeightප්රධාන ක්රියාකාරකම් තුළ?


Px වෙනුවට dp භාවිතා කරන්න. මන්ද එය ඔබගේ පිරිසැලසුම වෙනත් උපාංග සමඟ විකෘති කරනු ඇත ..
සර් ඊ අහමර්

GetResources () මගින් ගුණ කිරීමට අමතක නොකරන්න. GetDisplayMetrics (). දර්ශන පරිමාණය සඳහා ගිණුමට
dens නත්වය

මෙයින් ඔප්පු වන්නේ වැඩිපුරම ඡන්දය දුන් පිළිතුර සැමවිටම හොඳම නොවන බවයි (සහ බොහෝ දෙනෙක් නියෝජිතයින් සඳහා පිළිතුරු පුනරාවර්තනය කරති). GetSize සහ අතහැර දැමූ getWidth / getHeight combo වෙනුවට (දෝෂ නොසලකා හැරීම), Balaji.K ගේ උත්සාහ කරන්න getMetrics. නික් ඔහුගේ පිළිතුරෙහි getDisplayMetricsදැක්වෙන්නේ පද්ධතිය / තත්ව තීරුවේ ප්‍රමාණය සලකා බැලීමට පවා පැහැදිලි කරයි . එසේම ඔබ භාවිතා කළ හැක ඝනත්වය jmaculate ලෙස LoungeKatt තිබීම පැහැදිලි නිශ්චිත අගය: DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;ඇන්ඩ්රොයිඩ් v2.2 (API 8) පරීක්ෂාවට ලක් කර යහපත් ප්රතිඵල සහ සමග v4.0 කිසිදු දෝෂයක් / අනතුරු ඇඟවීම් .
ආම්ෆූට්

DisplayMetrics displaymetrics = නව DisplayMetrics (); getWindowManager (). getDefaultDisplay (). getMetrics (displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics.widthPixels;
අසාහාර්

මෙම DisplayMetrics ලබා ගැනීමට තවත් ක්රමයක්: Resources.getSystem().getDisplayMetrics(). Contextඒවා ලබා ගැනීමට ඔබට අවශ්‍ය නොවනු ඇත.
TAG

Answers:


3482

ඔබට දර්ශන මානයන් පික්සෙල් වලින් අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය 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 () (java වලින්).

getSizeහඳුන්වාදීමට පෙර (API මට්ටමේ 13), ඔබට දැන් අතහැර දමා ඇති ක්‍රම getWidthසහ getHeightක්‍රම භාවිතා කළ හැකිය :

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

කෙසේ වෙතත් ඔබ විස්තර කරන භාවිත අවස්ථාව සඳහා, පිරිසැලසුමේ ආන්තිකය / පෑඩින් කිරීම වඩාත් සුදුසු බව පෙනේ.

තවත් ක්‍රමයක් නම්: DisplayMetrics

සංදර්ශකයක් පිළිබඳ සාමාන්‍ය තොරතුරු විස්තර කරන ව්‍යුහයක්, එහි ප්‍රමාණය, ity නත්වය සහ අකුරු පරිමාණය වැනි. DisplayMetrics සාමාජිකයින්ට ප්‍රවේශ වීම සඳහා, මෙවැනි වස්තුවක් ආරම්භ කරන්න:

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

මේ widthPixelsසඳහා තොරතුරු ලබා ගැනීමට අපට භාවිතා කළ හැකිය:

"දර්ශනයේ නිරපේක්ෂ පළල පික්සල් වලින්."

උදාහරණයක්:

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

13
getWidth () හෝ getSize ()? API <13 සහ API> 13 මත ධාවනය කිරීමට මගේ යෙදුම අවශ්‍ය නම් මා භාවිතා කරන්නේ කුමක්ද?
කැරොල්

52
උත්සාහ කරන්න {display.getSize (ප්‍රමාණය); width = size.x; height = size.y; } ඇල්ලීම (NoSuchMethodError e) {width = display.getWidth (); height = display.getHeight (); }
ආර්නාඩ්

250
try/catchඑවැනි චෙක්පතක් සඳහා ඔබට භාවිතා කිරීමට අවශ්‍ය ඇයිදැයි මට නොපෙනේ ? if (android.os.Build.VERSION.SDK_INT >= 13)විසි කළ ව්‍යතිරේකයකින් තොරව සරලව භාවිතා නොකරන්නේ ඇයි ? try/catchසාමාන්‍ය යෙදුම් ප්‍රවාහයක නරක පුරුද්දක් ලෙස මම සිතමි .
පැට්රික්

2
@ A-Live එවිට යෙදුමද බිඳී යනු ඇත (නමුත් බිඳ වැටෙන්නේ නැත). අපි සංවර්ධකයින් නව OS අනුවාදයක් පූර්ව පරීක්‍ෂා කළ යුතු අතර මෙය ගැටලුවක් සඟවා ගත හැකිය. මෙම තර්කය සමඟ යමෙකුට උත්සාහ කළ හැකි / අල්ලා ගැනීමේදී සෑම කේත රේඛා කිහිපයක්ම වට කළ හැකිය. මගේ මතය අනුව දැනටමත් සඳහන් කර ඇති පරිදි එය නරක පුරුද්දකි.
පැට්රික්

11
සංචාලන තීරුව සහ / හෝ දැනුම්දීම් තීරුව හැර ඔබට තිරයේ ප්‍රමාණය ලබා ගැනීමට අවශ්‍ය නම්
ඇන්ඩ්‍රොයිඩ් සංවර්ධක

375

එක් ක්‍රමයක් නම්:

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;

15
උපාංගයේ භ්‍රමණය අනුව ප්‍රමිතික (පළල, උස) වෙනස් වන බව සලකන්න.
ටෝනි චාන්

8
ප්‍රමිතික මඟින් දර්ශනයේ ප්‍රමාණය නැවත ලබා දෙනු ඇත, නමුත් HoneyComb සහ ඉහළට, ඔබේ ක්‍රියාකාරකම පද්ධති තීරුව නිසා ආපසු ලබා දුන් ප්‍රමාණයට වඩා අඩු ඉඩක් ඇත.
ගයි

3
Uy එය ඔබගේ ක්‍රියාත්මක කිරීම මත රඳා පවතී. ඔබට තත්ව තීරුව සැඟවිය හැක: requestWindowFeature (කවුළුව. FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
හගයි එල්

79
මේ ආකාරයෙන් ද පවතී: getContext (). GetResources (). GetDisplayMetrics (). WidthPixels
Nik

අවසාන පාවෙන පරිමාණය = getResources (). getDisplayMetrics (). ity නත්වය; int width = (int) (metrics.widthPixels * scale + 0.5f); - උපාංග dens නත්වය ඒ ආකාරයෙන් කරන විට ඔබ ගණන් ගත යුතුය.
අතහැර දැමූ කරත්ත

120

එය ඔබගේ ප්‍රශ්නයට පිළිතුරු නොදක්වනු ඇත, නමුත් එය දැන ගැනීම ප්‍රයෝජනවත් විය හැකිය (මම මෙම ප්‍රශ්නයට පැමිණි විට එය මා විසින්ම සොයමින් සිටියෙමි) ඔබට දර්ශන මානයක් අවශ්‍ය නම් ඔබේ කේතය එහි පිරිසැලසුම තවමත් සකසා නොමැති විට ක්‍රියාත්මක වේ. (උදාහරණයක් සඳහා onCreate()) ඔබ පිහිටුවන්නේ හැකි ViewTreeObserver.OnGlobalLayoutListenerසමග View.getViewTreeObserver().addOnGlobalLayoutListener()සහ එහි දැක්ම ගේ මානයක් අවශ්ය බව අදාළ කේතය ය. පිරිසැලසුම සකස් කර ඇති විට සවන්දෙන්නන්ගේ ඇමතුම කැඳවනු ලැබේ.


හෝ view.post ලියන්න
ලූකස් හනසෙක්

view.post වැඩ කිරීමට සහතික නැත. එය හුදෙක් වැඩ කිරීමකි.
මාස්බයර්

View.post()වැඩ කිරීමට සහතිකයක් නැතැයි මාස්බයර් කොහෙද කියන්නේ ? මම කුතුහලයෙන් සිටිමි, මන්ද මම පිරිසැලසුමෙන් පසු දර්ශන ප්‍රමාණයක් ලබා ගැනීම සඳහා මෙම ක්‍රමය මත විශ්වාසය තබන අතර එය විශ්වාස කළ නොහැකි බව නොදැන සිටියෙමි.
ටෝනි චාන්

Ur ටර්බෝ මම මෙසේ කියමි: p අපි මීට පෙර එම ක්‍රියාමාර්ගය භාවිතා කළ අතර එය විශ්වාස කළ නොහැකි විය. එම ක්‍රියාමාර්ගය පදනම් වී ඇත්තේ උපකල්පනය මත ය, මුලින් පිරිසැලසුම සිදු කරනු ලබන්නේ ආරම්භක අවස්ථාවේදීම එකම UIThread හැරීම තුළ ය. එබැවින් ඊළඟ යූඅයි පෝස්ට් () හරහා හැරවීමට පෙර ඔබේ කේතය උපලේඛනගත කර හොඳින් විය හැකිය. යම් යම් තත්වයන් යටතේ පිරිසැලසුම ඊටත් වඩා කාලයක් ගතවනු ඇති අතර, තැපැල් කේතය ක්‍රියාත්මක වන විට දර්ශනය තවමත් සැකසී නොමැත. මම දැන් කරන්නේ onCreate හි ViewTreeObserver එකතු කර පළමු onLayout පසු එය ඉවත් කිරීමයි. පළමු පළමු පිරිසැලසුම අතරතුර ඔබේ දේවල් ආරම්භ කරන්න.
මාර්ස්බයර්

මාස්බයර් Viewඔබට ලැබෙන්නේ කුමන කාරණයෙන්ද ViewTreeObserver? නැත්නම් ඔවුන් සියල්ලන්ම එක හා සමානද?
ටෝනි චාන්

109

(2012 පිළිතුර, යල් පැන ගිය එකක් විය හැකිය) ඔබට පෙර පැණි වදයට සහය දැක්වීමට අවශ්‍ය නම්, ඒපීඅයි 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();
}

ඇත්ත වශයෙන්ම අවලංගු කරන ලද ක්‍රම නවීනතම SDK වලින් ඉවත් කරනු ඇත, නමුත් අපි තවමත් ඇන්ඩ්‍රොයිඩ් 2.1, 2.2 සහ 2.3 ඇති අපගේ බොහෝ පරිශීලකයින් මත විශ්වාසය තබන අතර, අපට ඉතිරිව ඇත්තේ මෙයයි.


ඔව්, මෙය නැවත 2012 දී සිදු විය.
digiphd

කණගාටුයි, මා අදහස් කළ දේ පැහැදිලි කිරීමට මට ඉඩ දෙන්න. 6/22/2015 වන විට කිසිවෙකු API <14 සඳහා සහය දැක්වීම අතිශයින්ම අපහසුය
sudocoder

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

සංස්කරණය කරන්න: තරමක් වැඩිදියුණු කළ අනුවාදය (සහය නොදක්වන OS අනුවාදයේ වෙඩි තැබීම් වලින් වළකින්න):

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
නියමයි, කෙසේ වෙතත් ඔබ කිසි විටෙකත් ව්‍යාපාර තර්කන ගිනි ව්‍යතිරේකයන් බලාපොරොත්තු නොවිය යුතුය. ව්‍යතිරේක වෙඩි තැබීම (අල්ලා ගත් විට පවා) කාර්ය සාධනය සඳහා භයානක ය. SDK_INT> 13 නම් ඔබ අවශ්‍ය ප්‍රමාණයට වඩා වැඩ කරයි. ඒ වෙනුවට, ඔබ Build.VERSION.SDK_INT හි ifs කිහිපයක් එකතු කළ යුතුය.
එරික් බී

3
@ එරික් බී, මම එකඟයි. මම වැඩි දියුණු කළ අනුවාදයක් එක් කළෙමි. උත්සාහ කිරීමේදී / අල්ලා ගැනීමේදී යම්කිසි වැරැද්දක් සිදුවුවහොත් මම "එස්ඩීකේ 1 සිට" කොටස අතහැර දැමුවෙමි (ඇන්ඩ්‍රොයිඩ් හි බොහෝ නරක දේවල් මම දැක ඇත්තෙමි, විශේෂයෙන් යමක් වැරදියට කළ නොහැකි යැයි ඔබ සිතන විට එය ආරක්ෂිතව තබා ගැනීමට මම කැමතියි :)) . කෙසේ වෙතත්, මෙම ගණනය කිරීම කළ යුත්තේ එක් වරක් පමණක් බැවින් (උදා: අගයන් සමහර ස්ථිතික ගුණාංගවල තබා ගත හැකිය).
ඩ්‍රැගන් මාජානොවික්

8
මෙම කේතය ජීපීඑල් වී 3 යටතේ බලපත්‍ර ලබා ඇති අතර එය නිෂ්පාදන යෙදුම්වල භාවිතා කිරීමට ඇඟවුම් කරයි.
TalkLittle

ජීපීඑල් සහ අනාගත ඇන්ඩ්‍රොයිඩ් සංස්කරණවල නොතිබිය හැකි ඇමතුම් ක්‍රම සඳහා පරාවර්තනය මත පදනම්ව. ම්හ්
මයිකල්


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
මෙය ඇත්ත වශයෙන්ම ප්‍රලේඛනය ඔබට එය කිරීමට පවසන ආකාරයයි ... නමුත් ඔබ දර්ශනයක් භාවිතා නොකරන්නේ නම් එය අර්ථ විරහිත ය. ඔබ වෙනත් දෙයක් භාවිතා කරනවා විය හැකිය, උදා: mglsurfaceview.
gcb

2
මවු දර්ශනය දර්ශනයේ ප්‍රමාණය නොවිය හැකි බැවින් මෙය වඩා හොඳය. නමුත් මෙය සිදු කර ඇති බවට වග බලා ගන්න ඔබ විමසන දර්ශනය දැනටමත් සකස් කර ඇති අතර එය සාමාන්‍යයෙන් onCreate () තුළ නොපවතිනු ඇත. OnWindowFocusChanged (boolean hasFocus) වෙතින් ඔබට අභිරුචි ඇමතුමක් ලබා ගත හැකි අතර එය සියලු අදහස් මනින ලද පසු කැඳවනු ලැබේ. එසේ නම්, ඔබ උනන්දුවක් දක්වන දර්ශනය සඳහා වැරදි මානයන් නොලැබෙන බව සහතික කරයි ...
Dori

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

XML භාවිතා කරමින් ගතිකව පරිමාණය කිරීම සඳහා "android: Layout_weight" නමින් ගුණාංගයක් ඇත.

මෙම ත්‍රෙඩ් එකේ සයිනික් ප්‍රතිචාරයෙන් වෙනස් කරන ලද පහත උදාහරණයෙන්, තිරයෙන් 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;
}

GetRealMetrics භාවිතයෙන් ඔබට සත්‍ය දර්ශනය (තත්ව තීරුව හෝ මෘදුකාංග සංචාලන තීරුව වැනි තිර අලංකරණ ඇතුළුව) ලබා ගත හැකිය , නමුත් මෙය ක්‍රියාත්මක වන්නේ 17+ මත පමණි.

මට යමක් මග හැරී තිබේද?


1
එය තිරයේ පාලනයන් සඳහා ඉඩ අඩු නොකරයි (ටැබ්ලට් හෝ නෙක්සස් උපාංග වැනි). ගණනය කිරීම් සිදු කරන විට ක්‍රියාකාරකම සක්‍රීයද යන්න මත පදනම්ව, මගේ 10 "ටැබ්ලටයේ වෙනස් අගයක් (750 එදිරිව 800) ලබා ගනිමි.නමුත් මගේ අරමුණු සඳහා මෙය දඩයට වඩා වැඩිය. ස්තූතියි!
ස්ටීවන් එල්

15

ෆ්‍රැන්චෙස්කෝගේ පිළිතුරට එකතු කිරීම පමණි. කවුළුවේ හෝ තිරයේ ඇති ස්ථානය සොයා ගැනීමට ඔබට අවශ්‍ය නම් වඩාත් යෝග්‍ය අනෙක් නිරීක්ෂකයා වන්නේ ViewTreeObserver.OnPreDrawListener ()

OnCreate () වේලාවේදී බොහෝ දුරට නොදන්නා දර්ශනයක වෙනත් ගුණාංග සොයා ගැනීමට මෙය භාවිතා කළ හැකිය. උදා: අනුචලනය කළ ස්ථානය, පරිමාණය කළ ස්ථානය.



15

තිරයේ පළල සහ උස සොයා ගන්න:

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

මෙය භාවිතා කිරීමෙන් අපට නවතම සහ ඉහළ SDK 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);
    }
}

12

තිර මානයන් ලබා ගැනීම සඳහා දර්ශන මෙට්‍රික්ස් භාවිතා කරන්න

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

සැබෑ පික්සෙල් වලින් දර්ශන මානයන් අවශ්‍ය වූ බැවින් මෙය OP සඳහා පිළිතුරක් නොවේ. මට "උපාංග-ස්වාධීන-පික්සල්" හි මානයන් අවශ්‍ය වූ අතර, මෙතැන් සිට පිළිතුරු එකතු කිරීම 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 (API 14) ධාවනය වන ඉමුලේටරයක් ​​මත බිඳ වැටේ.
jww

6

තත්ව තීරුව සහ ක්‍රියාකාරී තීරුව නොමැතිව භාවිතා කළ හැකි තිර මානයන් සොයන්නේ කවුරුන් සඳහාද (ස්වප්නිල්ගේ පිළිතුරට ස්තූතියි):

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

පළමුව XML ගොනුව පටවා මෙම කේතය ලියන්න:

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

කොට්ලින්

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 හි ඉහළම දර්ශන අයිතමයේ උස සහ පළල ගුණාංග අල්ලා ගත හැකිය, එහි උස සහ පළල ගැලපෙන_පෙරන්ට් ලෙස සකසා තිබේ නම්. (ඔබේ පිරිසැලසුම මුළු තිරයම ගන්නා තාක් කල් මෙය සත්‍යයකි.)

උදාහරණයක් ලෙස, ඔබේ XML ආරම්භ වන්නේ මේ වගේ දෙයක් සමඟ නම්:

<?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()නැවත ලබා දෙන අතර තිරයේ උස නැවත ලබා දෙනු ඇත.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.