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 (); }