以编程方式将LayoutParams上的高度设置为与密度无关的像素

psy*_*tik 122 android android-layout

有没有办法将LayoutParams的高度/宽度设置为与密度无关的像素(dp)?看起来像编程时设置的高度/宽度是以像素为单位而不是dp.

Mok*_*kus 270

您需要将您的dip值转换为像素:

int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, <HEIGHT>, getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)

对我来说这就是诀窍.

  • 我认为getActivity().getResources().getDimension(resourceID)执行正确的转换操作. (10认同)
  • 适合我,但它有所不同......如果我使用上面的方法设置ImageView的宽度/高度与使用xml.在XML中我设置了85dp,而上面的方法需要"75"才能产生相同的大小.知道为什么吗? (3认同)

Had*_*des 12

 public static int getDPI(int size, DisplayMetrics metrics){
     return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;        
 }
Run Code Online (Sandbox Code Playgroud)

像这样调用这个函数,

DisplayMetrics metrics;
metrics = new DisplayMetrics();         
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int heigh = getDPI(height or width, metrics);
Run Code Online (Sandbox Code Playgroud)


Gun*_*ein 6

因为它可能会被多次使用:

public static int convDpToPx(Context context, float dp) {
    DisplayMetrics metrics = context.getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
}
Run Code Online (Sandbox Code Playgroud)

我发现使用转换率更实际,因为通常需要转换多个值.由于转换率不会改变,因此可节省一些处理时间.

/**
 * Get conversion rate from dp into px.<br>
 * E.g. to convert 100dp: px = (int) (100 * convRate);
 * @param context e.g. activity
 * @return conversion rate
 */
public static float convRateDpToPx(Context context) {
    return context.getResources().getDisplayMetrics().densityDpi / 160f;
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*man 5

这是我的片段:

public class DpiUtils {

    public static int toPixels(int dp, DisplayMetrics metrics) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
    }

}
Run Code Online (Sandbox Code Playgroud)

哪里 DisplayMetrics metrics = getResources().getDisplayMetrics()