【问题标题】:Margins of a LinearLayout, programmatically with dpLinearLayout 的边距,以编程方式使用 dp
【发布时间】:2011-06-22 07:00:07
【问题描述】:

是否可以通过编程方式设置 LinearLayout 的边距,但不是像素,而是 dp?

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用DisplayMetrics 并确定屏幕密度。像这样的:

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

    我记得最好使用地板进行偏移和四舍五入的宽度。

    【讨论】:

    • 就像评论一样:您也可以使用 TypedValue.applyDimensions() 但似乎这种方式更好,请参阅stackoverflow.com/questions/2406449/…(Romain Guy 是一名 Android 工程师)
    • +1 - 我有几个用代码构建的小部件(不使用 XML),你只能在那里设置像素。一旦我指定了 SDK 版本,我的布局就疯狂了。我用它来修复它们...始终使用 XML 进行 Android 布局!!!
    • Resources.getSystem().getDisplayMetrics().denisty 以防您在没有上下文的 Util 类中。来自here
    【解决方案2】:

    我遇到了同样的问题并使用此技术解决了它:

    首先,我在 res/values 文件夹中添加了一个名为 dimensions.xml 的 xml 文件。它看起来像这样:

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

    其次,在我的代码中,我得到了与该边距等效的像素,如下所示(注意我使用的是 Xamarin,所以这是 C# 代码,但纯 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);
    

    【讨论】:

    • android java形式,应该是:int getDimenInt(Context context, @DimenRes int dimenRes){ return context.getResources().getDimensionPixelSize(dimenRes); }
    【解决方案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()
              }
          }
          

          只需传入一个有效的视图并设置好!

          【讨论】:

            猜你喜欢
            • 2011-01-29
            • 1970-01-01
            • 2023-03-15
            • 2014-01-12
            • 2012-09-25
            • 2014-10-25
            • 1970-01-01
            • 1970-01-01
            • 2017-03-17
            相关资源
            最近更新 更多