Margins of a LinearLayout, programmatically with dp

后端 未结 6 1878
生来不讨喜
生来不讨喜 2020-12-01 01:12

Is it possible to set the Margins of a LinearLayout, programmatically but not with pixels, but dp?

相关标签:
6条回答
  • 2020-12-01 01:42

    You can use DisplayMetrics and determine the screen density. Something like this:

    int dpValue = 5; // margin in dips
    float d = context.getResources().getDisplayMetrics().density;
    int margin = (int)(dpValue * d); // margin in pixels
    

    As I remember it's better to use flooring for offsets and rounding for widths.

    0 讨论(0)
  • 2020-12-01 01:44

    You can convert dp to px, for example convert 5dp to px:

    Resources r = mContext.getResources();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, r.getDisplayMetrics());
    
    0 讨论(0)
  • 2020-12-01 01:53

    I had the same issue and used this technique to solve it:

    First, I added an xml file to my res/values folder called dimensions.xml. It looks like this:

    <?xml version="1.0" encoding="utf-8" ?>
    <resources>
      <dimen name="my_margin">5dip</dimen>
    </resources>
    

    Second, in my code, I got the pixel equivalent of that margin as follows (note I'm using Xamarin so this is C# code, but the pure Java version should be very similar):

    int myMarginPx = Resources.GetDimensionPixelSize(Resource.Dimension.my_margin);
    

    Finally, I create my layout params:

    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent);
    layoutParams.SetMargins(myMarginPx, myMarginPx, myMarginPx, myMarginPx);
    
    0 讨论(0)
  • 2020-12-01 01:58

    The following method works for me for converting pixels to dp:

    int pixelToDP(int pixel) {
        final float scale = RaditazApplication.getInstance().getResources().getDisplayMetrics().density;
        return (int) ((pixel * scale) + 0.5f);
    }
    
    0 讨论(0)
  • 2020-12-01 02:00

    convert DP to Pixel value

    int Whatever_valueInDP=10;//value in dp
    int Value_In_Pixel= (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, Whatever_valueInDP, getResources()
                        .getDisplayMetrics());
    
    0 讨论(0)
  • 2020-12-01 02:08

    Well for the kotlin guys i have got handy helper fun which works perfectly :)

    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()
        }
    }
    

    Just pass in a valid view and all set up!

    0 讨论(0)
提交回复
热议问题