안 드 로 이 드 프로 그래 밍 슬라이딩 효과 갤러리 모방 이미지 집합 탐색 실현 방법
안 드 로 이 드 시스템 은 갤러리 를 가지 고 그림 을 탐색 하 는 응용 프로그램 으로 손가락 을 드래그 할 때 그림 을 유창 하 게 표시 할 수 있어 사용자 의 상호작용 과 체험 이 모두 좋다.
이 예 는 Gallery 와 사용자 정의 View 를 통 해 Gallery 이미지 집합 을 모방 한 그림 탐색 효 과 를 모방 하 는 것 입 니 다.효과 도 는 다음 과 같다.
1.기본 원리
Activity 에서 OnGesture Listener 의 인터페이스 onFling()제스처 이 벤트 를 실현 하고 사용자 정의 View 를 통 해 draw()그림 을 그립 니 다.
2、Activity
Activity 에 서 는 onTouchEvent()를 통 해 myGesture.onTouchEvent(event)를 등록 합 니 다.
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
flingView.onFling(0); // , offsetX = 0
break;
}
return myGesture.onTouchEvent(event);
}
이 어 인터페이스 OnGestureListener 의 onScroll()방법 을 실현 하여 View 의 FlingView 를 계승 하 는 handle Scroll()구성원 에 게 미끄럼 파 라 메 터 를 전달 하고 미 끄 러 지 는 x 축 거 리 를 가 져 옵 니 다.
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
flingView.handleScroll(-1 * (int) distanceX);
return true;
}
이 어 인터페이스 OnGesture Listener 의 OnFling()방법 을 실현 하여 View 의 Fling View 를 계승 하 는 onFling()멤버 들 에 게 미끄럼 파 라 메 터 를 전달 하고 제스처 의 속 도 를 얻는다.
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
flingView.onFling((int) - velocityX);
return true;
}
3、FlingViewFlingView 에서 Activity 에서 제스처 속도 가 져 오기
public void onFling(int paramFloat1) {
if (offsetX > GalleryDemoActivity.deviceScreenWidth / 5) {
if (fBitmap != null) {
isFling = true;
isFlingRight = true;
}
} else if (offsetX < -GalleryDemoActivity.deviceScreenWidth / 5) {
if (nBitmap != null) {
isFling = true;
isFlingLeft = true;
}
}
//
startAnimation(new MyAnimation());
}
미끄럼 과정 에서 View 를 실현 하 는 Draw()방법 으로 그림 을 그립 니 다.주의:현재 그림(초점 획득)과 다음 그림(초점 획득 예정)을 동시에 두 장의 그림 으로 그 려 야 합 니 다.
@Override
public void draw(Canvas canvas) {
Paint paint = new Paint();
Rect rect = new Rect();
canvas.drawColor(Color.BLACK);
//
if (bitmap != null) {
int left = offsetX;
int top = offsetY;
int right = offsetX + GalleryDemoActivity.deviceScreenWidth;
int bottom = offsetY + GalleryDemoActivity.deviceScreenHeight;
rect.set(left, top, right, bottom);
canvas.drawBitmap(bitmap, null, rect, paint);
}
//
if (offsetX < 0) { //
if (nBitmap != null) {
int left = GalleryDemoActivity.deviceScreenWidth + 15 + offsetX;
int top = 0;
int right = left + GalleryDemoActivity.deviceScreenWidth;
int bottom = GalleryDemoActivity.deviceScreenHeight;
rect.set(left, top, right, bottom);
canvas.drawBitmap(nBitmap, null, rect, paint);
}
} else if (offsetX > 0) { //
if (fBitmap != null) {
int left = -GalleryDemoActivity.deviceScreenWidth - 15 + offsetX;
int top = 0;
int right = left + GalleryDemoActivity.deviceScreenWidth;
int bottom = GalleryDemoActivity.deviceScreenHeight;
rect.set(left, top, right, bottom);
canvas.drawBitmap(fBitmap, null, rect, paint);
}
}
}
미끄럼 그림 이 끝 난 후에 미끄럼 애니메이션 을 처리 하고 현재 그림 과 현재 그림 의 이전 그림 과 다음 상 태 를 다시 설정 하여 다음 미끄럼 을 준비 해 야 합 니 다.
@Override
protected void onAnimationEnd() {
if (isFlingRight) { // ,position 1
nBitmap = bitmap;
bitmap = fBitmap;
fBitmap = null;
postion = postion - 1;
} else if (isFlingLeft) { // ,position 1
fBitmap = bitmap;
bitmap = nBitmap;
nBitmap = null;
postion = postion + 1;
}
isFlingRight = false;
isFlingLeft = false;
isFling = false;
offsetX = 0;
if (fBitmap == null && offsetX == 0) { // ( ), (position - 1)
if (postion > 0) {
fBitmap = getBitmap(postion - 1);
}
} else if (nBitmap == null && offsetX == 0) { // ( ), (position + 1)
if (postion < bitmaps.length - 1) {
nBitmap = getBitmap(postion + 1);
}
}
clearAnimation();
}
4.제스처 좌표 소개이 예제 에 서 는 OnGesture Listener 인터페이스 의 onScroll()과 OnFling()방법 을 사용 하여 안 드 로 이 드 시스템 좌표 및 터치 MotionEvent e1 과 e2,속도 velocity X,velocity Y 등 값 과 관련된다.
Android 화면 좌표계 아래 그림(왼쪽)
(1)MotionEvent 에서 e1 은 손가락 이 처음으로 화면의 시작 점 을 누 르 는 것 입 니 다.e2 는 손가락 을 들 어 화면의 끝 을 떠 나 는 것 입 니 다.위의 그림 에서 안 드 로 이 드 화면 좌표계 에 따라 알 수 있 습 니 다.
손가락 이 오른쪽으로 미 끄 러 지고 종점(e2)은 출발점(e1)오른쪽 에 있 으 며 e2.getX()-e1.getX()는 0 보다 크다.
손가락 이 왼쪽으로 미 끄 러 지고 종점(e2)은 출발점(e1)왼쪽 에 있 으 며 e2.getX()-e1.getX()는 0 보다 작 습 니 다.
손가락 이 아래로 미 끄 러 지고 종점(e2)은 출발점(e1)의 아래쪽 에 e2.getY()-e1.getY()가 0 보다 크다.
손가락 이 위로 미 끄 러 지고 종점(e2)은 출발점(e1)의 위쪽 에 e2.getY()-e1.getY()가 0 보다 작 습 니 다.
(2)onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
distanceX 는 앞 뒤 두 번 의 call 의 X 거리 로 e2 와 e1 의 수평 거리 가 아 닙 니 다.
distanceX,앞 뒤 두 번 의 call 의 Y 거리 이지 e2 와 e1 의 수직 거리 가 아 닙 니 다.
구체 적 인 수치의 방향 은 위의 그림(중)을 보십시오.
(3)onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
velocity X,X 축의 초당 속도 입 니 다.
velocity Y,Y 축의 초당 속도 입 니 다.
구체 적 인 수치의 방향 은 위의 그림(오른쪽)을 보십시오.
자세히 살 펴 보면 velocity X,velocity Y 의 방향 은 distance X,distancey 방향 과 정반 대 임 을 알 수 있다.
더 많은 OnGestureListener 인터페이스 함수 소개
더 많은 안 드 로 이 드 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,과 을 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 안 드 로 이 드 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.