안드로이드 일부의 이해보기

재현 : 9102의 끝, 안드로이드는 제 13의 나의 이해를 볼 수;

 

( 빼서 왼쪽 GitHub의 링크, 당신은 자신을 찾을 수 등의 인터뷰로 관련 콘텐츠에 액세스 할 수 있어야합니다 )
https://github.com/xiangjiana/Android-MS

드로잉 과정의 다이애나보기?
  • 답변
    보기 계수 결정하는 계수, 레이아웃, 이들 세 프로세스 그릴, 즉 측정 및 배치도를 지칭 플로 메인 뷰를 폭 / / 높은 측정을 , 레이아웃 결정보기 / / 고 네 꼭지점 최종 너비 위치 및보기 것이다 그릴 화면에 그리기

드로잉 과정의보기는 다음 단계를 수행하십시오 :

  • 배경 background.draw (캔버스) 그리기
  • 그리기 자신 (의 onDraw)
  • 그리기 어린이 (dispatchDraw)
  • 장식 (onDrawScollBars)를 그리기


     
     
두 다이애나보기 이벤트 분배 시스템

이벤트, 활동에 대한 첫 번째 배달 발생 클릭 dispatchTouchEvent하여 방법 PhoneWindow에 전달 DecorView하고 전달 루트 ViewGroup를 입력 방법의 구현 방법은 차단 여부, 사건의 차단이 통과 할이 시간에, 그렇지 않은 결정하는 하위보기로 자식 요소를 방법은, 만약 아이 뷰는 설정 의 구현 방법, 그리고에 따라 참 또는 거짓의 반환 값은 수행할지 여부를 결정하기 위해 이 계속 false 인 경우, 방법 . 에서 판단의 조치 위쪽 이벤트, 경우 설정 의 구현에, 방법.ViewGroupdispatchTouchEventonInterceptTouchEventViewGroupdispatchToucnEventonTouchListeneronTouchonTouchonTouchEventonTouchEventonTouchEventonClickListeneronClick

이벤트 전달 분배 메커니즘은보기?
참고 대답 :

  • 보기 이벤트 분포에 본질적으로 MotionEvent분산 된 사건의 과정. MotionEvent가 발생했을 때 즉, 시스템은 특정보기에 클릭 이벤트에 전달됩니다
  • 이벤트 배달 주문을 클릭 : 활동 (윈도우) → 뷰 그룹 →보기
  • 이벤트 배포 프로세스가 공동으로 세 가지 방법에 의해 수행
    • dispatchTouchEvent: 이벤트를 배포하는 데 사용됩니다. 이벤트가 현재보기에 전달 될 수있는 경우,이 메소드가 호출 될 것이다 결과를 반환은 현재보기에 의해 영향을받은 onTouchEvent이하 및보기 dispatchTouchEvent표시의 영향 방법 여부를 시사의 소비
    • onInterceptTouchEvent: 메서드 호출, 사건 차단 내부. 이 방법은 ViewGroup,보기 (별매가 ViewGroup) 없습니다. 차단되면, 구현 ViewGrouponTouchEvent에서, ViewGroup사건과의 거래는 다음보기에 배포하지. 만 차단 현재 이벤트 있는지 여부를 나타내는 결과를 반환 한 번만 호출
    • onTouchEvent다음에 dispatchTouchEvent클릭 이벤트를 처리 할 메서드 호출, 현재 이벤트의 소비 여부를 나타내는 결과를 반환
수요일과보기로드 프로세스

에서는, startActivity를 활동을 시작할 때 활동보기의 창조와로드 의 방법이 수행하는 활동 방법,이 시간이 호출됩니다 만들 수있는 레이아웃을로드 하고 우리의 레이아웃에로드 , 실행 시간, 활동 방법 라고하며, 다음 됩니다 설정 때문에, 이 창에로드하고, 인터페이스가 표시되지 않은이 시간은 또한 당신은 측정 레이아웃과 워크 플로우를 완료보기,보기를 통해 방법을 그릴 필요가있다. 우리는보기 도면이 알 필요가 각각, 책임을 관련 한 이 관계가되어, 것, 유지 연결 후, 초기 배치를 완료하기 위해 호출됩니다의 메인 스레드 방법 요청 메시지를 전송하는 마지막 통화 트래버스 뷰 레이아웃 측정을 수행하는 방법 및 공정을 그리
ActivityThreadhandleLaunchActivityonCreatesetContentViewDecorViewDecorViewhandleResumeActivityonResumeWindowManagerDecorViewViewRootImplDecorViewViewRootDecorViewViewRootWindowManagerDecorViewViewRootViewRootImplrequestLayoutscheduleTraversalsViewRootImplperformTraversals

