programing

Android에서 런타임에 dp 또는 dip 측면에서 화면 너비를 결정하는 방법은 무엇입니까?

topblog 2023. 8. 21. 19:25
반응형

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

반응형