Adakah cara untuk menemukan secara terprogram apakah perangkat tempat aplikasi dipasang adalah tablet 7 inci atau tablet 10 inci?
Adakah cara untuk menemukan secara terprogram apakah perangkat tempat aplikasi dipasang adalah tablet 7 inci atau tablet 10 inci?
Jawaban:
Anda dapat menggunakan DisplayMetrics
untuk mendapatkan banyak informasi tentang layar tempat aplikasi Anda berjalan.
Pertama, kami membuat DisplayMetrics
objek metrik:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Dari sini, kita bisa mendapatkan informasi yang dibutuhkan untuk mengukur tampilan:
int widthPixels = metrics.widthPixels;
int heightPixels = metrics.heightPixels;
Ini akan mengembalikan nilai absolut dari lebar dan tinggi dalam piksel, jadi 1280x720 untuk Galaxy SIII, Galaxy Nexus, dll.
Ini biasanya tidak membantu dengan sendirinya, karena saat kami bekerja pada perangkat Android, kami biasanya lebih suka bekerja dalam piksel kepadatan independen, celupkan.
Anda mendapatkan density
layar menggunakan metrics
lagi, dalam bentuk faktor skala untuk perangkat, yang didasarkan pada Sumber Daya Desain Android untuk mdpi
, hdpi
dll.
float scaleFactor = metrics.density;
Dari hasil ini, kita dapat menghitung jumlah piksel independen kepadatan yang ada untuk tinggi atau lebar tertentu.
float widthDp = widthPixels / scaleFactor
float heightDp = heightPixels / scaleFactor
Hasil yang Anda peroleh dari ini akan membantu Anda memutuskan jenis layar yang Anda gunakan dalam hubungannya dengan contoh Konfigurasi Android , yang memberi Anda dp relatif untuk setiap ukuran layar:
- 320dp: layar ponsel biasa (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, dll).
- 480dp: tablet tweener seperti Streak (480x800 mdpi).
- 600dp: tablet 7 inci (600x1024 mdpi).
- 720dp: tablet 10 inci (720x1280 mdpi, 800x1280 mdpi, dll).
Menggunakan informasi di atas, kita tahu bahwa jika lebar terkecil perangkat lebih besar dari 600dp, perangkat tersebut adalah tablet 7 ", jika lebih besar dari 720dp, perangkat tersebut adalah tablet 10".
Kita bisa menghitung lebar terkecil menggunakan min
fungsi Math
class, meneruskan heightDp
dan widthDp
untuk mengembalikan smallestWidth
.
float smallestWidth = Math.min(widthDp, heightDp);
if (smallestWidth > 720) {
//Device is a 10" tablet
}
else if (smallestWidth > 600) {
//Device is a 7" tablet
}
Namun, ini tidak selalu memberi Anda kecocokan persis, terutama saat bekerja dengan tablet yang tidak dikenal yang mungkin salah merepresentasikan kepadatannya sebagai hdpi padahal sebenarnya bukan, atau yang mungkin hanya 800 x 480 piksel namun masih pada layar 7 " .
Lebih jauh ke metode ini, jika Anda perlu mengetahui dimensi perangkat yang tepat dalam inci, Anda dapat mengetahuinya juga, menggunakan metrics
metode berapa banyak piksel yang ada per inci layar.
float widthDpi = metrics.xdpi;
float heightDpi = metrics.ydpi;
Anda dapat menggunakan pengetahuan tentang berapa banyak piksel dalam setiap inci perangkat dan jumlah total piksel untuk menentukan berapa inci perangkat tersebut.
float widthInches = widthPixels / widthDpi;
float heightInches = heightPixels / heightDpi;
Ini akan mengembalikan tinggi dan lebar perangkat dalam inci. Ini sekali lagi tidak selalu membantu untuk menentukan jenis perangkat itu, karena ukuran perangkat yang diiklankan adalah diagonal, yang kami miliki hanyalah tinggi dan lebarnya.
Namun, kita juga tahu bahwa mengingat tinggi segitiga dan lebarnya, kita dapat menggunakan teorema Pythagoras untuk menghitung panjang hipotenusa (Dalam hal ini, ukuran layar diagonal).
//a² + b² = c²
//The size of the diagonal in inches is equal to the square root of the height in inches squared plus the width in inches squared.
double diagonalInches = Math.sqrt(
(widthInches * widthInches)
+ (heightInches * heightInches));
Dari sini, kita dapat mengetahui apakah perangkat itu tablet atau bukan:
if (diagonalInches >= 10) {
//Device is a 10" tablet
}
else if (diagonalInches >= 7) {
//Device is a 7" tablet
}
Dan begitulah cara Anda menghitung jenis perangkat yang Anda gunakan.
if (smallestWidth > 600) { /* 7" */ } else if (smallestWidth > 720) { /* 10" */ }
salah: 10 "tablet dikenali sebagai 7". Saya mengambil kebebasan untuk memperbaikinya.
resources.getConfiguration().smallestScreenWidthDp
dari jawaban DeeV yang merupakan satu-satunya metode yang memberikan nilai yang sama baik dalam potret maupun lanskap pada Nexus 7 saya (600dp). Itu ditambahkan di API level 13.
Tidak ada yang mengatakan 7"
atau 10"
AFAIK. Ada sekitar dua cara untuk mendapatkan dimensi layar yang digunakan sistem saat mendekode bitmap dan yang lainnya. Keduanya ditemukan di objek aplikasi yang Resources
ditemukan di Context
.
Yang pertama adalah Configuration
benda yang bisa diperoleh getContext().getResources().getConfiguration()
. Di dalamnya Anda memiliki:
Configuration#densityDpi
- Kepadatan layar target yang sedang dirender, sesuai dengan qualifier sumber daya kepadatan.
Configuration#screenHeightDp
- Ketinggian saat ini dari ruang layar yang tersedia, dalam unit dp, sesuai dengan kualifikasi sumber daya tinggi layar.
Configuration#screenWidthDp
- Lebar saat ini dari ruang layar yang tersedia, dalam satuan dp, sesuai dengan kualifikasi sumber daya lebar layar.
Configuration#smallestScreenWidthDp
- Ukuran layar terkecil yang akan dilihat aplikasi dalam operasi normal, sesuai dengan qualifier sumber daya lebar layar terkecil.
Dengan itu, Anda dapat cukup banyak menggunakan pedoman layar untuk mencari tahu apakah perangkat Anda menarik dari folder sumber daya khusus masing-masing ( hdpi
, xhdpi
, large
, xlarge
, dll).
Ingat, ini adalah beberapa ember:
layar kecil setidaknya 426dp x 320dp
320dp: layar ponsel biasa (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, dll).
Yang kedua adalah DisplayMetrics
benda yang diperoleh getContext().getResources().getDisplayMetrics()
. Dalam hal itu Anda memiliki:
DisplayMetrics#density
- Kepadatan logis layar.
DisplayMetrics#densityDpi
- Kepadatan layar dinyatakan sebagai titik per inci.
DisplayMetrics#heightPixels
- Tinggi absolut tampilan dalam piksel.
DisplayMetrics#widthPixels
- Lebar absolut tampilan dalam piksel.
DisplayMetrics#xdpi
- Piksel fisik yang tepat per inci dari layar dalam dimensi X.
DisplayMetrics#ydpi
- Piksel fisik per inci yang tepat dari layar dalam dimensi Y.
Ini berguna jika Anda membutuhkan jumlah piksel layar yang tepat, bukan kepadatan. Namun, penting untuk dicatat bahwa ini semua adalah piksel layar. Tidak hanya yang tersedia untuk Anda.
smallestScreenWidthDp
. Berbeda dengan solusi lain, ini memberikan nilai yang sama pada Nexus 7 saya (600dp) terlepas dari orientasinya . Sebagai bonus, ini juga merupakan kode paling sederhana!
tempatkan metode ini di onResume () dan dapat diperiksa.
public double tabletSize() {
double size = 0;
try {
// Compute screen size
DisplayMetrics dm = context.getResources().getDisplayMetrics();
float screenWidth = dm.widthPixels / dm.xdpi;
float screenHeight = dm.heightPixels / dm.ydpi;
size = Math.sqrt(Math.pow(screenWidth, 2) +
Math.pow(screenHeight, 2));
} catch(Throwable t) {
}
return size;
}
umumnya tablet dimulai setelah ukuran 6 inci.
Hal di atas tidak selalu berfungsi saat beralih potret vs. lanskap.
Jika Anda menargetkan API level 13+, semudah yang dijelaskan di atas - gunakan Configuration.smallestScreenWidthDp, lalu uji sesuai:
resources.getConfiguration().smallestScreenWidthDp
Jika tidak, jika Anda mampu membelinya, gunakan metode berikut yang merupakan pendekatan yang sangat akurat untuk mendeteksi 600dp (seperti 6 ") vs. 720dp (seperti 10") dengan membiarkan sistem memberi tahu Anda:
1) Tambahkan ke layout-sw600dp dan layout-sw720dp (dan jika ada, lanskapnya) tampilan yang tidak terlihat dengan ID yang sesuai, misalnya:
Untuk 720, pada layout-sw720dp:
<View android:id="@+id/sw720" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>
Untuk 600, pada layout-sw600dp:
<View android:id="@+id/sw600" android:layout_width="0dp" android:layout_height="0dp" android:visibility="gone"/>
2) Kemudian pada kode, misalnya, Aktivitas, uji sesuai:
private void showFragment() {
View v600 = (View) findViewById(R.id.sw600);
View v720 = (View) findViewById(R.id.sw720);
if (v600 != null || v720 !=null)
albumFrag = AlbumGridViewFragment.newInstance(albumRefresh);
else
albumFrag = AlbumListViewFragment.newInstance(albumRefresh);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.view_container, albumFrag)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.commit();
}
Informasi hebat, hanya apa yang saya cari! Namun, setelah mencoba ini, saya menemukan bahwa saat menggunakan metrik yang disebutkan di sini, Nexus 7 (model 2012) melaporkan memiliki dimensi 1280x736. Saya juga memiliki Motorola Xoom yang menjalankan Jelly Bean dan salah melaporkan resolusi 1280x752. Saya menemukan posting ini di sini yang menegaskan ini. Pada dasarnya, di ICS / JB penghitungan menggunakan metrik yang disebutkan di atas tampaknya mengecualikan dimensi Bilah Navigasi. Beberapa penelitian lebih lanjut membawa saya pada jawaban Frank Nguyen di sini yang menggunakan metode berbeda yang akan memberi Anda dimensi piksel mentah (atau nyata) dari layar. Pengujian awal saya telah menunjukkan bahwa kode berikut dari koreksi Frank melaporkan dimensi pada Nexus 7 (model 2012 runnin JB) dan Motorola Xoom saya menjalankan JB:
int width = 0, height = 0;
final DisplayMetrics metrics = new DisplayMetrics();
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = null, mGetRawW = null;
try {
// For JellyBeans and onward
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
display.getRealMetrics(metrics);
width = metrics.widthPixels;
height = metrics.heightPixels;
} else {
mGetRawH = Display.class.getMethod("getRawHeight");
mGetRawW = Display.class.getMethod("getRawWidth");
try {
width = (Integer) mGetRawW.invoke(display);
height = (Integer) mGetRawH.invoke(display);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (NoSuchMethodException e3) {
e3.printStackTrace();
}
Saya memiliki dua perangkat android dengan resolusi yang sama
Perangkat1 -> resolusi ukuran layar diagonal 480x800 -> 4,7 inci
Device2 -> resolusi ukuran layar diagonal 480x800 -> 4,0 inci
Ini memberi kedua ukuran layar diagonal perangkat -> 5,8
solusi untuk masalahmu adalah ..
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width=dm.widthPixels;
int height=dm.heightPixels;
int dens=dm.densityDpi;
double wi=(double)width/(double)dens;
double hi=(double)height/(double)dens;
double x = Math.pow(wi,2);
double y = Math.pow(hi,2);
double screenInches = Math.sqrt(x+y);
lihat detailnya di sini ..
Cara Android menentukan ukuran layar adalah melalui empat ukuran umum: kecil , normal , besar , dan xlarge .
Sedangkan dokumentasi Android menyatakan bahwa kelompok ukuran tidak digunakan lagi
... grup ukuran ini tidak digunakan lagi karena mendukung teknik baru untuk mengelola ukuran layar berdasarkan lebar layar yang tersedia. Jika Anda mengembangkan untuk Android 3.2 dan yang lebih baru, lihat [Menyatakan Tata Letak Tablet untuk Android 3.2] (hdpi (tinggi) ~ 240dpi) untuk informasi selengkapnya.
Umumnya penentu ukuran besar menentukan tablet 7 ". Dan penentu ukuran xlarge menentukan tablet 10":
Hal yang menyenangkan tentang memicu pada pengualifikasi ukuran, adalah Anda dapat menjamin bahwa aset dan kode Anda sesuai dengan aset mana yang akan digunakan atau jalur kode yang akan diaktifkan.
Untuk mengambil pengualifikasi ukuran dalam kode, lakukan panggilan berikut:
int sizeLarge = SCREENLAYOUT_SIZE_LARGE // For 7" tablet
boolean is7InchTablet = context.getResources().getConfiguration()
.isLayoutSizeAtLeast(sizeLarge);
int sizeXLarge = SCREENLAYOUT_SIZE_XLARGE // For 10" tablet
boolean is10InchTablet = context.getResources().getConfiguration()
.isLayoutSizeAtLeast(sizeXLarge);
Anda dapat menggunakan metode di bawah ini untuk mendapatkan ukuran layar dalam inci, berdasarkan itu Anda dapat memeriksa tablet atau ponsel mana perangkat tersebut.
private static double checkDimension(Context context) {
WindowManager windowManager = ((Activity)context).getWindowManager();
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
display.getMetrics(displayMetrics);
// since SDK_INT = 1;
int mWidthPixels = displayMetrics.widthPixels;
int mHeightPixels = displayMetrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
try
{
Point realSize = new Point();
Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize);
mWidthPixels = realSize.x;
mHeightPixels = realSize.y;
}
catch (Exception ignored) {}
DisplayMetrics dm = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(dm);
double x = Math.pow(mWidthPixels/dm.xdpi,2);
double y = Math.pow(mHeightPixels/dm.ydpi,2);
double screenInches = Math.sqrt(x+y);
Log.d("debug","Screen inches : " + screenInches);
return screenInches;
}
Saya menyimpan nilai dalam folder nilai yang memberi saya layar 7 inci atau 10 inci tetapi kami dapat melakukannya untuk perangkat apa pun menggunakan folder nilai.
seperti membuat folder nilai-2 yang berbeda untuk 2 perangkat yang berbeda. Tapi hal ini tergantung kebutuhan.
Anda harus melakukan sedikit komputasi menggunakan data yang diberikan oleh kelas DisplayMetrics .
Anda memiliki heightPixel dan widthPixels (resolusi layar dalam piksel)
Anda memerlukan diagonal karena 'ukuran layar inci' selalu menggambarkan panjang diagonal. Anda bisa mendapatkan layar diagonal dalam piksel (menggunakan pythagore)
diagonalPixel = √ (heightPixel² + widthPixels²)
maka Anda dapat mengubah nilai piksel menjadi inci berkat nilai densityDPI:
inchDiag = diagonalPixel / densityDPI.
Saya harap saya tidak membuat kesalahan di sini, ketahuilah bahwa nilai yang Anda peroleh dari kelas DisplayMetrics diberikan oleh konstruktor, tampaknya (dalam kasus yang sangat jarang) tidak diatur dengan baik sesuai dengan materi fisik ...
Ini akan memberi Anda ukuran layar fisik tetapi mungkin ini bukan cara yang lebih baik untuk mengelola banyak tata letak. Lebih lanjut tentang topik ini
Cara lain:
Buat 2 folder lagi: values-large + values-xlarge
Letakkan: <string name="screentype">LARGE</string>
di folder besar nilai (strings.xml)
Letakkan: <string name="screentype">XLARGE</string>
di folder values-xlarge (strings.xml)
Dalam kode:
String mType = getString (R.string.screentype);
if (mType! = null && mType.equals ("BESAR") {
// dari 4 ~ 7 inci
} lain jika (mType! = null && mType.equals ("XLARGE") {
// dari 7 ~ 10 inci
}
1. Fungsi pembantu untuk mendapatkan lebar layar:
private float getScreenWidth() {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
return Math.min(metrics.widthPixels, metrics.heightPixels) / metrics.density;
}
2. Berfungsi untuk mengetahui apakah suatu perangkat adalah tablet
boolean isTablet() {
return getScreenWidth() >= 600;
}
3. Terakhir, jika Anda ingin melakukan operasi yang berbeda untuk ukuran perangkat yang berbeda:
boolean is7InchTablet() {
return getScreenWidth() >= 600 && getScreenWidth() < 720;
}
boolean is10InchTablet() {
return getScreenWidth() >= 720;
}
Berikut beberapa ekstensi kotlin yang berguna:
fun DisplayMetrics.isTablet(): Boolean {
return screenWith() >= 600
}
fun DisplayMetrics.is7InchTablet(): Boolean {
return screenWith() >= 600 && screenWith() < 720
}
fun DisplayMetrics.is10InchTablet(): Boolean {
return screenWith() >= 720
}
fun DisplayMetrics.screenWith(): Float {
return widthPixels.coerceAtMost(heightPixels) / density
}
Resources
dalam Context
: resources.displayMetrics.isTablet()
atau dari WindowManager
yang disimpan di Activity
: val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.isTablet()