Skip to content

Android.view.View

This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for widgets, which are used to create interactive UI components (buttons, text fields, etc.). The ViewGroup subclass is the base class for layouts, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.

Size of View

View의 크기를 획득하는 방법에 대하여 설명한다.
일반적인 Activity 생성 과정에서 View의 크기를 확인할 수 있는 방법은 아래의 Event가 존재한다.

public void onWindowFocusChanged(boolean hasFocus) { }

하지만 Fragment에는 onWindowFocusChanged()가 존재하지 않다. 따라서 아래와 같이 ViewTreeObserver를 사용하는 방법으로 확인해야 한다.

final View myView =  getActivity().findViewById(R.id.widget_id);
ViewTreeObserver vto = myView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        Log.d("SizeOf", "Height: " + myView.getHeight() + ", Width: " + myView.getWidth());
        // ...
        ViewTreeObserver obs = myView.getViewTreeObserver();
        obs.removeGlobalOnLayoutListener(this);
    }
});

뷰의 간단한 사용방법 (크기변경 및 이동방법 등)

자식 뷰 추가.

view.addView(childView, LayoutParams);

액티비티의 최 상위 윈도우에 윈도우로 뷰 추가하기.

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.addView(View, WindowManager.LayoutParams);

자식 뷰 제거.

removeView(childView);

윈도우 뷰.

wm.removeView(childView);

뷰의 크기 변경.

ViewGroup.LayoutParams param = view.getLayoutParams();
param.width = 너비;
param.height = 높이;
view.setLayoutParams(param);

자식 뷰의 크기 변경.

updateViewLayout(chideView, LayoutParams);

뷰 이동: 윈도우로 add된 뷰(WindowManager.LayoutParams)만 가능.

WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.x = x위치;
params.y = y위치;
wm.updateViewLayout(chidView, params);

터치를 따라 이동하는 뷰의 경우.

  1. 터치 onTouchEvent 핸들링.
  2. WindowManager.LayoutParams 생성.
  3. WindowManager 얻기 (getSystemService).
  4. 윈도우 생성및 뷰 추가 (addView).
  5. 터치 move.
  6. 뷰이동 (WindowManager.LayoutParams 변경).
  7. 적용 (updateViewLayout).

How Android Draws Views

Usage of forceLayout(), requestLayout() and invalidate()

  • View.forceLayout(): 강제로 레이아웃을 다시 계산한다.
  • View.invalidate(): only refresh the view.
  • View.requestLayout(): refresh the view and compute the size of the view in the screen.

모션 이벤트 (MotionEvent) 획득방법

this.setOnLongClickListener(this);
this.setOnDragListener(this);
// ...
@Override
public boolean onLongClick(View v) {
    return false;
}
@Override
public boolean onDrag(View v, DragEvent event) {
    return false;
}

현재 포커스(Focus)를 가진 View를 알아내는 방법

현재 포커스(Focus)를 가진 View 알아 내는 방법 입니다. EditText나 View의 포커스(Focus)를 알아야 할 경우 유용하게 사용하실 수 있습니다.

view.requestFocus(); // 포커스(Foucs 강제로 주기
View cView = getCurrentFocus();
if (cView instanceof View) {
    Log.d("DDDD", "focus ok");
}

Layout 또는 View에 표시되는 내용 캡쳐하기

Drawing Cache
뷰에 표시되는 내용을 Bitmap 형태로 캐싱한다. 해당 XML 속성 중 drawing cache enabled가 true로 설정되어 있거나, 코드에서 View.setDrawingCache()메서드를 사용하여 Drawing Cache 사용 여부를 설정할 수 있다.
public void View.setDrawingCacheEnabled(boolean enable)
뷰가 업데이트 될 때마다 그 때의 뷰 이미지를 Drawing Cache에 저장할지 여부를 결정한다.(자동)
변경(Invalidate) 될 때마다 Drawing Cache에 새로운 뷰 정보가 저장되므로 성능 저하의 원인이 될 수 있다.
public void View.buildDrawingCache()
뷰 이미지를 Drawing Cache에 저장한다.(수동)
public Bitmap View.getDrawingCache()
Drawing Cache에 저장된 뷰의 이미지를 Bitmap 형태로 반환한다.

Custom View 만들기

아래의 순서로 작성하면 됨.

  1. View나 View subclass를 확장.
  2. 필요한 메소드들을 오버라이드.

오버라이드할 메소드 리스트는 아래와 같다.

  • Construct and Destructor.
    • 생성자: code상으로 생성되는 생성자와 layout파일로부터 inflate되면서 생성되는 경우에 호출되는 생성자 두가지가 있으며 두번째 생성자는 layout파일에 정의되어 있는 속성들을 파싱하여 적용하는 부분이 추가로 코딩되어야 한다.
    • onFinishInflate: layout XML파일로부터 뷰와 그의 모든 차일드들이 inflate된 후에 호출됨. 이 때 추가로 어떤 작업을 하고자 하는 경우 여기서 하면 된다.
  • Layout 관련
    • onMeasure(int, int): 부모에서 계산된 width, height 스펙값내에서 뷰와 차일드들의 크기를 계산하여 적용한다.
    • onLayout(boolean, int, int, int, int): 뷰가 size와 postion을 모든 차일드에 지정해야 할경우 호출된다.
    • onSizeChanged(int, int, int, int): 뷰의 size가 변경된 후 호출된다.
  • Draw 관련
    • onDraw(Canvas): View가 내용을 다시 그려야 할 때 호출된다.
  • Event 처리
    • onKeyDown(int, KeyEvent): 새로운 key event가 발생하였을 때 호출된다.
    • onKeyUp(int, KeyEvent): key up event가 발생하였을 때 호출된다.
    • onTrackballEvent(MotionEvent): 트랙볼 모션이벤트가 발생하였을 때 호출된다.
    • onTouchEvent(MotionEvent): 터치스크린의 모션이벤트가 발생하였을 때 호출된다.
    • onFocusChanged(boolean, int, Rect): View가 포커스를 얻거나 잃었을 때 호출된다.
    • onWindowFocusChanged(boolean): View를 포함하고 있는 윈도우가 포커스를 얻거나 잃었을 때 호출된다.
  • Attach관련
    • onAttachedToWindow(): View가 Window에 attach되었을 때 호출된다.
    • onDetachedFromWindow(): View가 Window로부터 detach되었을 때 호출된다.
    • onWindowVisibilityChanged(int): View를 포함하는 window의 visibility가 변경되었을 때 호출된다.

See also

Favorite site

References


  1. Android_UI_implementations_-_Hierarchy_of_screen_components.pdf