2017-03-08 1 views
0

입니다. 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? 처음에?

답변

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입니다.

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(); 
    } 

} 
+0

onMeasure와 거의 비슷하게 보입니까? –

+0

정확하게 'onMeasure'는'onLayoutChange'보다 더 많이 호출됩니다. onMeasure는 부모 뷰가 레이아웃을 계산할 때마다 호출되며, onLayoutChange는 특정 뷰의 레이아웃이 변경 될 때 호출됩니다. –

관련 문제