참고로 네 다이애나는 사용자 정의 뷰 포인트

에서 볼지지 wrap_content 속성하자 1 onMeasure그렇지 않으면, AT_MOST 모드 특수 처리 방법을 수행 wrap_content할 것이며, match_parent동일한 효과 (상속 ViewGroup도가하려는 onMeasure이 판정 처리를 확인)

if (widthMeasureSpec == MeasureSpec.AT_MOST && heightMeasureSpec == MeasureSpec.AT_MOST) { setMeasuredDimension( 200 , 200 ); // wrap_content 

디폴트 값을 설정하기 위해, (200)는 단지 일 예이며, 최종 값은 단지 너비와 높이 값 래핑 내용을 얻기 위해 계산되어야

   } else if (widthMeasureSpec == MeasureSpec.AT_MOST) {
        setMeasuredDimension( 200 ,heightMeasureSpec );
   } else if (heightMeasureSpec == MeasureSpec.AT_MOST) {
         setMeasuredDimension(heightMeasureSpec , 200 );
   }

사용자 정의 2.하자 뷰 지원 패딩 (너비와 높이 값을 뺀 패딩, 부모 레이아웃에 의한 마진 제어, 더보기 고려 없습니다 된 onDraw) ViewGroup필요가 자신의 패딩과 마진의 하위 뷰의 영향을 고려하기는 발생
의 관점에서 3. 시도를 포스트 방법의 자신의 뷰 사용하여 처리기를 사용하지 마십시오
스레드 또는 애니메이션 중지 시간에 4 onDetachedFromWindow을
핸들 충돌을 슬라이딩하는 슬라이딩과 5.view 중첩 된 경우

다섯 다이애나보기, 레이아웃을 측정하고 그릴

분석의 상단에서, 우리가보기 그리기의 과정에서 입구 것을 알고 ViewRootImplperformTraversals방법은, 메소드가 처음 호출 performMeasure방법, 통과 childWidthMeasureSpecchildHeightMeasureSpec매개 변수를이 두 매개 변수를 나타냅니다 값의 값과 창의 크기 , 결정을 측정 방법으로 측정 흐름에 대한 최종 호출보기DecorViewMeasureSpecMeasureSpecDecorViewLayoutParams

측정 :
프로세스의보기를 측정하여 ViewGroup통과보기 자체있어서 View.measure 메소드를 호출하기 전에 것 제 LayoutParams부모 레이아웃 MeasureSpec서브 고려하여 결정 MeasureSpec하고보기 폭 및 높이에 대응하는, measureSpec송신 방법 측정하기 위해 다음의 서브보기 MeasureSpec액세스 규칙은 무엇입니까? 몇몇 서브 한 경우 어디

1. 부모 레이아웃은 정확히 모드입니다 :

가. 아이 뷰 폭 또는 높이 모드 정확히 (아이 뷰의 폭과 높이가 친 볼보다 더 수 있다고 아니다?를 이하 참조), 그 크기의 아이 뷰는 판정 값은 상기 값을 결정한다
(B). 아이 뷰 폭 또는 높이로 설정 match_parent 다음 서브 뷰의 사이즈는 부모 컨테이너 나머지 공간 모델은 정확하게는 IS 채운다
C.의 서브 뷰 넓은 wrap_content 또는 고, 그 남은 공간의 서브 뷰 크기 충전 부모 컨테이너로 설정되어, 상기 용기는 상위 모드의 크기가 초과 할 수 없다 AT_MOST

2. 부모 레이아웃은 AT_MOST 모드입니다 :

가. 서브 뷰 폭 또는 높이가 결정된 값은 모드 정확하게는 IS 다음 크기의 서브 - 뷰 판정 값이된다
B.의 match_parent에 서브 뷰 폭 또는 높이 이하 부모 컨테이너의 나머지 공간을 채운다 크기의 서브보기 부모 컨테이너 크기는 모델 AT_MOST이다
C.의 용기는 상위 모드의 크기 AT_MOST 넘지없는 서브보기 폭 wrap_content 설정 또는 고, 그 남은 공간의 서브 뷰 크기 충전 부모 컨테이너

