중첩있는 ScrollView 용액 글고 슬라이드와 관련된

EDITTEXT 슬립 이벤트있는 ScrollView 솔루션은 중첩, 그리고 둘 사이에 슬라이딩과 연합. 그것은 결국 슬라이딩, 슬라이딩과 관련된 어떤 시간 글고 부분은, 그 때 슬라이딩 이벤트가 그들 사이의 완전한 연속성이되도록,있는 ScrollView의 외부를 따라 슬라이드 허용해야 할 때입니다. 의이 효과를 살펴 보자.

온라인 전체 구현의 예를 찾을 수 없습니다, 그는 자신의 라인과 데모를했다.
다음과 같이 주석 코드, 모든 코드는 다음과 같습니다

패키지 chn.fz.thatjay.scrolleditview.view;
수입 android.content.Context;
수입 android.content.res.TypedArray;
수입 android.text.Layout;
수입 android.util.AttributeSet;
수입 android.support.v7.widget.AppCompatEditText;
수입 android.util.Log;
수입 android.view.MotionEvent;
수입 android.view.View에서;
수입 android.widget.RelativeLayout; 

수입 chn.fz.thatjay.scrolleditview.R; 


공공  클래스 ScrollMulrowsEditText는 확장 AppCompatEditText { 

    개인  결승전문자열 TAG = "ScMulrowsEditText" ;
    // 滑动距离的最大边界
    개인  INT mOffsetHeight; 

    개인  INT mHeight; 


    개인  의 INT mVert = 0 ; 


    공개 ScrollMulrowsEditText (컨텍스트 컨텍스트) {
         슈퍼 (컨텍스트); 
    } 

    공개 ScrollMulrowsEditText (컨텍스트 컨텍스트 속성 세트에 바인드합니다) {
         슈퍼 (문맥 attrs에); 
        initAttribute (문맥 attrs에, 0 ); 
    } 

    공공 ScrollMulrowsEditText (컨텍스트 컨텍스트의 AttributeSet attrs에, INT defStyleAttr) {
         슈퍼(문맥 attrs에, defStyleAttr) 
        initAttribute (문맥 attrs에, defStyleAttr) 
    } 


    @Override가 
    보호  공극 된 onMeasure을 ( INT widthMeasureSpec, INT heightMeasureSpec) {
         슈퍼 .onMeasure (widthMeasureSpec, heightMeasureSpec) 

        int로 상기 paddingTop
         INT paddingBottom;
         INT의 높이;
         INT mLayoutHeight; 

        // 얻을 컨텐츠 창 
        레이아웃 mLayout = getLayout ();
         // 패널 높이의 내용을 얻을 
        mLayoutHeight = mLayout.getHeight을 ();
         //이 패딩 받기
        = paddingTop getTotalPaddingTop ();
         // 다음 패딩 얻을 
        paddingBottom = getTotalPaddingBottom을 (); 

        // 제어의 실제 높이를 얻을 
        높이 = mHeight; // getHeight ()는 제 0을 제공하기 위해, 외부로부터의 설정을 지정하는 것이 바람직하다 

        / / 경계 mOffsetHeight 콘텐츠의 슬라이딩 거리 이하, 0의 값이 더 스크롤바 때 때 계산 
        paddingTop + + = mLayoutHeight paddingBottom mOffsetHeight 없음 - 높이; 

        setOnTouchListener (); 
        만약에 (getId () == R.id.edittext2) { 
            Log.d을 (태그, "ffffaaaa 된 onMeasure의 =="+ mOffsetHeight); 
        } 
    } 

    개인  공극 initAttribute (컨텍스트 컨텍스트의 AttributeSet attrs에,INT defStyleAttr) { 
        하는 TypedArray 어레이 = context.obtainStyledAttributes (바인드합니다, R.styleable.ScrollMulrowsEditText, defStyleAttr, 0 );
        INT의 개수 = array.getIndexCount ();
        위한 ( int로 I = 0; I <카운트, 내가 ++ ) {
             INT ATTR = array.getIndex (I);
            스위치 (ATTR) {
                 경우 R.styleable.ScrollMulrowsEditText_sc_mul_edit_height : 
                    mHeight = array.getDimensionPixelSize (ATTR, 0 );
                    휴식 ; 
            } 
        } 
        array.recycle (); 
    } 

    @Override은 
    보호  공간 onScrollChanged을 ( INT 수평 위, INT 수직, INT oldHoriz, INT oldVert) {
         슈퍼 .onScrollChanged (수평 위, 수직, oldHoriz, oldVert) 
        mVert = 수직;
         IF (getId () == R.id.edittext2) { 
            Log.d (태그, "ffffaaaa mOffsetHeight =="+ mOffsetHeight + ",, 수직 ==="+ 버트); 
        } 
        IF (수직 mOffsetHeight == == 0 || 수직 ) {
             / / 여기에 이벤트 슬라이드 레이아웃 부모 나 할아버지 레이아웃을 트리거
            의 getParent () requestDisallowInterceptTouchEvent. ( false로는 ) 
            Log.d (태그, "FALSE로 수직 requestDisallowInterceptTouchEvent는" ); 
        } 
    } 

    // 의 상단에 슬라이드 
    공개  부울 () {isUpperEdge
         반환 mVert의 == 0 ; 
    } 

    // 의 하단까지 미끄러 
    공개  부울 isLowerEdge () {
         반환 mVert == mOffsetHeight을; 
    } 

    개인  부동 scrollBeginY,
     공공  무효 setOnTouchListener () { 
        setOnTouchListener ( 새 새View.OnTouchListener () { 
            @Override 
            공공  부울 OnTouch (보기 V의 MotionEvent 이벤트) {
                 // canScrollVertically () 메소드는 스크롤 방향이 결정 여부를 지정하는 인수는 긍정적 위로 스크롤 할 수 있는지 여부를 확인, 부정적, 긍정적 또는 부정적 스크롤 다운 여부를 확인하는 
                경우 (MotionEvent.ACTION_DOWN == event.getAction은 ()) { 
                    scrollBeginY = ; event.getY ()가 
                    . v.getParent () (requestDisallowInterceptTouchEvent true로는 ); // 부모 클래스의 레이아웃을 필요로 터치 이벤트 차단되지 않습니다 
                    반환  거짓 ; 
                } 
                Log.d (태그, "event.getY"+ event.getY ()); // 글고 극단 에지 getY는 고정 된 값이 아닌 경우 얻어지는 
                경우(canScrollVertically. (1)) { // 스크롤 할 
                    IF (isUpperEdge () && event.getY ()> = scrollBeginY) { // 상부 에지 슬라이드 하향 제스처 갖는다 
                        v.getParent을 (). requestDisallowInterceptTouchEvent ( 거짓으로 ) ; // 상위 레이아웃 
                    } 다른 { 
                        (. v.getParent () requestDisallowInterceptTouchEvent 는 true ); 
                    } 
                } 다른  IF (canScrollVertically (-1)) { // 스크롤 할 
                    IF (isLowerEdge () && event.getY () < scrollBeginY =) { //는 하단 슬라이드 상향 제스처를 갖는다
                        v.getParent () requestDisallowInterceptTouchEvent (. false로 ); // 부모 레이아웃 
                    } 다른 { 
                        v.getParent () requestDisallowInterceptTouchEvent. ( true로 ); 
                    } 
                } 다른 { 
                    v.getParent () requestDisallowInterceptTouchEvent (. false로 ); // 로 아버지 레이아웃 
                }
                 // 최고 getY 값에 getY 작은 휴대 전화 화면
                 // getY 전화 화면 아래에 더 큰 getY가 
                돌아  거짓 ; 
            } 
        )};
    } 


}

 

