안 드 로 이 드 iOS 사 이 드 슬라이딩 현재 인터페이스 기능 종료
6107 단어 Androidios사 이 드 슬라이딩 퇴장
우선 효과 도 를 살 펴 보 자.
분석:
(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 사 이 드 슬라이드 를 모방 하여 현재 인터페이스 기능 종료이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.