我应该何时根据其大小绘制自定义布局

时间:2017-03-08 18:03:22

标签: android android-custom-view

我正在创建一个新的ViewGroup。新视图中会绘制一些圆圈。该视图应该有5个初始圆圈,所以我想将它们均匀地分布在视图的宽度上,并且还要跟踪它们(它们的中心位置(x,y))以便重绘它们当视图无效时。

这是我的onMeasure

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
    int desiredWidth = getPaddingLeft() + getPaddingRight() + PREFERED_SIZE;
    int desiredHeight = getPaddingTop() + getPaddingBottom() + PREFERED_SIZE;

    actualWidth = resolveSizeAndState(desiredWidth,widthMeasureSpec,0);
    actualHeight = resolveSizeAndState(desiredHeight,heightMeasureSpec,0);
    setMeasuredDimension(actualWidth, actualHeight);
}

我不确定何时应添加这些圈子。可以多次调用onMeasure并获得不同的宽度和高度值,因此我不确定何时应该计算初始圆的(x,y).. onMeasure内?在onDraw的开头?

2 个答案:

答案 0 :(得分:0)

您可以使用View.OnLayoutChangeListener跟踪布局更改:

public class CustomView extends View implements View.OnLayoutChangeListener {

    private int height;
    private int width;

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // add the layout listener
        addOnLayoutChangeListener(this);
    }

    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        height = getHeight();
        width = getWidth();
    }

}

答案 1 :(得分:0)

请查看文档。测量部分有3个回调,我想你可以在最后一个回复:https://developer.android.com/reference/android/view/View.html

  • onMeasure(int, int)调用以确定此视图及其所有子视图的大小要求。
  • onLayout(boolean, int, int, int, int)当此视图应为其所有子项指定大小和位置时调用。
  • onSizeChanged(int, int, int, int)当此视图的大小发生变化时调用。

所以我猜你的计算最好的是onSizeChanged