以编程方式获取指南百分比大小(以像素为单位)

Get Guideline percent size in pixels programmatically

我有一个 GuideLine,页面左侧 15% 的折扣。

我可以在这段代码中得到它的百分比:

float percent = ((ConstraintLayout.LayoutParams) guideline.getLayoutParams()).guidePercent;

输出:0.15

如何获取像素或 dpi 值?

我找不到任何直接转换为 dp 公式的百分比,因为 phone dp 因多个因素而异 screen.but 我有简单的逻辑来获得 dp 中的值。

1) 计算屏幕宽度(500dp)

2) 计算您的边距 (15%) 占布局宽度的百分比

float  dpvalue=totalwidth * percentage 

//500 *(0.15) =75(dpvalue)

此逻辑适用于所有设备尺寸。

假设 ConstraintLayout 已经布置好,那么您可以使用 guideline.getTop() 水平参考线和 guideline.getLeft() 垂直参考线来获得以像素为单位的顶部或左侧距离。

如果ConstraintLayout还没有布局(假设你在activity的onCreate()),那么你必须等待直到它被布置:


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraint);
        constraintLayout.post(new Runnable() {
            @Override
            public void run() {
                Guideline guideline = findViewById(R.id.guideline);
                Log.i(TAG, guideline.getLeft() + "");
            }
        });
    }

注意getLeft()/getTop() 将 return 像素大小。此大小将指出 Guideline 与其父项 - ConstraintLayout 之间的距离。这意味着值不是绝对的,它是相对于其父级的。

如果你想得到一个绝对值(比如你的 ConstraintLayout 深深地嵌套在视图层次结构中,你想了解 Guideline 离屏幕左边有多远),那么你必须利用 View#getLocationOnScreen(int[]) API:


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraint);
        constraintLayout.post(new Runnable() {
            @Override
            public void run() {
                Guideline guideline = findViewById(R.id.guideline);
                int[] location = new int[2];
                guideline.getLocationOnScreen(location);
                Log.i(TAG, location[0] + " " + location[1]);
            }
        });
    }

Java代码:

Guideline guideline = (Guideline)findViewById(R.id.guideline)
float percent = ((ConstraintLayout.LayoutParams)guideline.getLayoutParams()).guidePercent

科特林代码:

val guideline1 = findViewById<Guideline>(R.id.guideline)
val percent = (guideline1.layoutParams as ConstraintLayout.LayoutParams).guidePercent