<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                Android群英傳讀書筆記(第五章) 書中的示例代碼:github 1.Android的坐標系是以左上角為頂點,向右為x軸正方向,向下是y軸正方向。在觸控事件中通過getRawX()和getRawY()獲取Android坐標系中的坐標。在View中通過getLocationOnScreen(intlocation[])獲取。 2.視圖坐標系描述的是子視圖在父視圖中的位置關系,原點為父視圖的右上角,x、y軸方向與Android坐標系一致。觸控事件中通過getX(),getY()獲取。還可以通過getTop(),getLeft(),getBottom(),getRight()來獲取到父視圖的距離。 3.MotionEvent常用事件常量: MotionEvent.ACTION_DOWN//單點觸摸按下動作 MotionEvent.ACTION_UP//單點觸摸離開動作 MotionEvent.ACTION_MOVE//觸摸點移動動作 MotionEvent.ACTION_CANCEL//觸摸動作取消 MotionEvent.ACTION_OUTSIDE//觸摸動作超出邊界 MotionEvent.ACTION_POINTER_DOWN//多點觸摸按下動作 MotionEvent.ACTION_POINTER_UP//多點離開動作 4.實現滑動的七種方法: layout()方法: private int lastX; private int lastY; private int offsetX; private int offsetY; @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: offsetX = x - lastX; offsetY = y - lastY; layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY); lastX = x; lastY = y; break; } return true; } offsetLeftAndRight()和offsetTopAndBottom()方法: //替換上面的layout方法即可 offsetLeftAndRight(offsetX); offsetTopAndBottom(offsetY); LayoutParams方法: //替換上面的layout方法即可 ViewGroup.MarginLayoutParams layoutParams=(MarginLayoutParams) getLayoutParams(); layoutParams.leftMargin=getLeft()+offsetX; layoutParams.topMargin=getTop()+offsetY; setLayoutParams(layoutParams); scrollTo和scrollBy: //scrollTo和scrollBy移動的是view的內容而不是view本身 //如果在viewgroup中使用就是移動所有子view。 View view=(View) getParent(); //scrollTo和scrollBy參考的坐標系正好與視圖坐標系相反,所以offset需為負 view.scrollBy(-offsetX, -offsetY); Scroller: 使用Scroller主要有三個步驟: 1.初始化Scroller對象,一般在view初始化的時候同時初始化scroller; 2.重寫view的computeScroll方法,computeScroll方法是不會自動調用的,只能通過invalidate來間接調用,實現循環獲取scrollX和scrollY的目的,當移動過程結束之后,Scroller.computeScrollOffset方法會返回false,從而中斷循環; 3.調用Scroller.startScroll方法,將起始位置、偏移量以及移動時間(可選)作為參數傳遞給startScroll方法。 這個例子中,要實現的是view跟著手指滑動 松手后平滑移動到原位置。 先初始化Scroller mScroller=new Scroller(getContext()); 然后重寫View的computeScroll()方法 @Override public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset()) { ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate(); } } 最后在onTouchEvent的MotionEvent.ACTION_UP時開啟移動 @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: int offsetX = x - lastX; int offsetY = y - lastY; ((View) getParent()).scrollBy(-offsetX, -offsetY); break; case MotionEvent.ACTION_UP: // 手指離開時,執行滑動過程 View viewGroup = ((View) getParent()); mScroller.startScroll( viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX(), -viewGroup.getScrollY(),1000); invalidate(); break; } return true; } Scroller的實現原理就是不斷調用scrollTo或者scrollBy。 屬性動畫(以后章節會詳細介紹) ViewDragHelper: ViewDragHelper基本可以實現各種不同滑動需求,但使用稍微復雜。 public class DragViewGroup extends FrameLayout { private ViewDragHelper mViewDragHelper; private View mMenuView, mMainView; private int mWidth; public DragViewGroup(Context context) { super(context); initView(); } public DragViewGroup(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public DragViewGroup(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mMenuView = getChildAt(0); mMainView = getChildAt(1); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = mMenuView.getMeasuredWidth(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mViewDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { //將觸摸事件傳遞給ViewDragHelper,此操作必不可少 mViewDragHelper.processTouchEvent(event); return true; } private void initView() { mViewDragHelper = ViewDragHelper.create(this, callback); } private ViewDragHelper.Callback callback = new ViewDragHelper.Callback() { // 何時開始檢測觸摸事件 @Override public boolean tryCaptureView(View child, int pointerId) { //如果當前觸摸的child是mMainView時開始檢測 return mMainView == child; } // 觸摸到View后回調 @Override public void onViewCaptured(View capturedChild, int activePointerId) { super.onViewCaptured(capturedChild, activePointerId); } // 當拖拽狀態改變,比如idle,dragging @Override public void onViewDragStateChanged(int state) { super.onViewDragStateChanged(state); } // 當位置改變的時候調用,常用與滑動時更改scale等 @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { super.onViewPositionChanged(changedView, left, top, dx, dy); } // 處理垂直滑動 @Override public int clampViewPositionVertical(View child, int top, int dy) { return 0; } // 處理水平滑動 @Override public int clampViewPositionHorizontal(View child, int left, int dx) { return left; } // 拖動結束后調用 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel); //手指抬起后緩慢移動到指定位置 if (mMainView.getLeft() < 500) { //關閉菜單,相當于Scroller的startScroll方法 mViewDragHelper.smoothSlideViewTo(mMainView, 0, 0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); } else { //打開菜單 mViewDragHelper.smoothSlideViewTo(mMainView, 300, 0); ViewCompat.postInvalidateOnAnimation(DragViewGroup.this); } } }; @Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)) { ViewCompat.postInvalidateOnAnimation(this); } } }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看