Android 보기 컨트롤 구조 분석의 View,ViewGroup

Android 에서 보기 컨트롤 은 크게 두 가지 로 나 뉘 는데 그것 이 바로 ViewGroup 과 View 이다.ViewGroup 컨트롤 은 부모 컨트롤 로 하위 View 를 포함 하고 관리 하 며 ViewGroup 과 View 를 통 해 컨트롤 트 리 를 형성 했다.각 ViewGoup 대상 과 View 대상 은 컨트롤 트 리 의 노드 이다.컨트롤 트 리 에서 트 리 의 깊이 로 해당 하 는 컨트롤 요 소 를 찾 는 동시에 상부 컨트롤 은 하위 컨트롤 의 측정 과 그리 기 를 책임 지고 상호작용 사건 을 전달 합 니 다.
Android 컨트롤 트 리:
  
Android UI 인터페이스 구성 도:
  
View 측정 도구 클래스:MeasureSpec
1.MeasureSpec 은 측정 모드 와 측정 크기 를 포함 하고 MeasureSpec.getMode()를 통 해 측정 모드 를 얻 고 MeasureSpec.getSize()를 통 해 측정 크기 를 얻는다.
2.MeasureSpec 는 32 비트 의 int 값 으로 높 은 2 위 는 측정 모델 이 고 낮은 30 위 는 측정 의 크기 이 며 비트 연산 을 사용 하 는 목적 은 최적화 효율 을 높이 는 데 있다.
2.측정 모드
1.EXACTLY,정확 치 모드:layotwidth 또는 layotheight 속성 은 구체 적 인 수치 나 match 로 지정 합 니 다.parent。
2.AT_MOST,최대 치 모드:layotwidth 또는 layotheight 는 wrap 로 지정content。
3.UNSPECIFIED:View 가 크 고 싶 은 만큼 크다.
3.View 류 의 기본 onMeasure()방법 은 EXACTLY 모드 만 지원 합 니 다.다른 모드 를 지원 하려 면 onMeasure()를 다시 쓰 고 onMeasure()의 템 플 릿 코드 를 다시 써 야 합 니 다.

package com.example.demoapp.views;

import android.content.Context;
import android.view.View;

public class MeasuredView extends View {
  public MeasuredView(Context context) {
    super(context);
  }
  
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    //      onMeasure()
    super.onMeasure(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
    //          setMeasuredDimension(),     onMeasure()     setMeasuredDimension()
    // setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
  }
  
  /**
   *   View width
   * @param measureSpec MeasureSpec  
   * @return View width
   */
  private int measureWidth(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    
    if (specMode == MeasureSpec.EXACTLY) {
      result = specSize;
    } else {
      result = 200;
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(result, specSize);
      }
    }
    return result;
  }
  
  /**
   *   View height
   * @param measureSpec MeasureSpec  
   * @return View height
   */
  private int measureHeight(int measureSpec) {
    int result = 0;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    
    if (specMode == MeasureSpec.EXACTLY) {
      result = specSize;
    } else {
      result = 200;
      if (specMode == MeasureSpec.AT_MOST) {
        result = Math.min(result, specSize);
      }
    }
    return result;
  }
}

