안 드 로 이 드 iOS 사 이 드 슬라이딩 현재 인터페이스 기능 종료

우 리 는 모두 ios 핸드폰 위 에 현재 화면 에서 옆으로 미 끄 러 지 는 기능 이 있다 는 것 을 알 고 있 지만 안 드 로 이 드 핸드폰 에서 시스템 은 우리 에 게 이런 기능 을 제공 하지 않 았 다.그러나 이것 은 강력 한 안 드 로 이 드 의 맞 춤 형 기능 을 막 을 수 없다.우 리 는 이런 기능 을 스스로 맞 출 수 있다.
우선 효과 도 를 살 펴 보 자.

분석:
(1)ios 의 이러한 효 과 를 모방 하려 면 우리 가 손가락 을 통 해 미 끄 러 지기 때문에 여 기 는 우리 의 미끄럼 사건 과 관계 가 있 을 것 입 니 다(onInterceptTouchEvent,onTouchEvent 라 는 두 가지 방법의 관 계 를 잘 모 르 면 사건 전달 메커니즘 원 리 를 직접 찾 아 보 세 요)
(2)우 리 는 우리 의 모든 터치 사건 을 직접적 으로 차단 하려 면 상부 구조 에서 차단 하고 처리 할 수 있다.여기 서 우 리 는 DecorView 를 생각 했다.우선 Activity 의 최상 위 부모 View 가 DecorView 라 는 것 을 알 아야 합 니 다.우리 의 DecorView 를 얻 는 것 도 간단 합 니 다.

getWindow().getDecorView() 
우리 가 평소에 쓴 xml 레이아웃 파일 들 은 모두 이 DecorView 에 감 싸 져 있 기 때문에 여기 서 우 리 는 생각 이 하나 생 겼 다.
우 리 는 xml 레이아웃 과 DecorView 사이 에 중간 레이아웃(SlidingLayout)을 추가 한 다음 에 모든 미끄럼 논리 와 미끄럼 충돌 을 이 안에서 처리 할 수 있 습 니 다.
(3)중요 한 것 은 우리 가 사 이 드 스 케 이 트 에 너 지 를 사용 해 야 할 때 우 리 는 그의 주 제 를 투명 하 게 설정 해 야 한다.이렇게 미 끄 러 질 때 아래 의 Activity 를 가리 지 않 고 코드 는 다음 과 같다.

<style name="AppTheme.Slide" parent="@style/AppTheme"> 
  <!--Required--> 
  <item name="android:windowBackground">@android:color/transparent</item> 
  <item name="android:windowIsTranslucent">true</item> 
  <item name="android:windowAnimationStyle">@style/AppTheme.Slide.Animation</item> 
 </style> 
(4)우리 가 반 화면 을 넘 을 때 현재 화면 을 종료 합 니 다.그렇지 않 으 면 원래 위치 로 돌아 갑 니 다.여 기 는 Scroller 를 사용 합 니 다.
다음은 직접 코드 를 올 려 분석 합 니 다.
1)、터치 이벤트 의 처리 과정 에서 누 른 위치 가 X 축의 10 분 의 1 이상 이면 현재 이 벤트 를 차단 하고 SlidingLayout 의 onTouchEvent 처리 에 맡 깁 니 다.

/** 
 *                     
 * 
 * @param ev 
 * @return 
 */ 
 @Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 
  int x = (int) ev.getX(); 
  int y = (int) ev.getY(); 
  boolean mIntercept = false; 
  switch (ev.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mInterceptDownX = x; 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastInterceptX; 
    int moveY = y - mLastInterceptY; 
    //      X           ,  x       y     ,    
    if (mInterceptDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY)) { 
     mIntercept = true; 
    } else { 
     mIntercept = false; 
    } 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
 
    break; 
   case MotionEvent.ACTION_UP: //          
    mIntercept = false; 
    mInterceptDownX = mLastInterceptX = mLastInterceptY = 0; 
    break; 
  } 
  return mIntercept; 
 } 
 
 private int mTouchDownX; 
 private int mLastTouchX; 
 private int mLastTouchY; 
 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 
  boolean mConsumed = false; 
  int x = (int) event.getX(); 
  int y = (int) event.getY(); 
  switch (event.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mTouchDownX = x; 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastTouchX; 
    int moveY = y - mLastTouchY; 
    if (mTouchDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY) && !mConsumed) { 
     mConsumed = true; 
    } 
    if (mConsumed) { 
     int rightMoveX = (int) (mLastTouchX - event.getX()); 
     if ((getScrollX() + rightMoveX) > 0) { //       ,getScrollX() rightMoveX   0,       
      scrollTo(0, 0); 
     } else { 
      scrollBy(rightMoveX, 0); 
     } 
    } 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_UP: 
 
    mConsumed = false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()<getWidth()/2){ //            ,         
     scrollBack(); 
    }else{ 
     scrollFinish(); 
    } 
    break; 
   case MotionEvent.ACTION_CANCEL: 
    mConsumed = false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()<getWidth()/2){ //            ,         
     scrollBack(); 
    }else{ 
     scrollFinish(); 
    } 
    break; 
  } 
  return true; 
 } 
2)화면 을 초과 하여 미 끄 러 지 는 오프셋 은 현재 화면 을 닫 습 니 다.그렇지 않 으 면 초기 위치 로 돌아 갑 니 다.

/** 
 *          
 */ 
 private void scrollBack() { 
  int startX = getScrollX(); 
  int dx = -getScrollX(); 
  mScroller.startScroll(startX, 0, dx, 0, 300); 
  invalidate(); 
 } 
 
 /** 
 *        
 */ 
 private void scrollFinish(){ 
  int dx = -getScrollX() - getWidth(); 
  mScroller.startScroll(getScrollX(),0,dx,0,300); 
  invalidate(); 
 } 
3),우 리 는 이러한 측면 미끄럼 처 리 를 우리 의 BaseActivity 에 놓 을 수 있 습 니 다.측면 미끄럼 이 필요 한 Activity 는 이 BaseActivity 를 계승 하고 테 마 를 투명 하 게 설정 하면 됩 니 다.

@Override 
 protected void onCreate(@Nullable Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  if(enableRightSliding()){ 
 
   SlidingLayout slidingLayout = new SlidingLayout(this); 
   slidingLayout.replaceCurrentLayout(this); 
  } 
 
 } 
 
 /** 
  *         true:      ,false:       
  * @return 
  */ 
 protected boolean enableRightSliding(){ 
  return false; 
 } 
원본 다운로드:ios 사 이 드 슬라이드 를 모방 하여 현재 인터페이스 기능 종료
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기