안 드 로 이 드 왼쪽 슬라이더 메뉴
참고: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>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.