programing

안드로이드 및 dp 단위로 프로그래밍된 폭 및 높이 설정

powerit 2023. 10. 15. 18:08
반응형

안드로이드 및 dp 단위로 프로그래밍된 폭 및 높이 설정

저는 하고 있어요.

button.setLayoutParams(new GridView.LayoutParams(65, 65));

문서에 따르면 폭과 높이에 대한 단위(위의 65개 모두)는 "픽셀"입니다.어떻게 이것을 디바이스 독립 픽셀, 즉 "dp"로 강제할 수 있습니까?

디스플레이 스케일 팩터를 사용하여 dps에서 픽셀로 변환해야 합니다.

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

이것이 오래된 질문이라는 것을 알고 있지만 이 전환을 수행하는 훨씬 더 나은 방법을 찾았습니다.

자바

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

코틀린

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

테스트된 가장 간단한 방법(그리고 심지어 API 1에서 작동)은 다음과 같습니다.

getResources().getDimensionPixelSize(R.dimen.example_dimen);

설명서에서:

원시 픽셀의 크기로 사용하기 위해 특정 리소스 ID에 대한 치수를 검색합니다.이는 getDimension(int)과 동일하지만, 반환된 값이 크기로 사용하기 위해 정수 픽셀로 변환된다는 점을 제외하고는 동일합니다.크기 변환은 기준 값을 반올림하고 0이 아닌 기준 값이 최소 1픽셀 크기가 되도록 하는 것을 포함합니다.

네, 값을 반올림하지만 매우 나쁘지는 않습니다(ldpi와 ldpi 장치의 홀수 값에서 ldpi가 매우 흔하지 않을 때 약간의 값을 추가해야 함). 저는 4dp를 16(픽셀)으로 변환하는 xxhdpi 장치에서 테스트했고 그것은 사실입니다.

고객님의 요구 사항을 살펴보면, 대체 솔루션도 있습니다.컴파일 시 dp 단위를 알고 있는 것 같으니 리소스에 dimension 항목을 추가할 수 있습니다.그런 다음 치수 항목을 조회할 수 있으며 이 호출에서 자동으로 픽셀로 변환됩니다.

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

dimens.xml은 다음과 같습니다.

<dimen name="dimen_entry_in_dp">72dp</dimen>

이 아이디어를 확장하면 1dp 또는 1sp의 값을 디멘 엔트리로 저장하고 값을 쿼리하여 승수로 사용할 수 있습니다.이 방법을 사용하면 수학적인 것으로부터 코드를 절연하고 계산을 수행하기 위해 라이브러리에 의존하게 됩니다.

drspaceboo의 솔루션을 기반으로 Kotlin을 사용하면 확장을 사용하여 변환할 수 있습니다.Float좀 더 쉽게 물에 담그기 위해서.

fun Float.toDips() =
        TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, resources.displayMetrics);

용도:

(65f).toDips()

코틀린 버전

val scale: Float = resources.displayMetrics.density
val resizedInDp = (stream.videoWidth * scale + 0.5f).toInt()

용도:-

val params: ViewGroup.LayoutParams = yourLayout!!.layoutParams
            val scale: Float = resources.displayMetrics.density
            params.width = (widthDp * scale + 0.5f).toInt() // dp to px
            params.height =
                (heightDp * scale + 0.5f).toInt() // setting height according to aspect ratio
            yourLayout!!.layoutParams = params

간단히 사용할 수 있습니다.androidx.annotation

@Dimension(unit = Dimension.DP)
private static final int strokeWidth = 1; 

언급URL : https://stackoverflow.com/questions/5255184/android-and-setting-width-and-height-programmatically-in-dp-units

반응형