AndroidカスタムView、フルスクリーンスライドを実現したDrawerLayout


転載は出所を明記してください.http://blog.csdn.net/weixin_3909543/articale/details/73826250
 
    DrawerLayoutさんと一緒に使ったことがあるはずです.Google公式の引き出し式ナビゲーションコントロールです.左右のメニューを開く方式は携帯画面からです.
幕のへりのところが滑って触発しにきて、でも総括的にいくつかの**の需要はそれをフルスクリーンにスライドさせてメニューを触発することができて、ネット上にもいくつか解決方法があって、ただ使うだけです.setDrawerLeftEdgeSize() は、エッジサイズ, , bug 、 , , 。 , 。  を設定する. DrawerLayout : 
public class DrawerLayout extends ViewGroup implements DrawerLayoutImpl {
    private static final String TAG = "DrawerLayout";

    @IntDef({STATE_IDLE, STATE_DRAGGING, STATE_SETTLING})
    @Retention(RetentionPolicy.SOURCE)
    private @interface State {}

    /**
     * Indicates that any drawers are in an idle, settled state. No animation is in progress.
     */
    public static final int STATE_IDLE = ViewDragHelper.STATE_IDLE;

    /**
     * Indicates that a drawer is currently being dragged by the user.
     */
    public static final int STATE_DRAGGING = ViewDragHelper.STATE_DRAGGING;
これはView Groupのカスタムクラスを継承していますので、MyDrawerLayoutという書き方を真似してカスタマイズできます.
ontouchEvent(MotionEvent ev)はユーザーのジェスチャーを判断して、左右がスライドして相対的なアプリケーションのメニューを開けます.原理はこのようです.
     私たちは引き続きソースの引き出しを開ける方法を見ます.
 
@Override
public void onEdgeDragStarted(int edgeFlags, int pointerId) {
    final View toCapture;
    if ((edgeFlags & ViewDragHelper.EDGE_LEFT) == ViewDragHelper.EDGE_LEFT) {
        toCapture = findDrawerWithGravity(Gravity.LEFT);
    } else {
        toCapture = findDrawerWithGravity(Gravity.RIGHT);
    }

    if (toCapture != null && getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) {
        mDragger.captureChildView(toCapture, pointerId);
    }
}
この方法は、ユーザーが携帯電話の画面の端をトリガした時に、この方法をブロックし、その後 
ontouchEvent(MotionEventev)で開く方法を呼び出します.
 
private static final int MIN_DRAWER_MARGIN = 64; // dp
ソースに注意してください.これはメニューの最大幅と反対側の最小距離です.簡単に言うと、メニューがフルスクリーンで表示されたら、これをください.
この値は0に設定されます
 
   
コアコード:
 
@Override
public boolean onTouchEvent(MotionEvent ev) {

    mLeftDragger.processTouchEvent(ev);
    mRightDragger.processTouchEvent(ev);
    final View toCapture;
    final int action = ev.getAction();
    boolean wantTouchEvents = true;

    if (ev.getPointerCount() > 1) {  //      ,                       ,   onInterceptTouchEvent      

        return false;
    }
    switch (action & MotionEventCompat.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN: {
            final float x = ev.getX();
            final float y = ev.getY();
            mInitialMotionX = x;
            mInitialMotionY = y;
            closeDrawers(true);
            closeKeyboard();
            mDisallowInterceptRequested = false;
            mChildrenCanceledTouch = false;
            break;
        }

        case MotionEvent.ACTION_UP: {
            final float x = ev.getX();
            final float y = ev.getY();
            boolean peekingOnly = true;
            final View touchedView = mLeftDragger.findTopChildUnder((int) x, (int) y);
            if (touchedView != null && isContentView(touchedView)) {
                final float dx = x - mInitialMotionX;
                final float dy = y - mInitialMotionY;
                final int slop = mLeftDragger.getTouchSlop();
                if (dx * dx + dy * dy < slop * slop) {
                    // Taps close a dimmed open drawer but only if it isn't
                    // locked open.
                    final View openDrawer = findOpenDrawer();
                    if (openDrawer != null) {
                        peekingOnly = getDrawerLockMode(openDrawer) == LOCK_MODE_LOCKED_OPEN;
                    }
                }
            }
            closeDrawers(peekingOnly);
            mDisallowInterceptRequested = false;
            isCheck = false;
            break;
        }

        case MotionEvent.ACTION_CANCEL: {
            closeDrawers(true);
            mDisallowInterceptRequested = false;
            mChildrenCanceledTouch = false;
            break;
        }

        //            
       case MotionEvent.ACTION_MOVE: {   

            if (findDrawerWithGravity(Gravity.END).getVisibility() != View.VISIBLE && 
                    findDrawerWithGravity(Gravity.START).getVisibility() != View.VISIBLE) {
                final float x = ev.getX();
                final float dx = x - mInitialMotionX;
             
                if (dx > 10) {
                    //isCheck     ,                
                    if (!isCheck) {
                        toCapture = findDrawerWithGravity(Gravity.START);
                        if (getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED){
                            mLeftDragger.captureChildView(toCapture,ev.getPointerId(0));
                        }
                        isCheck = true;
                    }

                } else if ((dx < -10)) {
                    if (!isCheck) {
                        toCapture = findDrawerWithGravity(Gravity.END);
                        if (getDrawerLockMode(toCapture) == LOCK_MODE_UNLOCKED) {
                            mRightDragger.captureChildView(toCapture, ev.getPointerId(0));
                        }
                        isCheck = true;
                    }
                }

            }
            break;

        }
    }

    return wantTouchEvents;
}
 
 
 
メインコンテンツにサブコントロールがある場合は、タッチブロックと、子親タイプのオンインテートTouchEventとオンTouchEventの両方の方法でイベントを処理して配布します.
 
 
          はい、無駄話は多くないです.ソースのダウンロードを提供します.自分で分析します.
          https://download.csdn.net/download/weixin_3909543/11615398