Android 향상 의 다방면 서랍 실현 방법

3801 단어 Android서랍.
안 드 로 이 드 에서 Launch 와 같은 서랍 효 과 를 실현 하려 면 먼저 Sliding Drawer 를 떠 올 려 야 합 니 다.Sliding Drawer 는 안 드 로 이 드 공식 컨트롤 중 하나 이지 만 본 고의 주인공 은 그것 이 아니 라 민간 컨트롤 도구 집합 입 니 다.안 드 로 이 드-misc-widets.안 드 로 이 드-misc-widgets 에는 몇 개의 widget:Panel,SmoothButton,Switcher,VirtualKeyboard,그리고 일부 애니메이션 효과 가 포함 되 어 있 습 니 다.본 고 는 주로 서랍 용기 Panel 의 용법 을 소개 합 니 다.android-misc-widgets 의 google 프로젝트 주소:-widgets/http://code.google.com/p/android-misc。
프로젝트 코드 에서 Panel 의 프 리 젠 테 이 션 효 과 는 다음 과 같 습 니 다.

이 Panel 컨트롤 은 서로 다른 방향의 서랍 효 과 를 쉽게 실현 할 수 있 습 니 다.SlidingDrawer 보다 더 강 한 확장 성 을 가지 고 있 습 니 다!
Panel 을 여러 번 사용 하 는 과정 에서 Panel 에 bug 가 있 는 것 을 발견 하면 중단 적 으로'반 짝 임'이 나타 납 니 다.즉,onTouch Listener 에서 의 트리거 ACTION 입 니 다.DOWN 이후 서랍 이 순간적으로 튕 겨 나 와 순간적으로 회수 된다(버 전 날 짜 는 Feb 3,2009).원래 Panel 의 OnTouch Listener 를 교체 합 니 다.즉,다음 코드 입 니 다.

OnTouchListener touchListener = new OnTouchListener() {
 int initX;
 int initY;
 boolean setInitialPosition;
 public boolean onTouch(View v, MotionEvent event) {
 if (mState == State.ANIMATING) {
  // we are animating
  return false;
 }
//  Log.d(TAG, "state: " + mState + " x: " + event.getX() + " y: " + event.getY());
 int action = event.getAction();
 if (action == MotionEvent.ACTION_DOWN) {
  if (mBringToFront) {
  bringToFront();
  }
  initX = 0;
  initY = 0;
  if (mContent.getVisibility() == GONE) {
  // since we may not know content dimensions we use factors here
  if (mOrientation == VERTICAL) {
   initY = mPosition == TOP? -1 : 1;
  } else {
   initX = mPosition == LEFT? -1 : 1;
  }
  }
  setInitialPosition = true;
 } else {
  if (setInitialPosition) {
  // now we know content dimensions, so we multiply factors...
  initX *= mContentWidth;
  initY *= mContentHeight;
  // ... and set initial panel's position
  mGestureListener.setScroll(initX, initY);
  setInitialPosition = false;
  // for offsetLocation we have to invert values
  initX = -initX;
  initY = -initY;
  }
  // offset every ACTION_MOVE & ACTION_UP event 
  event.offsetLocation(initX, initY);
 }
 if (!mGestureDetector.onTouchEvent(event)) {
  if (action == MotionEvent.ACTION_UP) {
  // tup up after scrolling
  post(startAnimation);
  }
 }
 return false;
 }
};

다음으로 바 꾸 기:

OnTouchListener touchListener = new OnTouchListener() {
 float touchX, touchY;
 public boolean onTouch(View v, MotionEvent event) {
 if (mState == State.ANIMATING) {
  // we are animating
  return false;
 }
 int action = event.getAction();
 if (action == MotionEvent.ACTION_DOWN) {
  if (mBringToFront) {
  bringToFront();
  }
  touchX = event.getX();
  touchY = event.getY();
 }
 if (!mGestureDetector.onTouchEvent(event)) {
  if (action == MotionEvent.ACTION_UP) {
  // tup up after scrolling
  int size = (int) (Math.abs(touchX - event.getX()) + Math
   .abs(touchY - event.getY()));
  if (size == mContentWidth || size == mContentHeight) {
   mState = State.ABOUT_TO_ANIMATE;
   //Log.e("size", String.valueOf(size));
   //Log.e(String.valueOf(mContentWidth),String.valueOf(mContentHeight));
  }
  post(startAnimation);
  }
 }
 return false;
 }
};

이 bug 를 복구 할 수 있 고 OnClickListener 의 기능 도 실현 되 었 습 니 다.원래 Panel 의 OnClickListener 를 삭제 할 수 있 습 니 다!
본 고 에서 기술 한 실례 가 여러분 의 안 드 로 이 드 프로젝트 개발 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기