3. 아버지 레이아웃 지정되지 않은 모드입니다 :

가. 서브 뷰 폭 또는 높이가 결정된 값을 다음 크기의 서브 - 뷰 판정 값은이 모드와 정확하게된다
B.의 match_parent에 서브 뷰 너비 또는 높이, 크기의 서브 뷰 모델 미지정 0,
C.의 서브보기 wrap_content 너비 또는 높이가 다음 서브 뷰의 크기가 0 인 모델이 지정되지

폭과 높이에 도착 MeasureSpec후, 방법의 관점에서 통과 법안은보기 폭과 높이뿐만 아니라,이 시점을 결정하는

경우 1. MeasureSpec모드가 지정되어 있지 않은,이 때의 높이 또는 너비의 뷰는 배경이 설정되지 않은 경우, 설정을 반환 제공되는 배경 뷰에 따라 minWidth또는 minHeight두 값이 디폴트는 0으로 설정되어 있지 않으면, 백그라운드 뷰 설정하면 그것은을 촬영 minWidth하거나, minHeight이 배경 drawable고유 고등학교 나 창 폭 최대
2.시 MeasureSpec모드가 AT_MOST이다 정확히, 케이스 폭 및 높이를 뷰에서 반환 된 MeasureSpec값의 크기 인수의 값은 분석적 상측 결정. 사용자 정의보기를 구현하려는 경우, 상속을 통해보기 무시해야합니다 그래서 onMeasure방법 wrap_conten, 할 수있는 속성을, 그렇지 않으면 그 match_parentwrap_content효과의 특성은 동일합니다

레이아웃 :
레이아웃에있어서의 역할이 뷰 자체의 위치를 결정하는 데 사용되며, onLayout모든 자식 요소의 위치를 결정하는 방법이 때 ViewGroup, 위치 결정 후에는 onLayout그 레이아웃에있어서, 상기 서브 - 소자를 호출 모든 자식 요소를 통해 배치 방법, onLayout이 방법은 호출됩니다. 프로세스 배치 방법에 의해 처음이다 setFrame보기 네 개의 꼭지점 방법의 위치를 결정하고 또한 결정 부모 컨테이너의 위치를 보려면, 다음 호출 onLayout자식 요소의 위치를 결정하는 방법 onLayout빈 방법을, 당신은 후계자를 실현하기 위해 필요 .

