Android Activity 오른쪽으로 미 끄 러 짐

오른쪽으로 미 끄 러 지고 돌아 오 는 것 은 화면 이 너무 큰 핸드폰 의 경우 한 손 으로 조작 할 때 좋 은 사용자 체험 이다.사용 자 는 더 이상 힘 들 거나 다른 손 으로 화면 왼쪽 상단 의 되 돌아 오 는 버튼 을 클릭 하지 않 아 도 된다.또는 핸드폰 오른쪽 아래 의 되 돌아 오 는 버튼 은 화면 을 살짝 오른쪽으로 미 끄 러 뜨리 면 이전 페이지 로 돌아 갈 수 있다.이 기능 은 현재 대부분의 앱 이 지원 하고 있다.당신 의 앱 은 지 지 했 습 니까?
자신 이 인터넷 바 이 두 에서 미끄러져 돌아 오 는 방법 을 사 용 했 습 니 다.어떤 것 은 제3자 컨트롤,예 를 들 어 swipebackLayout 를 사 용 했 지만 단점 이 너무 큽 니 다.예 를 들 어 자신 이 정의 한 일부 컨트롤 과 충돌 하 는 등 제스처 감청 을 판단 하 는 절차 가 상당히 번 거 롭 습 니 다.한 마디 로 하면 만 족 스 럽 지 못 합 니 다.본 편 에서 말 한 실현 방법 도 감청 사건 을 통 해 이 루어 진 것 입 니 다.그러나 절차 가 매우 간단 하고 효과 도 본인 의 끊 임 없 는 테스트 를 통 해 상당히 좋 습 니 다.그 다음 에 본인 은 실현 과정 을 설명 하 겠 습 니 다.
이 기능 을 실현 하려 면 몇 가지 조건 을 동시에 만족 시 켜 야 하고 사용자 의 조작 의 도 를 고려 해 야 한다.충분 한 민감 도 를 확보 해 야 할 뿐만 아니 라 오른쪽으로 여러 번 미 끄 러 지 거나 이전 페이지 로 돌아 가지 않 은 상황 이 나타 나 지 않도록 해 야 한다.원래 상하 로 미 끄 러 지 려 고 했 던 것 이 아니 라 오른쪽으로 미 끄 러 지 려 고 했 던 것 도 나타 나 지 말고 현재 화면 을 끝 낸 것 으로 판단 된다.그러면 우 리 는 만족 해 야 한다.
1.사용 자 는 오른쪽으로 거 리 를 미 끄 러 뜨리 고 X 축 거리>특정한 설정 값 을 사용 해 야 합 니 다.
2.오른쪽으로 미 끄 러 질 때 Y 축 으로 이동 하지 않 고 엄격 한 수평 방향 이 불가능 하기 때문에 Y 축 으로 이동 하 는 오프셋 은 특정한 설정 값 을 초과 해 서 는 안 됩 니 다.그렇지 않 으 면 사용자 의 의 도 는 미 끄 러 지 는 것 이 아니 라 상하 로 미 끄 러 지 는 것 이 라 고 생각 합 니 다.

3.테스트 과정 에서 만약 에 사용자 가 위아래 로 미 끄 러 지 려 고 할 때 손가락 이 Y 축 에서 이동 속도(우 리 는 초당 이동 하 는 픽 셀 값 으로 Velocity Tracker 류 를 통 해 계산 할 수 있 음)가 매우 크 고 보통 수천 에서 만 이 넘 으 며 정상 적 인 수준 에서 미 끄 러 질 때 Y 축의 이동 속 도 는 보통 100 정도 에 불과 하기 때문에 우리 가 판단 해 야 할 것 은...Y 축 위의 손가락 이 미 끄 러 지 는 속도 가 특정한 설정 치 를 초과 하면(본인 은 이 값 을 1000 으로 설정 합 니 다)사용자 의 의 도 는 오른쪽 으로 미 끄 러 지 는 것 이 아니 라 상하 로 미 끄 러 지 는 것 이 라 고 생각 합 니 다.
자,다음 에 우 리 는 BaseActivity 계승 Activity 를 사용자 정의 하고 BaseActivity 에서 사건 을 다시 써 서 dispatchTouchEvent 를 나 누 어 주 며 손가락 을 누 르 고 이동 하 는 거리 와 손가락 이 미 끄 러 지 는 속 도 를 기록 하여 사용자 의 의도,전체 코드 를 판단 할 수 있 습 니 다.

