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 를 직접 계승 하면 됩 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.