안 드 로 이 드 왼쪽 슬라이더 메뉴

우선 Scroller 대상 을 소개 해 야 합 니 다.
참고:http://blog.csdn.net/bigconvience/article/details/26697645
Scroller 는 View 가 미 끄 러 지 는 것 을 시작 할 수 없습니다. View 의 미 끄 러 지 는 효 과 는 View 자신의 scrollTo (), scrollBy (), coptute Scroll () 등 방법 으로 이 루어 집 니 다!보통 mScroller 로 View 가 굴 러 가 는 위 치 를 기록 하거나 계산 한 다음 View 의 coptute Scroll () 을 다시 써 서 실제 스크롤 을 완성 합 니 다. 
 
메모: View 의 scrollTo () 와 scrollBy () 를 호출 하 는 것 은 특정한 View 의 위 치 를 바 꾸 는 것 이 아니 라 슬라이드 View 의 내용 입 니 다.화면 에 있 는 뷰 의 위 치 를 바 꾸 려 면 다음 과 같은 방법 을 사용 할 수 있 습 니 다.
좌우 이동 방법 이나
       public void  offsetTopAndBottom (int offset) 상하 이동 에 사용 합 니 다.
예 를 들 어 button. offset Left Andrignt (300) 는 button 컨트롤 을 왼쪽으로 300 개의 픽 셀 을 이동 하 는 것 을 표시 합 니 다.
scrollTo(int x, int y) View 의 내용 을 해당 위치 로 미 끄 러 뜨리 고 참고 한 좌표계 원점 은 parent View 의 왼쪽 상단 입 니 다.
(이 점 은 매우 중요 하 다. 우리 의 이동 은 View 의 내용 만 이동 하 는 것 이다!)
 
getScrollX () 와 getScrolly () 는 View 클래스 에서 미끄럼 위 치 를 기록 하 는 방법 입 니 다!
 
다음은 제 가 자주 쓰 는 왼쪽 슬라이더 메뉴 의 예 입 니 다!
public class ScrollLinearLayout extends LinearLayout {

	public static final String tag = "scroll";

	private Context mContext;

	//           。                 ,                  。
	//       ,            ,    computeScrollOffset()        false,          。
	private Scroller mScroller;

	private int mLastX = 0;
	private int mLastY = 0;

	private int mHolderWidth = 120;

	public ScrollLinearLayout(Context context) {
		super(context);
		initWidgets(context);
	}

	public ScrollLinearLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		initWidgets(context);
	}

	private void initWidgets(Context context) {
		mContext = context;
		mScroller = new Scroller(mContext);

	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		return super.dispatchTouchEvent(ev);
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		// return super.onInterceptTouchEvent(ev);
		return true;
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		int x = (int) event.getX();//       View X  
		int y = (int) event.getY();//       View Y  

		int currentScrollX = getScrollX();//   View X       

		Log.e(tag, "x== " + x + " y== " + y + " scrollX==" + currentScrollX);

		if (MotionEvent.ACTION_DOWN == event.getAction()) {
			Log.e(tag, "MotionEvent.ACTION_DOWN");

			if (!mScroller.isFinished()) {//           ,      x y       
				mScroller.abortAnimation();//     。 forceFinished(boolean)  ,Scroller     x y       。
			}

			return true;
		} else if (MotionEvent.ACTION_UP == event.getAction()) {
			Log.e(tag, "MotionEvent.ACTION_UP");
			int newScrollX = 0;
			if (currentScrollX - mHolderWidth * 0.4 > 0) {//              4/10      100%
				newScrollX = mHolderWidth;
			}

			this.smoothScrollTo(newScrollX, 0);

		} else if (MotionEvent.ACTION_MOVE == event.getAction()) {
			Log.e(tag, "MotionEvent.ACTION_MOVE");
			int deltaX = x - mLastX;//           (X  )
			int deltaY = y - mLastY;//           (Y  )

			Log.e(tag, "deltaX== " + deltaX + " deltaY== " + deltaY);

			if (Math.abs(deltaX) > Math.abs(deltaY) * 2) {
				if (0 != deltaX) {
					int newScrollX = currentScrollX - deltaX;//      X       
					if (newScrollX < 0) {
						newScrollX = 0;
					} else if (newScrollX > mHolderWidth) {
						newScrollX = mHolderWidth;
					}
					this.scrollTo(newScrollX, 0);
				}
			}
		}
		mLastX = x;
		mLastY = y;
		return super.onTouchEvent(event);
	}

	//          
	private void smoothScrollTo(int destX, int destY) {
		int scrollX = getScrollX();
		int delta = destX - scrollX;
		mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);
		invalidate();
	}

	@Override
	public void computeScroll() {
		Log.e(tag, "computeScroll getCurrX==" + mScroller.getCurrX()
				+ " getCurrY==" + mScroller.getCurrY());
		if (mScroller.computeScrollOffset()) {
			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			postInvalidate();
		}
	}

}

 사용법:
<com.study.widgets.ScrollLinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="#000000"
        android:orientation="horizontal" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="#096722" />

        <RelativeLayout
            android:layout_width="100dp"
            android:layout_height="150dp"
            android:background="#903109" >
        </RelativeLayout>
    </com.study.widgets.ScrollLinearLayout>

 

좋은 웹페이지 즐겨찾기