package com.kincai.store.ui;
 
import com.kincai.store.utils.LogTest;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.VelocityTracker;
 
/**
 * 
 * @company KCS       
 * 
 * @author kincai
 * 
 * @description baseActivity
 *
 * @project Kincai_Store
 *
 * @package com.kincai.store.ui
 *
 * @time 2015-7-13   10:18:29
 *
 */
public class BaseActivity extends Activity {
 
 
 //             
 private static final int YSPEED_MIN = 1000;
 
 //             
 private static final int XDISTANCE_MIN = 50;
 
 //               
 private static final int YDISTANCE_MIN = 66;
 
 private static final String TAG = "BaseActivity";
 
 //            。
 private float xDown;
 
 //            。
 private float yDown;
 
 //            。
 private float xMove;
 
 //            。
 private float yMove;
 
 //            。
 private VelocityTracker mVelocityTracker;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 LogTest.LogMsg(TAG, "BaseActivity-onCreate");
 
 }
 
 @Override
 public boolean dispatchTouchEvent(MotionEvent event) {
 createVelocityTracker(event);
 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN:
 xDown = event.getRawX();
 yDown = event.getRawY();
 break;
 case MotionEvent.ACTION_MOVE:
 xMove = event.getRawX();
 yMove = event.getRawY();
 //      
 int distanceX = (int) (xMove - xDown);
 int distanceY = (int) (yMove - yDown);
 //       
 int ySpeed = getScrollVelocity();
 //   Activity       :
 // 1.x      >XDISTANCE_MIN
 // 2.y       YDISTANCE_MIN   
 // 3.y  (        )<XSPEED_MIN,    ,                   Activity
 if (distanceX > XDISTANCE_MIN
  && (distanceY < YDISTANCE_MIN && distanceY > -YDISTANCE_MIN)
  && ySpeed < YSPEED_MIN) {
 finish();
 }
 break;
 case MotionEvent.ACTION_UP:
 recycleVelocityTracker();
 break;
 default:
 break;
 }
 return super.dispatchTouchEvent(event);
 
 }
 
 /**
 *   VelocityTracker  ,              VelocityTracker  。
 * 
 * @param event
 * 
 */
 private void createVelocityTracker(MotionEvent event) {
 if (mVelocityTracker == null) {
 mVelocityTracker = VelocityTracker.obtain();
 }
 mVelocityTracker.addMovement(event);
 }
 
 /**
 *   VelocityTracker  。
 */
 private void recycleVelocityTracker() {
 mVelocityTracker.recycle();
 mVelocityTracker = null;
 }
 
 /**
 * 
 * @return     ,               。
 */
 private int getScrollVelocity() {
 //1000  
 mVelocityTracker.computeCurrentVelocity(1000);
 int velocity = (int) mVelocityTracker.getYVelocity();
 return Math.abs(velocity);
 }
 
 @Override
 protected void onStart() {
 // TODO Auto-generated method stub
 super.onStart();
 LogTest.LogMsg(TAG, "BaseActivity-onStart");
 }
 
 @Override
 protected void onResume() {
 // TODO Auto-generated method stub
 super.onResume();
 LogTest.LogMsg(TAG, "BaseActivity-onResume");
 }
 
 @Override
 protected void onPause() {
 // TODO Auto-generated method stub
 super.onPause();
 LogTest.LogMsg(TAG, "BaseActivity-onPause");
 }
 
 @Override
 protected void onDestroy() {
 // TODO Auto-generated method stub
 super.onDestroy();
 LogTest.LogMsg(TAG, "BaseActivity-onDestroy");
 }
 
}
프로그램 activity 가 미끄럼 반환 기능 을 실현 하려 면 BaseActivity 를 직접 계승 하면 됩 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기