4.View 의 그리 기
1.2D 그림 그리 기 필수 이기-Canvas
1)Canvas 대상 을 가 져 오 는 방법:
a.방법 중의 매개 변수 로 전 송 됩 니 다.예 를 들 어 View 의 onDraw()중 하 나 는 Canvas 대상 입 니 다.
b.구조 방법 구 조 를 통 해 Canvas canvas=new Canvas(bitmap)는 Canvas 의 구조 방법 으로 Bitmap 대상 에 전달 하면 Canvas 대상 을 얻 을 수 있 습 니 다.Bitmap 대상 이 Canvas 대상 을 구성 하 는 과정 을 통 해'캔버스 의 마 운 트'라 고 부 릅 니 다.들 어 오 는 Bitmap 대상 은 Canvas 에 그 려 진 픽 셀 정 보 를 많이 탑재 하고 Canvas.drawXXX 방법(예 를 들 어 Canvas.drawBitmap(bitmap,0,0,null)을 호출 합 니 다.
2)캔버스 로 그림 그리 기
a.Canvas.drwaXXX 를 통 해 그리 기 작업 을 하면 Bitmap 대상 에 직접적인 역할 을 합 니 다.View 를 다시 새로 고 칠 때 저 희 는 그 려 질 Bitmap 대상 이 바 뀌 었 습 니 다.
b.Canvas 와 Paint 를 이용 하여 그림 그리 기;
c.아무리 복잡 하고 아름 다운 공간 이라도 하나의 작은 도형 단원 으로 나 눌 수 있다.우 리 는 이 도형 단원 만 찾 으 면 컨트롤 을 그 릴 수 있다.
5.View Group 의 측정
1.ViewGroup 의 역할:하위 View,예 를 들 어 하위 View 의 크기,위 치 를 관리 합 니 다.
2.ViewGroup 은 하위 View 를 옮 겨 다 니 며 하위 View 의 Measure()를 호출 하여 모든 하위 View 의 측정 결 과 를 얻 습 니 다.
3.ViewGroup 은 하위 View 를 측정 하고 하위 View 의 Layout()를 호출 하여 하위 View 를 적당 한 위치 에 놓 습 니 다.
4.ViewGroup 을 사용자 정의 할 때 onLayout()제어 서브 View 의 디 스 플레이 를 다시 씁 니 다.
5.wrap 지원 이 필요 하 다 면content 속성,onMeasure()를 다시 써 야 합 니 다.
6.ViewGroup 의 그리 기
일반적으로 ViewGoup 은 그 릴 필요 가 없 지만 ViewGroup 은 dispatchDraw()를 사용 하여 하위 View 를 그립 니 다.
7.사용자 정의 보기
1.View 를 사용자 정의 할 때 는 보통 onDraw()를 다시 써 서 View 가 표시 할 내용 을 그립 니 다.wrap 을 지원 해 야 한다 면content 속성,onMeasure()를 다시 써 야 합 니 다.
2.사용자 정의 attrs 속성 을 통 해 새로운 View 속성 을 설정 할 수 있 습 니 다.
3.View 에서 중요 한 반전 방법:
1)onFinishInflate():XML 에서 구성 을 불 러 온 후 리 셋 합 니 다.
2)onSizeChanged():구성 요소 크기 가 바 뀌 었 을 때 되 돌리 기;
3)onMeasure():측정 하기;
4)onLayout():표 시 된 위 치 를 설정 합 니 다.
5)onTouch Event():터치 이벤트.
4.사용자 정의 View 를 실현 하 는 세 가지 상용 방법:
1)onDraw()를 다시 써 서 네 이 티 브 컨트롤 을 확장 합 니 다.
2)조합 을 통 해 새로운 컨트롤 을 실현 합 니 다.보통 적당 한 액 View Goup 을 통합 한 다음 에 addView()를 통 해 지정 한 기능 의 컨트롤 을 추가 하여 새로운 복합 컨트롤 을 조합 합 니 다.
3)View 를 다시 써 서 새로운 컨트롤 을 실현 하고 onDraw(),onMeasure()를 다시 써 서 논 리 를 그립 니 다.onTouchEvent()를 다시 써 서 상호작용 논 리 를 실현 합 니 다.
5.사용자 정의 속성
1)속성 을 사용자 정의 하 는 방법:res 자원 디 렉 터 리 의 values 디 렉 터 리 에 attrs.xml 속성 정의 파일 을 만 듭 니 다.파일 템 플 릿:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="customAttr">
    <attr name="title" format="string" />
    <attr name="fontSize" format="dimension" />
    <attr name="fontColor" format="color" />
    <attr name="background" format="reference|color" />
    <attr name="fontStyle" format="enum" />
    <attr name="shadeSupport" format="boolean" />
  </declare-styleable>
</resources>
2)TypedArray 를 통 해 사용자 정의 속성 집합 을 가 져 오고 TypedArray.getString(),TypedArray.getColor()등 방법 으로 속성 값,템 플 릿 코드 를 가 져 옵 니 다.

package com.jy.myrecyclerview.test;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;

import com.jy.myrecyclerview.R;

/**
 * Created by 123 on 2016/5/6.
 */
public class TestCustomAttrs extends View {
  private Context mContext;
  private AttributeSet mAttrs;
  private String mTitle;
  private float mFontSize;
  private int mFontColor;
  private int mBackground;
  private int mFontStyle;
  private boolean mShadeSupport;

  public TestCustomAttrs(Context context) {
    super(context);
    this.mContext = context;
  }

  public TestCustomAttrs(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.mContext = context;
    this.mAttrs = attrs;
  }

  public TestCustomAttrs(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.mContext = context;
    this.mAttrs = attrs;
  }

  private void getCustomAttrs() {
    TypedArray ta = mContext.obtainStyledAttributes(mAttrs, R.styleable.customAttr);
    mTitle = ta.getString(R.styleable.customAttr_title);
    mFontSize = ta.getDimension(R.styleable.customAttr_fontSize, 10);
    mFontColor = ta.getColor(R.styleable.customAttr_fontColor, 0);
    mBackground = ta.getColor(R.styleable.customAttr_background, 0);
    mFontStyle = ta.getInt(R.styleable.customAttr_fontStyle, 0);
    mShadeSupport = ta.getBoolean(R.styleable.customAttr_shadeSupport, false);
    ta.recycle();
  }
}
  
6.리 셋 인 터 페 이 스 를 정의 하여 사용자 정의 컨트롤 의 유연 한 제 어 를 실현 한다.
7.UI 템 플 릿 참조
1)사용자 정의 컨트롤 은 네 임 스페이스 를 사용 하여 도입 해 야 합 니 다:xmlns:custom="http://schemas.android.com/apk/res-auto"사용자 정의 컨트롤 의 네 임 스페이스 이름 을 custom 으로 지정 합 니 다."
2)XML 파일 에서 사용자 정의 속성 을 사용 할 때 이 네 임 스페이스 를 통 해 참조 할 수 있 습 니 다.코드 템 플 릿 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:custom="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <com.jy.myrecyclerview.test.TestCustomAttrs
    android:id="@+id/id_recyclerview"
    android:divider="#ffff0000"
    android:dividerHeight="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    custom:title="title"
    custom:fontSize="12sp"
    custom:fontColor="@color/colorPrimary"
    custom:background="@color/colorPrimary"
    custom:shadeSupport="false" />

</RelativeLayout>
9.사용자 정의 ViewGroup
1.다시 쓰 는 방법:
1)onMeasure():서브 뷰 를 측정 한다.
2)onLayout():하위 View 의 위 치 를 설정 합 니 다.
3)onTouchEvent():터치 대화 이 벤트 를 설정 합 니 다.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기