고급 안드로이드 개발 - 사용자 정의보기의 사용과 원칙을 탐구

  안드로이드 개발, 시스템은 우리가 단독 제어 시스템이 제공 할 때 우리가 원하는 결과를 얻을 수 없습니다, 특별한 컨트롤을 사용 할 때 우리의 UI 컨트롤이 제한됩니다에 제공하고, 우리는 자기가 필요합니다 일부 컨트롤의 정의는 우리가 원하는 효과를 완료합니다. 지금, 나는 그 일 사용자 정의 컨트롤에 대해 뭔가를 말할 것이다.

  우선, 나는 안드로이드의 제어 구조에 대해 뭔가를 말한다. 안드로이드 컨트롤은 두 가지 범주, 즉로 나눌 수 있습니다 뷰 그룹보기 . 뷰 그룹에서 여러보기를 포함하고 관리 할 수 있습니다. 컨트롤 트리 컨트롤 트리가 플로팅 기본 제어 및 상호 작용을 측정하기위한 두 부분으로 상위 계층이 담당하는 것입니다. 우리는 ID에 해당하는 트리 탐색 검색 깊이의 제어 방법에 사용되는 findViewById를 활동 () 메소드에 사용합니다. 각각은, 전체 트리의 핵심되어 ViewParent 객체가,가, 나무의 상단을 제어하는 모든 상호 작용 이벤트를 예약 할 책임이있다. 활동에서, 우리는 레이아웃을로드 된 setContentView ()를 사용하고 있습니다. 각각의 활동이 포함되어 Window 객체 안드로이드는 일반적으로 PhoneWindow, 그는이 될 것입니다 DecorView 루트로 전체 창보기, 내용이 디스플레이 창에 표시됩니다. DecorView 하나가 두 부분으로 분할된다 titleview , A는 내용 없음 . 이 내용 없음 FrameLayout이 내용위한 ID이며,이 문서의 레이아웃 내를 설정하는 것이다. 그리고 TitleView 우리가 topbar 제목 표시 줄을 볼 것입니다. 이 활동의 과정은 레이아웃 파일을로드합니다.

  다음으로, 우리가 핀치의 원칙 몇 가지로 분석 할 때, 다음과 같은 설명을 사용하여, 사용자 지정 컨트롤의 사용에 대해 이야기하기 시작했다. 사용자 컨트롤 하나는 원하는 효과를 달성하기 위해, 구글에 의해 제공되는 제어 시스템의 확장이며, 세 종류로 나눌 수있다. 하나는 컨트롤 조성물로서 사용되는 복합 제어 시스템을 제공하는 것이다. 다시 그리기 제어의 새로운 척도가있다.

 

먼저, 제어 시스템의 확장은 Google에서 제공

  우리가 제어를 텍스트 뷰에 확장하려는 경우, 우리는 클래스, 선택적 재 작성의의 onDraw () 된 onMeasure (), onTouchEvent () 메소드 텍스트 뷰에서 상속 정의 할 필요가있다. 렌더링 이미지에 대한 책임이있는 onDraw는 () 된 onMeasure ()가 위치를 측정 할 책임이 onTouchEvent ()는 터치 이벤트를 설정하는 책임이있다. 우리가 직접 텍스트 뷰의 배경 색상을 매핑 할 때 브러시가 된 onDraw 그릴, 클래스에 정의 될 수있다 (). 다음과 같이 코드입니다 :

 

() = 새로운 페인트 paint1 페인트; //定义画笔
paint1.setColor (Color.YELLOW); 
paint1.setStyle (Paint.Style.FILL);

   그런 다음, 다음 코드는, 당신은 사각형과 텍스트 뷰를 그릴 수 있지만, 시스템 제어에 확대되고 있기 때문에, 호출 된 onDraw 부모 클래스 ()의 완료시 그릴 필요, 그래서 또한 원래의 기능을 가지고 .

@Override 
    {공극 보호 된 onDraw (캔버스 캔버스) 
        canvas.drawRect (0,0, getMeasuredWidth () getMeasuredHeight ()을 paint1) //矩形绘制
        canvas.save을 (); 
        super.onDraw (캔버스); 
        canvas.restore (); 
    }

   

  캔버스에 설명, 도면 할 수 있습니다 캔버스 객체를 사용하여, 나는 다음 블로그 게시물에서 설명 할 것이다.

  다음과 같이, 우리는 레이아웃 파일에 사용자 정의 할 수 있습니다 레이아웃 파일의 컨트롤을 추가 할 필요가, 자기 정의 뷰 이름은 그 CustomTextview 클래스 상속 텍스트 뷰를 정의 가정, 클래스 이름과 패키지 이름의 사용자 정의 클래스, 예는 다음과 같습니다

<com.example.myapplication.View.CustomTextView의 
        로이드 : layout_width = "wrap_content" 
        로이드 : layout_height = "match_parent"> </ com.example.myapplication.View.Buttonbtn>

 