getMeasuredHeight그리고 getHeight차이점은 무엇입니까 방법?
getMeasuredHeight프로세스보기의 측정치에 형성된 (측정 높이) getHeight(최종 높이)를 여러 번 이전의 프로세스에서 측정 된 폭 및 높이, 얻어진 측정 된 폭을 측정하는 측정 요구를 결정하는 것과, 어떤 경우에는, 레이아웃 처리에서 여러 뷰를 형성한다 높은 가능한 최종 불일치 폭 및 높이, 결국, 그것은 동일 정지되며, 상황이 값이 다른 양으로 이어질 수있다, 이하,이 코드는 폭 측정 뷰 높이 100 픽셀의 최종 종횡비 원인

  public void layout(int l,int t,int r, int b) { super.layout(l,t,r+100,b+100); { } 

드로잉 과정의보기는 다음 단계를 수행하십시오 :

가. 배경의 background.draw이 (캔버스) 그리기
B. 자체 (캔버스는 onDraw) 그릴
C. 어린이 (dispatchDraw) 플롯
D. 장식 그림을 (onDrawScrollBars를)

드로잉 공정 통과 도면이다 dispatchDraw이벤트 층으로 전사 층을 이끌어 낼 수 있도록, 그 하위의 모든 요소 연신 법을 통과한다 구현

추신 : 특별한 방법이보기 setWillNotDraw뷰가 반드시 즉, 오버라이드 (override) 할 필요 콘텐츠를 그려하지 않을 경우, onDraw이 태그를 열 수 있습니다, 그리기 방법을 따라 최적화되지 않습니다. 기본적으로보기는이 플래그를 구현할 필요가 있다고 생각 기본적으로 설정되지 않은 onDraw우리가 상속 할 때 그리는 방법을 ViewGroup사용자 지정 컨트롤을 구현하고, 정확하게 그린 기능을 알 필요가 없습니다 우리가 다시 작성하는 경우, 당신은이 마크를 설정할 수 onDraw있도록 표시 할, 이 태그를 닫습니다

아이 뷰의 폭과 높이를 부모 뷰 이상을 할 수 있는가?

1. 안드로이드 : = "false로"clipChildren는 상위 뷰에이 속성을 설정합니다. 중 하나를 대신 하위보기 화면을 넘어 갈 수 있습니다.
2. 서브 뷰는 상위 뷰를 넘어 몇 가지 큰 재능보다, 특정 크기를 가지고 있습니다. 예를 들면, 상위 100 픽셀 높이도 서브 뷰는 150 픽셀의 높이를 설정한다. 아이 뷰는 부모 뷰보다 큰 경우, 이러한 초과 속성은 의미가 있습니다. (높이 동적으로 코드를 할당 할 수 있지만하지 wrap_content / match_partent).
3. 부모 레이아웃뿐만 아니라 요구 (I 어쨌든 RelativeLayout의가 아닌 사용)의 LinearLayout을 사용합니다. 당신이있는 LinearLayout의 설정을 넘어해야 할 수도 있습니다 다른 레이아웃을 사용하는 경우 위의보기는 다른 레이아웃에서 설정합니다.
4. 레이아웃을 초과하지 않으면 패딩 최

무엇 여섯 다이애나 MotionEvent를인가? 그것은 여러 이벤트를 포함? 어떤 조건에서 생산 것인가?

참고 대답 :
손가락이 생성 화면을 터치 한 후 MotionEvent 이벤트의 연속이다. 다음과 같이 일반적인 이벤트 유형은 다음과 같습니다

ACTION_DOWN는 : 손가락을 화면에 새로운
ACTION_MOVE : 화면에 손가락으로 이동
ACTION_UP을 : 화면 순간에서 손을 떼면
손가락 제어 화재의 외부 층에 전류 제어에서 운영 및 이동을 누르고 : ACTION_CANCELL

정상적인 상황에서, 한 손가락으로 화면의 행동이 클릭하는 일련의 트리거 드리면
다음과 같은 상황을 고려, 이벤트를 :

화면 자료, 이벤트의 순서 클릭 한 후 : DOWN → UP
, 출시 후 잠시 동안 슬라이드로 화면을 탭 및 이벤트의 순서는 DOWN → MOVE → ..... → → MOVE했다 UP

세븐 다이애나는 어떻게 충돌보기 이벤트를 해결하기 위해

참조 대답은
충돌의 경우에 일반적인 개발있다 ScrollViewRecyclerView슬라이드 충돌 RecyclerView동일한 방향으로 슬라이딩하면서 매립이

충돌 처리 규칙을 밀어 넣습니다 :

  • 인해 외부 슬라이드 및 내부 슬라이드 방향 슬라이드 충돌 인터셉트 이벤트 슬라이딩 방향에 따라 결정될 수있다 불일치로 인한.
  • 내부 이벤트보기 가로 챌 때 외부 이벤트가 차단을 볼 수 있도록 할 때 비즈니스 요구에 따라, 때문에 같은 원인의 슬라이딩 방향의 외부 및 내부 슬라이딩 방향에 충돌 슬라이딩 지시.
  • 상대적으로 복잡 이가지 경우, 위의 중첩을 위해, 또한 필요에 따라 사업에 돌파구를 찾을 수 있습니다.

갈등의 구현을 밀어 넣습니다 :

  • 외부 인터셉트 방법 : 손가락 탭 이벤트는 먼저, 부모 컨테이너의 차단을 통해 처리 부모 컨테이너 필요한 경우이 인터셉트 이벤트 여부 인터셉트된다.
    구체적인 방법 : 부모 컨테이너 요구는 다시 onInterceptTouchEvent따라서 인터셉트 내부에, 방법.
  • 내부 차단 방법 : 부모 컨테이너가 어떤 경우 가로 채지 않는, 모든 이벤트가 자식 컨테이너로 전달에 컨테이너는이 이벤트가 직접 소비하는 경우는 true, 그렇지 않은 경우는 프로세스가 부모 컨테이너에 인도 될 아이를 필요 의미합니다.
    구체적인 방법 : 충족해야 requestDisallowInterceptTouchEvent하는 방법
여덟 다이애나 스크롤러는 탄력 슬라이드보기를 달성하는 방법입니다

참고 대답 :

  • 에서는 MotionEvent.ACTION_UP때 호출 이벤트 트리거 startScroll()에있어서,이 방법은 상기 슬라이드의 실제 동작을 수행하지 않지만, 기록 (이동 시간, 거리 슬라이딩)의 슬라이딩 량에 관한
  • 다음 호출 invalidate/postInvalidate()방법보기 다시 그리기 요청, 방법은 View.draw 원인 실행
  • 보기 그리기 방법 다시 그릴 때 호출 될 computeScroll방법을, 그리고 computeScroll것 행방 Scroller전류를 얻을 수 scrollXscrollY다음, scrollTo슬라이딩 메소드를 구현 한 후 그들이 전화를 postInvalidate두 번째 다시 그리기에 접근하고, 이전과 프로세스, 등보기를 이끌 계속 전체 때까지 끝까지 탄성 슬라이드, 슬라이드의 형성에 약간의 미끄러짐을 작은 마진을 밀어하지만, 여러 번
     
     
다이애나 차이 구 무효화 ()와 postInvalidate ()는 무엇입니까?

invalidate()그리고 postInvalidate()보기를 새로 고침하는 데 사용되는 주요 차이가있다 invalidate()하고, 핸들러를 협력 자식 스레드의 요구에 사용하는 경우, 메인 쓰레드에서 호출 postInvalidate()자식 스레드에서 직접 호출 할 수 있습니다.

열 및 서피스 뷰 SurfaceView보기 다이애나의 차이점은 무엇입니까?
  • 보기 사진은 UI 스레드에서 새로 고쳐야하고, SurfaceView자식 스레드에서 페이지를 새로 고칠 수 있습니다
  • 보기 업데이트는 주도권의 경우에 적용되며 SurfaceViewCaton 인터페이스 선도, 당신이보기를 사용하는 경우 자주 메인 스레드를 차단합니다 새로 고침 때문에, 같은 자주 새로 고침 같은 수동 업데이트에 적합
  • SurfaceView보기 때문에없고, 반면 하단에서 이중 버퍼링 메커니즘을 달성되었다 SurfaceView빈번한 리프레시 더 적합 (비디오 플레이어 인터페이스 등) 페이지 대용량을 처리 할 때 데이터를 새로 고침
열한 디안 scrollTo () 및 scollBy 차이 ()는 무엇입니까?
  • scollBy 内部调用了 scrollTo,它是基于当前位置的相对滑动;而 scrollTo 是绝对滑动,因此如果使用相同输入参数多次调用 scrollTo 方法由于 View 的初始位置是不变的,所以只会出现一次 View 滚动的效果
  • 两者都只能对 View 内容的滑动,而非使 View 本身滑动。可以使用 Scroller 有过度滑动的效果
十二丶自定义View 如何考虑机型适配?
  • 合理使用 warp_content,match_parent
  • 尽可能的是使用 RelativeLayout
  • 针对不同的机型,使用不同的布局文件放在对应的目录下,android 会自动匹配。
  • 尽量使用点 9 图片。
  • 使用与密度无关的像素单位 dp,sp
  • 引入 android 的百分比布局。
  • 切图的时候切大分辨率的图,应用到布局当中。在小分辨率的手机上也会有很好的显示效果。
十三丶View 的滑动方式

a. layout(left,top,right,bottom):通过修改 View 四个方向的属性值来修改 View 的坐标,从而滑动 View
b. offsetLeftAndRight() offsetTopAndBottom():指定偏移量滑动 view
c. LayoutParams,改变布局参数:layoutParams 中保存了 view 的布局参数,可以通过修改布局参数的方式滑动 view
d. 通过动画来移动 view:注意安卓的平移动画不能改变 view 的位置参数,属性动画可以
e. scrollTo/scrollBy:注意移动的是 view 的内容,scrollBy(50,50)你会看到屏幕上的内容向屏幕的左上角移动了,这是参考对象不同导致的,你可以看作是它移动的是手机屏幕,手机屏幕向右下角移动,那么屏幕上的内容就像左上角移动了
f. scroller:scroller 需要配置 computeScroll 方法实现 view 的滑动,scroller 本身并不会滑动 view,它的作用可以看作一个插值器,它会计算当前时间点 view 应该滑动到的距离,然后 view 不断的重绘,不断的调用 computeScroll 方法,这个方法是个空方法,所以我们重写这个方法,在这个方法中不断的从 scroller 中获取当前 view 的位置,调用 scrollTo 方法实现滑动的效果

 

추천

출처www.cnblogs.com/awkflf11/p/12085334.html