【问题标题】:Custom View: Tell children that parent has another size自定义视图:告诉孩子父母有另一个尺寸
【发布时间】:2013-07-07 22:08:05
【问题描述】:

我有一个自定义视图 (ViewGroup),它将从宽度 = 0dp 变为宽度 = 300dp。 我想在画出孩子之后操纵画布。为了实现这一点,我重写了 dispatchDraw(Canvas)。 但是,我希望孩子们在 300dp 的画布上呈现——即使自定义视图的大小更小。 当将更大的画布传递给 dispatchDraw(Canvas) 方法时,孩子们不会调整他们的位置和大小。

我的问题,我怎样才能“伪造”我的视图组的更大宽度,以便孩子们在更大的表面上呈现?

问候, 罗伯特

【问题讨论】:

    标签: android android-custom-view


    【解决方案1】:

    每次视图(包括 ViewGroups)需要绘制自身时,都会调用 onMeasure 方法以获取其尺寸。之后调用 onLayout 以获得绘制位置。这不会在 draw 方法中发生,因为它们是在 onMeasure 和 onLayout 之后调用的,请参阅here。总结 onMeasure 计算尺寸,onLayout 设置位置,最后 onDraw 进行渲染。所以你最好的选择是使用 onMeasure 来设置你想要的尺寸。例如,这是一个 onMeasure 方法,它将告诉子视图它的尺寸应该是 300 x 150 像素:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthSpec;
        int heightSpec;
    
        widthSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.EXACTLY);
        heightSpec = MeasureSpec.makeMeasureSpec(150, MeasureSpec.EXACTLY);
    
        llTopBar.measure(widthSpec, heightSpec); //<-- llTopBar is the child...
    
        super.onMeasure(widthMeasureSpec, heightMeasureSpec); //<--This is important
    }
    

    如果您想使用下降而不是像素,您必须转换它们,请参阅here

    您可以测量尺寸大于可用空间的子级,但由于剪裁或其他因素(例如,如果您的 ViewGroup 位于另一个 ViewGroup 中),结果可能与您的预期不同。

    从你的问题中我可以看出你正在构建它从左到右滑动的东西,也许slidingdrawer源代码会有所帮助,看看here

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2018-01-15
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多