Apakah setWidth (int piksel) menggunakan piksel independen perangkat atau piksel fisik sebagai unit? Misalnya, apakah setWidth (100) menyetel lebar tampilan ke 100 dips atau 100 px?
Terima kasih.
Apakah setWidth (int piksel) menggunakan piksel independen perangkat atau piksel fisik sebagai unit? Misalnya, apakah setWidth (100) menyetel lebar tampilan ke 100 dips atau 100 px?
Terima kasih.
Jawaban:
Ini menggunakan piksel, tapi saya yakin Anda bertanya-tanya bagaimana cara menggunakan dips. Jawabannya ada TypedValue.applyDimension()
. Berikut adalah contoh cara mengonversi dips ke px dalam kode:
// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Cara yang benar untuk mendapatkan sejumlah DIP yang konstan dalam kode adalah dengan membuat file XML sumber daya yang berisi nilai dp seperti:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="image_width">100dp</dimen>
<dimen name="image_height">75dp</dimen>
</resources>
Kemudian rujuk ke sumber daya dalam kode Anda seperti:
float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));
Float yang Anda kembalikan akan diskalakan sesuai dengan kepadatan piksel perangkat dan jadi Anda tidak perlu terus mereplikasi metode konversi di seluruh aplikasi Anda.
Metode setWidth (100), atur 100 px sebagai lebar (bukan dalam dp). Jadi Anda mungkin menghadapi masalah lebar yang bervariasi pada ponsel Android yang berbeda.Jadi gunakan pengukuran dalam dp, bukan piksel. Gunakan kode di bawah ini untuk mendapatkan pengukuran dalam dp dari lebar sampel = 300px dan tinggi = 400px.
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());
int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;
Piksel tentu saja, metode ini meminta piksel sebagai parameter.
Berdasarkan jawaban di atas yang berfungsi dengan baik bagi saya, saya menghasilkan beberapa metode pembantu , cukup tambahkan di utilitas Anda untuk menggunakannya di seluruh proyek.
// value in DP
public static int getValueInDP(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
public static float getValueInDP(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
// value in PX
public static int getValueInPixel(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}
public static float getValueInPixel(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}