둘째, 제어 시스템은 함께 제공

  기존 컨트롤을 확장뿐만 아니라, 우리는 또한 새로운 제어 사용으로 결합 할 수 있습니다 제어합니다. 먼저, 새로운 레이아웃 파일을 정의 할 수 다음과 같이 이미지 뷰와 텍스트 뷰는 덧붙였다.

    <이미지 뷰의 
        로이드 : ID = "@ + ID / IV" 
        로이드 : layout_width = "20dp" 
        로이드 : layout_height = "20dp" 
        로이드 : SRC = "@ 밉맵 / ic_launcher"/> 

    <텍스트 뷰의 
        로이드 : ID = "@ + ID / TV " 
        안드로이드 : layout_width ="wrap_content " 
        안드로이드 : layout_height ="wrap_content " 
        안드로이드 : layout_marginTop이 ="2DP " 
        안드로이드 : 텍스트 ="消息" 
        안드로이드 : TEXTSIZE ="13sp "/>

  그럼 우리가있는 LinearLayout을 상속하는 클래스를 정의하고, 컨트롤의 레이아웃은 생성자 클래스에 초기화됩니다.

초기화 공개 (컨텍스트 컨텍스트) 무효화 { 
        // 특정 선형 레이아웃을 표시 수직 
        setOrientation (수직); 
        // 설정은 사용자가 원하는 레이아웃 
        의 LayoutParams mLayoutParams = 새의 LayoutParams (ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
        setLayoutParams (mLayoutParams) 
        setGravity (Gravity.CENTER) 
        setPadding (4 ,. 4 ,. 4 ,. 4.); 
       // 레이아웃 파일 설정 
        보기 mButtonbtnView = LayoutInflater.from (컨텍스트) .inflate (layout.botton_btn_view,이 사실을); 
        = mButtonbtnView.findViewById mImageView (id.iv) 
        mTextView = mButtonbtnView.findViewById (id.tv) 
    }

  다음, 그것의 사용 확장과 같은 제어 방법, 직접 레이아웃 파일에서 컨트롤 할 수 있습니다 추가 할 것입니다.

<com.example.myapplication.View.Buttonbtn의 
        로이드 : layout_width = " wrap_content " 
        로이드 : layout_height = "match_parent"> </ com.example.myapplication.View.Buttonbtn>

 

셋째, 새로운 컨트롤을 구현하는보기를 다시 작성

  시스템 기본 컨트롤이 우리의 요구를 충족하지 않을 경우, 우리는 필요한 기능을 완료하는 새 컨트롤을 정의 할 수 있습니다. 당신이 View 클래스를 상속 할 필요가 새 컨트롤을 만들고, 그것의 주요 어려움은 컨트롤을 그리기 및 상호 작용에있다. View 클래스에 성공하면, 우리는 또한 자사의 onDraw ()를 다시 할 필요가 된 onMeasure (), onTouchEvent () 그리기, 측정 및 터치 이벤트를 달성하기 위해.

 

  형상 제어 드로잉 캔버스 객체를 그리는 방법의 일련의 호출 된 onDraw ().

 

  된 onMeasure ()

  지금, 나는 () 된 onMeasure에 대해 뭔가를 말한다. 보기를 그리기 전에, 우리는 우리가 된 onMeasure 그의 위치뿐만 아니라보기를 그릴 필요가 얼마나 많은 시스템을 알려줄 필요 ()는를 실시했다. 먼저, 측정의 세 가지 모드를 살펴 보자 :

  정확히 : 정확한 값 모드 뷰를 특정 숫자 값을 지정할 때하는 것은 사용됩니다.

  AT_MOST : 최대 모드, 컨트롤이 설정되어 이 자식 컨트롤 또는 내용 변경에 따라 달라질 것 "wrap_content"가 사용됩니다.

  UNSPECIFIED : 당신이 큰되고 싶어 얼마나 많은에 컨트롤을 그립니다.

  위의 세 가지 모드에 따라, 우리는 확인할 수 있으며, 측정시 사용합니다. 우선, 우리는 () 메서드 된 onMeasure 뷰를 다시 작성합니다. 그런 다음 제어는 측정 모드 MeasureSpec 클래스를 사용함으로써 얻어진다. MeasureSpec 나머지 30은 측정 크기 높은 측정 모드의 2 비트 산술 연산을 사용.

@Override 
    보호 된 onMeasure를 무효 (INT widthMeasureSpec, INT heightMeasureSpec) { 
        INT widthMode = MeasureSpec.getMode (widthMeasureSpec); 
        INT widthSize = MeasureSpec.getSize (widthMeasureSpec); 

        {(widthMode == MeasureSpec.EXACTLY)의 경우 

        } 그 밖의 경우 (widthMode == MeasureSpec.AT_MOST) { 

        } 다른 경우 (widthMode == MeasureSpec.UNSPECIFIED) { 

        } 

    }

   이 코드는, 제어의 폭 여기서 측정 제어를 정의 할 패턴의 크기를 측정함으로써 결정된다이며, 설명하지 않아도, 측정의 높이가 비슷 제어한다.

  위에서 언급 한 바와 같이, 뷰 그룹은 뷰 그룹의 크기가 일 때, 컨트롤을 관리하는 데 사용되는 "wrap_content"가,가, 하위보기를 모두 통과합니다 아이 뷰의 크기를 얻을 때 다시 자신의 크기를 설정합니다. 우리는 그들이 또한 자신의 크기를 얻기 위해이 방법을 사용할 수 있도록 RelativeLayout의 같이있는 LinearLayout 뷰 그룹은, 상속, 레이아웃을 사용했다.

 

  onTouchEvent ()

  안드로이드 폰 화면을 터치 할 때, 그래서 우리의 사용자 정의보기 터치 스크린이지만, 또한 상호 작용을 완료하는 데 몇 가지 과정이 필요하기 때문에 onTouchEvent ()는 우리가 터치 이벤트라고 부릅니다. 방법을 onTouchEvent 재 작성 할 때, 우리는 개체가 MotionEvent를 전달해야 볼 수 있습니다. 우리는 당신이 터치 점의 위치를 ​​얻을 수 있습니다,이 클래스를 통해 터치 이벤트를 설정할 수 있습니다. 우리는 화면을 누르거나 이동 여부를 확인하는 getAction ()에 의해 행동의 터치 이벤트를 얻을 수 있습니다. 안드로이드 좌표계에서, 우리 모두가 세로 안드로이드의 화면이 원점으로 왼쪽 상단 모서리에 관해서 알고, 올바른 방향이 게시물을 알고, 양의 x 축, y 축 양의 아래 방향이다, 우리는 몇 가지 상호 작용을 완료 getX ()와 getY () 메서드를 호출하여 터치 점의 좌표를 얻을 수 있습니다.

 

공개 부울 onTouchEvent (MotionEvent 이벤트) { 
        플로트 X; 
        스위치 (event.getAction ()) { 
            케이스 MotionEvent.ACTION_DOWN : 
            { 
                X = event.getX (); 
            } 
                휴식; 
            사례 MotionEvent.ACTION_MOVE : 
                휴식; 
            사례 MotionEvent.ACTION_UP : 
                휴식; 
        } 
        TRUE를 반환; 
    }

 

   이들은 일반적으로 커스텀 다시 이러한 방법으로 다시 사용하는 방법, 우리는 사용자 지정 컨트롤의 기본 개요를 얻을 수 있습니다. 여기, 우리는 통제 이벤트 차단 메커니즘의 원리를 이해하게.

이벤트 차단 메커니즘 분석

  우리는 뷰 그룹 뷰 그룹 또는보기보다 더있을 수 있습니다, 제어 구조는 트리 구조, 앞서 언급 한 다음, 터치 이벤트는 각 뷰와 뷰 그룹에 할당하는 방법을 정확합니다. 우리는 ViewGroupB 내 자신의 둥지에서하는 ViewGroupA가 있다고 생각하지만, 내부 ViewGroupB에,뿐만 아니라보기와 중첩. 우리가 ViewGroupA 클래스를 다시 작성할 때, 우리는이 세 가지 방법의 내부를 다시 작성해야합니다

    dispatchTouchEvent ()

    onInterceptTouchEvent ()

    onTouchEvent ()

  보기를 재 작성 할 때, 우리는 두 가지 방법을 재정의해야합니다 :

    dispatchTouchEvent ()

    onTouchEvent ()

 

  이름이보기보다 더에서 뷰 그룹, 볼 수 onInterceptTouchEvent () 핵심 방법,이 방법은 이벤트를 차단하는 것입니다. 각 방법에서 살펴 로그인 한 다음보기를 클릭하고 메서드 호출의 순서를 찾을 수 있습니다 :

 

    첫째, 전화 ViewGroupA의 클래스 dispatchTouchEvent를 () onInterceptTouchEvent () .

    그런 다음 전화 ViewGroupB 클래스 dispatchTouchEvent ()onInterceptTouchEvent ()을 .

    그런 다음 보기 dispatchTouchEvent () 메소드를.

 

  이 순서는 이벤트 전달 호출의 순서이며, 일련의 이벤트가 처리됩니다

 

    보기 onTouchEvent의 ().

    ViewGroupBonTouchEvent ().

    ViewGroupAonTouchEvent ().

  

  따라서, 볼 수있는 이벤트의 분포는 상위 뷰 그룹에 의해 출판 및 레이어에 의해 다음 레이어 발급됩니다. 핸들 이벤트는, 그것은 계층에 의해 기본보기, 계층에 의해 처리 한 후 업로드합니다. 앞서 언급 한 onInterceptTouchEvent ()이 이벤트의 핵심은 다음, 가로로 긴 반환 값이 true로 설정, 그것은, 그것은 더 이상 발행, 이벤트를 가로 챌 수 있지만 것입니다 onTouchEvent ()가 아니라 이벤트 핸들러 후 false를 반환 업로드 전에. 유통 및 대략 완성을 설명하는 이벤트의 흐름을 차단합니다.

  마지막으로,이 블로그를 검토하고 내가 "안드로이드 영웅"를 읽어 요약하는 것입니다, 나는 사용자 정의보기 친구를 배우는 데 도움이 희망 한편, 잘못된 장소를 이해해야 지적에 오신 것을 환영합니다.

 

 

 

추천

출처www.cnblogs.com/lwkdbk/p/11279008.html