Android 보기 컨트롤 구조 분석의 View,ViewGroup
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.사용자 정의 ViewGroup1.다시 쓰 는 방법:
1)onMeasure():서브 뷰 를 측정 한다.
2)onLayout():하위 View 의 위 치 를 설정 합 니 다.
3)onTouchEvent():터치 대화 이 벤트 를 설정 합 니 다.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.