2013년 1월 17일 목요일

[Android] View 의 화면 출력 코드

View를 상속 받아서 화며에 출력하는 코드이다. 이전에 작성한 View Class의 Callback Method 를 참조하여 보면 된다.
  • MainActivity.java
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  this.setTitle("화면 출력 과정");
  // 선형레이아웃을 만든다.
  LinearLayout root = new LinearLayout(this);
  root.setOrientation(LinearLayout.VERTICAL);
  root.setGravity(Gravity.CENTER);
  root.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.MATCH_PARENT));

  // 리소스에서 비트맵 모형을 읽어 bitmap 객체를 만든다.
  Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
  MakeView view = new MakeView(this, bitmap);
  // view.setLayoutParams(
  // new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
  // LinearLayout.LayoutParams.WRAP_CONTENT));
  root.addView(view);
  setContentView(root);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

}


  • MakeView.java

public class MakeView extends View {
 private final Bitmap mBitmap;

 public MakeView(Context context, Bitmap mBitmap) {
  super(context);
  this.mBitmap = mBitmap;
  // TODO Auto-generated constructor stub
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  // TODO Auto-generated method stub
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  final DisplayMetrics metrics = getResources().getDisplayMetrics();
  setMeasuredDimension(mBitmap.getScaledWidth(metrics), mBitmap.getScaledHeight(metrics));
 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  canvas.drawBitmap(mBitmap, 0.0f, 0.0f, null);
 }
}


뷰에 적용할 크기는 setMeasuredDimension()를 호출하여 설정한다.
setMeasuredDimension() 메서드는 꼭! onMeasure() Callback Method 내에서 호출되어야 한다.

view.setLayoutParams()메서드만으로는 뷰의 위치와 크기가 정할 수 없다. 뷰 클래스를 상속받는 클래스에서  onMeasure() Callback Method를 Override하여 뷰의 위치와 크기를 정해 주어야 한다. 이때 사용하는 메서드가 setMeasuredDimmension()메서드이다.

setMeasuredDimmension() 메서드에 의하여 상단 레이아웃의 너비와 크기에 맞추어 뷰의 너비와 크기를 맞추게 되므로 ViewGroup.LayoutParams.WRAP_CONTENT와 ViewGroup.Layoutparams.WRAP_CONTENT 속성을 제거해도 동일한 결과를 나타낸다.

onMeasure() 와 onDraw()는 기본적인 Callback Method 이다.


댓글 없음:

댓글 쓰기