如何将布局宽度/高度的值传递给自定义视图类

9 浏览
0 Comments

如何将布局宽度/高度的值传递给自定义视图类

我正在创建一个模块,其中包含一个扩展线性布局的类(roundbutton)。它包含一个图像视图和一个文本视图。

当在XML文件中声明roundbutton视图时,会分配layout_width和layout_height值。我希望图像视图的尺寸与分配的布局尺寸成比例。因此,如何将布局尺寸传递给视图类,以便我可以将比例尺寸分配给图像视图?

附注:此问题与传递自定义属性无关,而是与将android:layout_width和android:layout_height传递给自定义UI类有关。

0
0 Comments

问题的原因是无法从自定义视图类中直接获取布局的宽度和高度。解决方法是通过将视图实例传递给需要这些值的方法,并使用getViewTreeObserver().addOnGlobalLayoutListener()来获取布局的宽度和高度。

具体解决方法如下所示:

首先,在自定义视图类中创建一个方法,该方法需要一个视图实例、一个drawable资源id和一个位置作为参数。

public void setIcon(final RoundedButton rb, final int drawableResourceId, final int position){
    mIconPosition = position;
    rb.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        public void onGlobalLayout() {
            buttonWidth = rb.getWidth();
            buttonHeight = rb.getHeight();
            //需要对尺寸进行的操作
        }
    });
}

在这个方法中,我们将位置参数保存到一个变量中,并使用rb.getViewTreeObserver().addOnGlobalLayoutListener()来添加一个监听器。

在监听器的onGlobalLayout()方法中,我们可以使用rb.getWidth()rb.getHeight()来获取布局的宽度和高度,并将它们保存到相应的变量中。

需要注意的是,不能使用this.getViewTreeObserver().addOnGlobalLayoutListener()来添加监听器,即使该类扩展了某种类型的视图。因此,我们需要通过将视图实例作为参数传递给方法来解决这个问题。

通过这种方法,我们可以在自定义视图类中获取布局的宽度和高度,并执行任何需要这些值的操作。

0