Android에서 런타임에 dp 또는 dip 측면에서 화면 너비를 결정하는 방법은 무엇입니까?
dip/dp(java 파일)를 사용하여 안드로이드 위젯의 레이아웃을 코딩해야 합니다.런타임에 코드를 작성하면,
int pixel=this.getWindowManager().getDefaultDisplay().getWidth()
;
화면 너비(픽셀)를 반환합니다.이를 dp로 변환하기 위해 코드화했습니다.
int dp =pixel/(int)getResources().getDisplayMetrics().density ;
이것은 정답을 반환하지 않는 것 같습니다.저는 화면 해상도가 480x800인 WVGA800의 에뮬레이터를 만들었습니다.에뮬레이터를 실행하고 코드가 픽셀과 dp의 값을 인쇄하도록 했을 때, 둘 다 320이 되었습니다.이 에뮬레이터는 스케일 팩터가 0.75인 240dpi입니다.
@Tomáš Hubalek가 언급했듯이,
다음과 같은 방법을 사용해 보십시오.
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
OR
오래된 답변 시도:
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);
float density = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth = outMetrics.widthPixels / density;
구글에서 우연히 이 질문을 발견했고, 나중에 API >= 13에 유효한 쉬운 솔루션을 발견했습니다.
향후 참조용:
Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.
구성 클래스 참조 참조
편집: Nick Baicoianu가 지적한 것처럼 화면의 사용 가능한 너비/높이가 반환됩니다(대부분의 용도에서 흥미로운 너비/높이여야 함).실제 디스플레이 치수가 필요한 경우 상단 답변을 그대로 유지합니다.
2023년 Kotlin에 대한 답변 간소화:
val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }
하나의 라이너로서:
val (height, width) = resources.displayMetrics.run { heightPixels/density to widthPixels/density }
제트팩 구성의 경우:
val (height, width) = LocalConfiguration.current.run { screenHeightDp.dp to screenWidthDp.dp }
대신 이것을 사용하는 것이 어떻습니까?
final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;
기본 밀도 값인 160이 없습니다.
2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
3 px = 2 dip if dpi == 240(hdpi), 840x480 screen
즉, 세로 모드에서 160dip과 동일한 너비로 레이아웃을 설계하면 모든 ldpi/mdpi/hdpi 장치(태블릿 제외)에서 화면의 절반이 됩니다.
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;
int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;
int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;
int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;
코틀린으로 대답하기:
context?.let {
val displayMetrics = it.resources.displayMetrics
val dpHeight = displayMetrics.heightPixels / displayMetrics.density
val dpWidth = displayMetrics.widthPixels / displayMetrics.density
}
한 줄로 구성하는 새로운 세계에서.
val (height, width) = LocalConfiguration.current.run { screenHeightDp.dp to screenWidthDp.dp }
DP 측면에서 화면 너비와 높이를 좋은 장식으로 가져옵니다.
1단계: 인터페이스 생성
public interface ScreenInterface {
float getWidth();
float getHeight();
}
2단계: 구현자 클래스 만들기
public class Screen implements ScreenInterface {
private Activity activity;
public Screen(Activity activity) {
this.activity = activity;
}
private DisplayMetrics getScreenDimension(Activity activity) {
DisplayMetrics displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics;
}
private float getScreenDensity(Activity activity) {
return activity.getResources().getDisplayMetrics().density;
}
@Override
public float getWidth() {
DisplayMetrics displayMetrics = getScreenDimension(activity);
return displayMetrics.widthPixels / getScreenDensity(activity);
}
@Override
public float getHeight() {
DisplayMetrics displayMetrics = getScreenDimension(activity);
return displayMetrics.heightPixels / getScreenDensity(activity);
}
}
3단계: 활동의 폭과 높이를 확인합니다.
Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();
이전 응답을 기준으로 사용할 복사/붙여넣기 기능입니다.
/**
* @param context
* @return the Screen height in DP
*/
public static float getHeightDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
return dpHeight;
}
/**
* @param context
* @return the screnn width in dp
*/
public static float getWidthDp(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
return dpWidth;
}
화면 너비만 알고 싶다면 개발자 옵션에서 "가장 작은 화면 너비"를 검색하면 됩니다.편집도 가능합니다.
문제는 플로트를 int로 주조하여 정밀도를 떨어뜨리는 것입니다.또한 인자를 곱해야 하며 나누어서는 안 됩니다.
수행할 작업:
int dp = (int)(pixel*getResources().getDisplayMetrics().density);
언급URL : https://stackoverflow.com/questions/6465680/how-to-determine-the-screen-width-in-terms-of-dp-or-dip-at-runtime-in-android
'programing' 카테고리의 다른 글
nginx의 캐시를 지우는 방법은 무엇입니까? (0) | 2023.08.21 |
---|---|
jQuery를 사용하여 요소를 천천히 제거하는 방법은 무엇입니까? (0) | 2023.08.21 |
Oracle의 Oracle BulkCopy 클래스입니다.ManagedDataAccess.dll? (0) | 2023.08.21 |
PhoneGap 및 jQuery를 사용하는 도메인 간 요청이 작동하지 않음 (0) | 2023.08.21 |
MySQL NULL 또는 NOT NULL 그게 질문입니까? (0) | 2023.08.21 |