활동 코드는 다음과 같은 사라질 때 키보드 입력 방법을 모니터링하는 데 사용 타사 라이브러리의 ImmersionBar, 그래서 글고 그렇지 않으면 글고 커서가보기 위하여 어려웠다 초점을 잃는다.

@Override
 보호  공극 에서 onCreate (번들 savedInstanceState) {
         슈퍼 .onCreate (savedInstanceState); 
        된 setContentView (R.layout.activity_main); 
        initStatusBar (edittext1, edittext2, edittext3, edittext4, edittext5); 
} 
공공  무효 initStatusBar ( 최종 글고 ... ETS) { 
        ImmersionBar.with ( ) 
                .fitsSystemWindows ( 사실 ) 
                .statusBarColor (R.color.color1) 
                .keyboardEnable ( 사실 ) 
                .setOnKeyboardListener (  OnKeyboardListener () {
                    @Override 
                    공공  무효 onKeyboardChange ( 부울 isPopup, INT keyboardHeight) {
                         경우 (! {isPopup)
                             에 대한 (글고 치기 등 : ETS 
                            ) { 
                                et.clearFocus (); 
                            } 
                        } 
                    } 
                }) 
                .init (); 
    }

 

전체 프로젝트 코드 : GitHub의 다운로드

 

추천

출처www.cnblogs.com/that-jay/p/11487535.html