Можно ли задавать поля LinearLayout, программно, но не с пикселями, но dp?
Поля LinearLayout, программно с dp
Ответ 1
Вы можете использовать DisplayMetrics и определить плотность экрана. Что-то вроде этого:
int dpValue = 5; // margin in dips
float d = context.getResources().getDisplayMetrics().density;
int margin = (int)(dpValue * d); // margin in pixels
Как я помню, лучше использовать напольные покрытия для смещений и округления для ширины.
Ответ 2
У меня была такая же проблема, и я использовал эту технику для ее решения:
Сначала я добавил файл xml в папку res/values с именем dimension.xml. Это выглядит так:
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<dimen name="my_margin">5dip</dimen>
</resources>
Во-вторых, в моем коде я получил эквивалент пикселя этого поля следующим образом (обратите внимание, что я использую Xamarin, так что это код С#, но чистая версия Java должна быть очень похожей):
int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin);
Наконец, я создаю свои параметры макета:
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);
Ответ 3
Вы можете преобразовать dp в px, например преобразовать 5dp в px:
Resources r = mContext.getResources();
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());
Ответ 4
Следующий метод работает для меня для преобразования пикселей в dp:
int pixelToDP(int pixel) {
final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density;
return (int) ((pixel * scale) + 0.5f);
}
Ответ 5
конвертировать DP в значение пикселя
int Whatever_valueInDP=10;//value in dp
int Value_In_Pixel= (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources()
.getDisplayMetrics());
Ответ 6
Ну что ж, ребята из kotlin, у меня есть полезный помощник, который отлично работает :)
fun setMarginsInDp(v: View, l: Int, t: Int, r: Int, b: Int) {
if (v.layoutParams is ViewGroup.MarginLayoutParams){
val screenDensity: Float = v.context.resources.displayMetrics.density
val params: ViewGroup.MarginLayoutParams = v.layoutParams as ViewGroup.MarginLayoutParams
params.setMargins(l*screenDensity.toInt(), t*screenDensity.toInt(), r*screenDensity.toInt(), b*screenDensity.toInt())
v.requestLayout()
}
}
Просто перейдите в действительный вид и все настроено!