마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

커스텀한 뷰의 크기를 onDraw 메서드 이전에 알아 내는 방법이 없을까요?

0 추천

xml에서 설정한 뷰의 크기를 onDraw 메서드 이전에 알고 싶어서요.

크기에 따라서 뷰의 크기를 조절 해주려고 하거든요,

onDraw 메서드에서 xml에서 설정한 뷰의 크기를 알아 낼 수 는 있는데. 그렇게 되면 시뮬레이터에서는 xml에서 설정한 만큼 뷰가 그려진다음에

다시 onDraw 메서드가 호출되면서 크기가 조절이 되더라구요.

xml에서 아래와 같이 크기를 만들어 준다음에

<com.custom.view.CTextView
        android:layout_width="300px"
        android:layout_height="10px"
        android:text="@string/hello_world" 
        android:background="#00FF00"
        />

자바코드에서 생성자 부분에서 크기를 얻고 싶었는데 생성자에서는 넓이 값이 0이 들어오고, onDraw부분에서 값이 들어오더라구요.

그리고 layout를 다시 지정 해주면 onDraw가 한번더 호출이 되는데

onDraw가 두번 호출이 되니까 화면에서 뷰가 움직이는게 보여서요.

public class CTextView extends TextView {

 public CTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
//  this.layout(5, 120, 5+790, 120+100);
  int w = this.getWidth();
  Log.i("testView", "CTextView = " + w);
  
 }
  
 @Override
 protected void onDraw(Canvas canvas) {
  int w = this.getWidth();
  Log.i("testView", "onDraw = " + w);
  // xml에서 한번 그려지고 난후 아래 layout을 호출했을때 onDraw가 한번더 들어 오더라구요...
  this.layout(5, 120, 5+790, 120+100);
  
  super.onDraw(canvas);
 }

}

 

화면에 뷰가 두번 그려지지 않게 onDraw이전에 뷰의 크기를 알 수 있는 방법은 없을까요?

 

 

익명사용자 님이 2013년 10월 30일 질문

3개의 답변

+1 추천
onMeasure , onLayout 메소드에 대해 알아보시기 바랍니다.
익명사용자 님이 2013년 10월 30일 답변
0 추천
//onCreate에서 setContentView 이후에..
//mCTV 는 CTextView 멤버 변수라고 가정합니다.
 
LayoutParams lp = mCTV.getLayoutParams();
lp.width = 600;
lp.height = 1000;
mCTV.setLayoutParams(lp);
Gioskhan (12,060 포인트) 님이 2013년 10월 30일 답변
답변 감사드림니다.
알려주신 방법은 알고 있습니다.^^;
xml의 값을 호출하는게 목적이라서요...^^;
위에 있는 lp.width lp.height 값에 들어있지 않던가요?
xml에 정의한 값이 onCreate에서는 값이 않들어와서요.
onDraw에 가야 값이 들어가는데 그렇게 되면 이미 화면에 한번 그려진 뒤에 다시 바꾸어서 그려주게 되거든요...
0 추천

http://developer.android.com/reference/android/view/ViewTreeObserver.html

addOnPreDrawListener메소드 한번 봐보세요.

q1212 (26,020 포인트) 님이 2013년 10월 30일 답변
답변감사드림니다.  좀더 살펴 봐야 할것 같네요..
...