AndroidカスタムView、フルスクリーンスライドを実現したDrawerLayout
転載は出所を明記してください.http://blog.csdn.net/weixin_3909543/articale/details/73826250
DrawerLayoutさんと一緒に使ったことがあるはずです.Google公式の引き出し式ナビゲーションコントロールです.左右のメニューを開く方式は携帯画面からです.
幕のへりのところが滑って触発しにきて、でも総括的にいくつかの**の需要はそれをフルスクリーンにスライドさせてメニューを触発することができて、ネット上にもいくつか解決方法があって、ただ使うだけです.
ontouchEvent(MotionEvent ev)はユーザーのジェスチャーを判断して、左右がスライドして相対的なアプリケーションのメニューを開けます.原理はこのようです.
私たちは引き続きソースの引き出しを開ける方法を見ます.
ontouchEvent(MotionEventev)で開く方法を呼び出します.
この値は0に設定されます
コアコード:
メインコンテンツにサブコントロールがある場合は、タッチブロックと、子親タイプのオンインテートTouchEventとオンTouchEventの両方の方法でイベントを処理して配布します.
はい、無駄話は多くないです.ソースのダウンロードを提供します.自分で分析します.
https://download.csdn.net/download/weixin_3909543/11615398
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