久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Android實(shí)現(xiàn)三段式滑動(dòng)效果

瀏覽:46日期:2022-09-18 09:17:50
目錄高德的效果:高德的效果:

Android實(shí)現(xiàn)三段式滑動(dòng)效果

實(shí)現(xiàn)的效果:

Android實(shí)現(xiàn)三段式滑動(dòng)效果

我們實(shí)現(xiàn)的效果和高德差距不是很大,也很順滑。具體實(shí)現(xiàn)其實(shí)就是集成CoordinatorLayout.Behavior

/** * 高德首頁(yè)滑動(dòng)效果 */public class GaoDeBottomSheetBehavior<V extends View> extends CoordinatorLayout.Behavior<V> { public static final int STATE_DRAGGING = 1; public static final int STATE_SETTLING = 2; public static final int STATE_EXPANDED = 3; public static final int STATE_COLLAPSED = 4; public static final int STATE_HIDDEN = 5; public static final int STATE_HALF_EXPANDED = 6; public static final int PEEK_HEIGHT_AUTO = -1; private static final float HIDE_THRESHOLD = 0.5F; private static final float HIDE_FRICTION = 0.1F; public static final int MIDDLE_HEIGHT_AUTO = -1; private boolean fitToContents = true; private float maximumVelocity; private int peekHeight; private boolean peekHeightAuto; private int peekHeightMin; private int lastPeekHeight; int fitToContentsOffset; int halfExpandedOffset; int collapsedOffset; boolean hideable; private boolean skipCollapsed; int state = STATE_COLLAPSED; ViewDragHelper viewDragHelper; private boolean ignoreEvents; private int lastNestedScrollDy; private boolean nestedScrolled; int parentHeight; WeakReference<V> viewRef; WeakReference<View> nestedScrollingChildRef; private GaoDeBottomSheetBehavior.BottomSheetCallback callback; private VelocityTracker velocityTracker; int activePointerId; private int initialY; boolean touchingScrollingChild; private Map<View, Integer> importantForAccessibilityMap; private final Callback dragCallback; private int mMiddleHeight; private boolean mMiddleHeightAuto; public GaoDeBottomSheetBehavior() {this.dragCallback = new NamelessClass_1(); } public GaoDeBottomSheetBehavior(Context context, AttributeSet attrs) {super(context, attrs);this.dragCallback = new NamelessClass_1();TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BottomSheetBehavior_Layout);TypedValue value = a.peekValue(R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight);if (value != null && value.data == -1) { this.setPeekHeight(value.data);} else { this.setPeekHeight(a.getDimensionPixelSize(R.styleable.BottomSheetBehavior_Layout_behavior_peekHeight, -1));}this.setHideable(a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_hideAble, false));this.setFitToContents(a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_fitToContents, true));this.setSkipCollapsed(a.getBoolean(R.styleable.BottomSheetBehavior_Layout_behavior_skipCollapse, false));setMiddleHeight(a.getDimensionPixelSize(R.styleable.BottomSheetBehavior_Layout_behavior_middleHeight, MIDDLE_HEIGHT_AUTO));a.recycle();ViewConfiguration configuration = ViewConfiguration.get(context);this.maximumVelocity = (float) configuration.getScaledMaximumFlingVelocity(); } class NamelessClass_1 extends Callback {NamelessClass_1() {}@Overridepublic boolean tryCaptureView(@NonNull View child, int pointerId) { if (GaoDeBottomSheetBehavior.this.state == STATE_DRAGGING) {return false; } else if (GaoDeBottomSheetBehavior.this.touchingScrollingChild) {return false; } else {if (GaoDeBottomSheetBehavior.this.state == 3 && GaoDeBottomSheetBehavior.this.activePointerId == pointerId) { View scroll = (View) GaoDeBottomSheetBehavior.this.nestedScrollingChildRef.get(); if (scroll != null && scroll.canScrollVertically(-1)) {return false; }}return GaoDeBottomSheetBehavior.this.viewRef != null && GaoDeBottomSheetBehavior.this.viewRef.get() == child; }}@Overridepublic void onViewPositionChanged(@NonNull View changedView, int left, int top, int dx, int dy) { GaoDeBottomSheetBehavior.this.dispatchOnSlide(top);}@Overridepublic void onViewDragStateChanged(int state) { if (state == 1) {GaoDeBottomSheetBehavior.this.setStateInternal(STATE_DRAGGING); }}@Overridepublic void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) { int top; byte targetState; int currentTop; if (yvel < 0.0F) {if (GaoDeBottomSheetBehavior.this.fitToContents) { currentTop = releasedChild.getTop(); if (currentTop < (collapsedOffset + HIDE_THRESHOLD) && currentTop >= halfExpandedOffset) {top = GaoDeBottomSheetBehavior.this.halfExpandedOffset;targetState = STATE_HALF_EXPANDED; } else {top = GaoDeBottomSheetBehavior.this.fitToContentsOffset;targetState = STATE_EXPANDED; }} else { currentTop = releasedChild.getTop(); if (currentTop > GaoDeBottomSheetBehavior.this.halfExpandedOffset) {top = GaoDeBottomSheetBehavior.this.halfExpandedOffset;targetState = STATE_HALF_EXPANDED; } else {top = 0;targetState = STATE_EXPANDED; }} } else if (!GaoDeBottomSheetBehavior.this.hideable || !GaoDeBottomSheetBehavior.this.shouldHide(releasedChild, yvel) || releasedChild.getTop() <= GaoDeBottomSheetBehavior.this.collapsedOffset && Math.abs(xvel) >= Math.abs(yvel)) {if (yvel != 0.0F && Math.abs(xvel) <= Math.abs(yvel)) { currentTop = releasedChild.getTop(); if (currentTop < halfExpandedOffset) {top = GaoDeBottomSheetBehavior.this.halfExpandedOffset;targetState = STATE_HALF_EXPANDED; } else {top = GaoDeBottomSheetBehavior.this.collapsedOffset;targetState = STATE_COLLAPSED; }} else { currentTop = releasedChild.getTop(); if (GaoDeBottomSheetBehavior.this.fitToContents) {if (Math.abs(currentTop - GaoDeBottomSheetBehavior.this.fitToContentsOffset) < Math.abs(currentTop - GaoDeBottomSheetBehavior.this.collapsedOffset)) { top = GaoDeBottomSheetBehavior.this.fitToContentsOffset; targetState = STATE_EXPANDED;} else { top = GaoDeBottomSheetBehavior.this.collapsedOffset; targetState = STATE_COLLAPSED;} } else if (currentTop < GaoDeBottomSheetBehavior.this.halfExpandedOffset) {if (currentTop < Math.abs(currentTop - GaoDeBottomSheetBehavior.this.collapsedOffset)) { top = 0; targetState = STATE_EXPANDED;} else { top = GaoDeBottomSheetBehavior.this.halfExpandedOffset; targetState = STATE_HALF_EXPANDED;} } else if (Math.abs(currentTop - GaoDeBottomSheetBehavior.this.halfExpandedOffset) < Math.abs(currentTop - GaoDeBottomSheetBehavior.this.collapsedOffset)) {top = GaoDeBottomSheetBehavior.this.halfExpandedOffset;targetState = STATE_HALF_EXPANDED; } else {top = GaoDeBottomSheetBehavior.this.collapsedOffset;targetState = STATE_COLLAPSED; }} } else {top = GaoDeBottomSheetBehavior.this.parentHeight;targetState = STATE_HIDDEN; } if (GaoDeBottomSheetBehavior.this.viewDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top)) {GaoDeBottomSheetBehavior.this.setStateInternal(STATE_SETTLING);ViewCompat.postOnAnimation(releasedChild, GaoDeBottomSheetBehavior.this.new SettleRunnable(releasedChild, targetState)); } else {GaoDeBottomSheetBehavior.this.setStateInternal(targetState); }}@Overridepublic int clampViewPositionVertical(@NonNull View child, int top, int dy) { return MathUtils.clamp(top, GaoDeBottomSheetBehavior.this.getExpandedOffset(), GaoDeBottomSheetBehavior.this.hideable ? GaoDeBottomSheetBehavior.this.parentHeight : GaoDeBottomSheetBehavior.this.collapsedOffset);}@Overridepublic int clampViewPositionHorizontal(@NonNull View child, int left, int dx) { return child.getLeft();}@Overridepublic int getViewVerticalDragRange(@NonNull View child) { return GaoDeBottomSheetBehavior.this.hideable ? GaoDeBottomSheetBehavior.this.parentHeight : GaoDeBottomSheetBehavior.this.collapsedOffset;} } @Override public Parcelable onSaveInstanceState(CoordinatorLayout parent, V child) {return new GaoDeBottomSheetBehavior.SavedState(super.onSaveInstanceState(parent, child), this.state); } @Override public void onRestoreInstanceState(CoordinatorLayout parent, V child, Parcelable state) {GaoDeBottomSheetBehavior.SavedState ss = (GaoDeBottomSheetBehavior.SavedState) state;super.onRestoreInstanceState(parent, child, ss.getSuperState());if (ss.state != STATE_DRAGGING && ss.state != STATE_SETTLING) { this.state = ss.state;} else { this.state = STATE_COLLAPSED;} } @Override public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {if (ViewCompat.getFitsSystemWindows(parent) && !ViewCompat.getFitsSystemWindows(child)) { child.setFitsSystemWindows(true);}int savedTop = child.getTop();parent.onLayoutChild(child, layoutDirection);this.parentHeight = parent.getHeight();if (this.peekHeightAuto) { if (this.peekHeightMin == 0) {this.peekHeightMin = parent.getResources().getDimensionPixelSize(R.dimen.design_bottom_sheet_peek_height_min); } this.lastPeekHeight = Math.max(this.peekHeightMin, this.parentHeight - parent.getWidth() * 9 / 16);} else { this.lastPeekHeight = this.peekHeight;}if (mMiddleHeightAuto) { mMiddleHeight = this.parentHeight;}this.fitToContentsOffset = Math.max(0, this.parentHeight - child.getHeight());this.halfExpandedOffset = this.parentHeight - mMiddleHeight;this.calculateCollapsedOffset();if (this.state == STATE_EXPANDED) { ViewCompat.offsetTopAndBottom(child, this.getExpandedOffset());} else if (this.state == STATE_HALF_EXPANDED) { ViewCompat.offsetTopAndBottom(child, this.halfExpandedOffset);} else if (this.hideable && this.state == STATE_HIDDEN) { ViewCompat.offsetTopAndBottom(child, this.parentHeight);} else if (this.state == STATE_COLLAPSED) { ViewCompat.offsetTopAndBottom(child, this.collapsedOffset);} else if (this.state == STATE_DRAGGING || this.state == STATE_SETTLING) { ViewCompat.offsetTopAndBottom(child, savedTop - child.getTop());}if (this.viewDragHelper == null) { this.viewDragHelper = ViewDragHelper.create(parent, this.dragCallback);}this.viewRef = new WeakReference(child);this.nestedScrollingChildRef = new WeakReference(this.findScrollingChild(child));return true; } @Override public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {if (!child.isShown()) { this.ignoreEvents = true; return false;} else { int action = event.getActionMasked(); if (action == 0) {this.reset(); } if (this.velocityTracker == null) {this.velocityTracker = VelocityTracker.obtain(); } this.velocityTracker.addMovement(event); switch (action) {case 0: int initialX = (int) event.getX(); this.initialY = (int) event.getY(); View scroll = this.nestedScrollingChildRef != null ? (View) this.nestedScrollingChildRef.get() : null; if (scroll != null && parent.isPointInChildBounds(scroll, initialX, this.initialY)) {this.activePointerId = event.getPointerId(event.getActionIndex());this.touchingScrollingChild = true; } this.ignoreEvents = this.activePointerId == -1 && !parent.isPointInChildBounds(child, initialX, this.initialY); break;case 1:case 3: this.touchingScrollingChild = false; this.activePointerId = -1; if (this.ignoreEvents) {this.ignoreEvents = false;return false; }case 2: } if (!this.ignoreEvents && this.viewDragHelper != null && this.viewDragHelper.shouldInterceptTouchEvent(event)) {return true; } else {View scroll = this.nestedScrollingChildRef != null ? (View) this.nestedScrollingChildRef.get() : null;return action == 2 && scroll != null && !this.ignoreEvents && this.state != 1 && !parent.isPointInChildBounds(scroll, (int) event.getX(), (int) event.getY()) && this.viewDragHelper != null && Math.abs((float) this.initialY - event.getY()) > (float) this.viewDragHelper.getTouchSlop(); }} } @Override public boolean onTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {if (!child.isShown()) { return false;} else { int action = event.getActionMasked(); if (this.state == STATE_DRAGGING && action == 0) {return true; } else {if (this.viewDragHelper != null) { this.viewDragHelper.processTouchEvent(event);}if (action == 0) { this.reset();}if (this.velocityTracker == null) { this.velocityTracker = VelocityTracker.obtain();}this.velocityTracker.addMovement(event);if (action == 2 && !this.ignoreEvents && Math.abs((float) this.initialY - event.getY()) > (float) this.viewDragHelper.getTouchSlop()) { this.viewDragHelper.captureChildView(child, event.getPointerId(event.getActionIndex()));}return !this.ignoreEvents; }} } @Override public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {this.lastNestedScrollDy = 0;this.nestedScrolled = false;return (axes & 2) != 0; } @Override public void onNestedPreScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View target, int dx, int dy, @NonNull int[] consumed, int type) {if (type != 1) { View scrollingChild = (View) this.nestedScrollingChildRef.get(); if (target == scrollingChild) {int currentTop = child.getTop();int newTop = currentTop - dy;if (dy > 0) { if (newTop < this.getExpandedOffset()) {consumed[1] = currentTop - this.getExpandedOffset();ViewCompat.offsetTopAndBottom(child, -consumed[1]);this.setStateInternal(STATE_EXPANDED); } else {consumed[1] = dy;ViewCompat.offsetTopAndBottom(child, -dy);this.setStateInternal(STATE_DRAGGING); }} else if (dy < 0 && !target.canScrollVertically(-1)) { if (newTop > this.collapsedOffset && !this.hideable) {consumed[1] = currentTop - this.collapsedOffset;ViewCompat.offsetTopAndBottom(child, -consumed[1]);this.setStateInternal(STATE_COLLAPSED); } else {consumed[1] = dy;ViewCompat.offsetTopAndBottom(child, -dy);this.setStateInternal(STATE_DRAGGING); }}this.dispatchOnSlide(child.getTop());this.lastNestedScrollDy = dy;this.nestedScrolled = true; }} } @Override public void onStopNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View target, int type) {if (child.getTop() == this.getExpandedOffset()) { this.setStateInternal(STATE_EXPANDED);} else if (target == this.nestedScrollingChildRef.get() && this.nestedScrolled) { int top; byte targetState; if (this.lastNestedScrollDy > 0) {int currentTop = child.getTop();if (currentTop <= collapsedOffset - HIDE_THRESHOLD && currentTop >= halfExpandedOffset) { top = this.halfExpandedOffset; targetState = STATE_HALF_EXPANDED;} else { top = this.getExpandedOffset(); targetState = STATE_EXPANDED;} } else if (this.hideable && this.shouldHide(child, this.getYVelocity())) {top = this.parentHeight;targetState = STATE_HIDDEN; } else if (this.lastNestedScrollDy == 0) {int currentTop = child.getTop();if (this.fitToContents) { if (Math.abs(currentTop - this.fitToContentsOffset) < Math.abs(currentTop - this.collapsedOffset)) {top = this.fitToContentsOffset;targetState = STATE_EXPANDED; } else {top = this.collapsedOffset;targetState = STATE_COLLAPSED; }} else if (currentTop < this.halfExpandedOffset) { if (currentTop < Math.abs(currentTop - this.collapsedOffset)) {top = 0;targetState = STATE_EXPANDED; } else {top = this.halfExpandedOffset;targetState = STATE_HALF_EXPANDED; }} else if (Math.abs(currentTop - this.halfExpandedOffset) < Math.abs(currentTop - this.collapsedOffset)) { top = this.halfExpandedOffset; targetState = STATE_HALF_EXPANDED;} else { top = this.collapsedOffset; targetState = STATE_COLLAPSED;} } else {int currentTop = child.getTop();if (currentTop <= halfExpandedOffset + HIDE_THRESHOLD && currentTop > HIDE_THRESHOLD) { top = this.halfExpandedOffset; targetState = STATE_HALF_EXPANDED;} else { top = this.collapsedOffset; targetState = STATE_COLLAPSED;} } if (this.viewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) {this.setStateInternal(STATE_SETTLING);ViewCompat.postOnAnimation(child, new GaoDeBottomSheetBehavior.SettleRunnable(child, targetState)); } else {this.setStateInternal(targetState); } this.nestedScrolled = false;} } @Override public boolean onNestedPreFling(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View target, float velocityX, float velocityY) {return target == this.nestedScrollingChildRef.get() && (this.state != STATE_EXPANDED || super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY)); } public boolean isFitToContents() {return this.fitToContents; } public void setFitToContents(boolean fitToContents) {if (this.fitToContents != fitToContents) { this.fitToContents = fitToContents; if (this.viewRef != null) {this.calculateCollapsedOffset(); } this.setStateInternal(this.fitToContents && this.state == STATE_HALF_EXPANDED ? STATE_HALF_EXPANDED : this.state);} } public final void setPeekHeight(int peekHeight) {boolean layout = false;if (peekHeight == -1) { if (!this.peekHeightAuto) {this.peekHeightAuto = true;layout = true; }} else if (this.peekHeightAuto || this.peekHeight != peekHeight) { this.peekHeightAuto = false; this.peekHeight = Math.max(0, peekHeight); this.collapsedOffset = this.parentHeight - peekHeight; layout = true;}if (layout && this.state == STATE_COLLAPSED && this.viewRef != null) { V view = (V) this.viewRef.get(); if (view != null) {view.requestLayout(); }} } public final void setMiddleHeight(int middleHeight) {boolean layout = false;if (middleHeight == PEEK_HEIGHT_AUTO) { if (!mMiddleHeightAuto) {mMiddleHeightAuto = true;layout = true; }} else if (mMiddleHeightAuto || mMiddleHeight != middleHeight) { mMiddleHeightAuto = false; mMiddleHeight = Math.max(0, middleHeight); layout = true;}if (layout && this.state == STATE_COLLAPSED && viewRef != null) { V view = viewRef.get(); if (view != null) {view.requestLayout(); }} } public final int getPeekHeight() {return this.peekHeightAuto ? -1 : this.peekHeight; } public final int getMiddleHeight() {return this.mMiddleHeightAuto ? -1 : this.mMiddleHeight; } public final int getParentHeight() {return this.parentHeight; } public void setHideable(boolean hideable) {this.hideable = hideable; } public boolean isHideable() {return this.hideable; } public void setSkipCollapsed(boolean skipCollapsed) {this.skipCollapsed = skipCollapsed; } public boolean getSkipCollapsed() {return this.skipCollapsed; } public void setBottomSheetCallback(GaoDeBottomSheetBehavior.BottomSheetCallback callback) {this.callback = callback; } public final void setState(final int state) {if (state != this.state) { if (this.viewRef == null) {if (state == STATE_COLLAPSED || state == STATE_EXPANDED || state == STATE_HALF_EXPANDED || this.hideable && state == STATE_HIDDEN) { this.state = state;} } else {final V child = (V) this.viewRef.get();if (child != null) { ViewParent parent = child.getParent(); if (parent != null && parent.isLayoutRequested() && ViewCompat.isAttachedToWindow(child)) {child.post(new Runnable() { @Override public void run() {GaoDeBottomSheetBehavior.this.startSettlingAnimation(child, state); }}); } else {this.startSettlingAnimation(child, state); }} }} } public final int getState() {return this.state; } void setStateInternal(int state) {if (this.state != state) { this.state = state; if (state != STATE_HALF_EXPANDED && state != STATE_EXPANDED) {if (state == STATE_HIDDEN || state == STATE_COLLAPSED) { this.updateImportantForAccessibility(false);} } else {this.updateImportantForAccessibility(true); } View bottomSheet = (View) this.viewRef.get(); if (bottomSheet != null && this.callback != null) {this.callback.onStateChanged(bottomSheet, state); }} } private void calculateCollapsedOffset() {if (this.fitToContents) { this.collapsedOffset = Math.max(this.parentHeight - this.lastPeekHeight, this.fitToContentsOffset);} else { this.collapsedOffset = this.parentHeight - this.lastPeekHeight;} } private void reset() {this.activePointerId = -1;if (this.velocityTracker != null) { this.velocityTracker.recycle(); this.velocityTracker = null;} } boolean shouldHide(View child, float yvel) {if (this.skipCollapsed) { return true;} else if (child.getTop() < this.collapsedOffset) { return false;} else { float newTop = (float) child.getTop() + yvel * HIDE_FRICTION; return Math.abs(newTop - (float) this.collapsedOffset) / (float) this.peekHeight > HIDE_THRESHOLD;} } @VisibleForTesting View findScrollingChild(View view) {if (ViewCompat.isNestedScrollingEnabled(view)) { return view;} else { if (view instanceof ViewGroup) {ViewGroup group = (ViewGroup) view;int i = 0;for (int count = group.getChildCount(); i < count; ++i) { View scrollingChild = this.findScrollingChild(group.getChildAt(i)); if (scrollingChild != null) {return scrollingChild; }} } return null;} } private float getYVelocity() {if (this.velocityTracker == null) { return 0.0F;} else { this.velocityTracker.computeCurrentVelocity(1000, this.maximumVelocity); return this.velocityTracker.getYVelocity(this.activePointerId);} } private int getExpandedOffset() {return this.fitToContents ? this.fitToContentsOffset : 0; } void startSettlingAnimation(View child, int state) {int top;if (state == STATE_COLLAPSED) { top = this.collapsedOffset;} else if (state == STATE_HALF_EXPANDED) { top = this.halfExpandedOffset;} else if (state == STATE_EXPANDED) { top = this.getExpandedOffset();} else { if (!this.hideable || state != STATE_HIDDEN) {throw new IllegalArgumentException('Illegal state argument: ' + state); } top = this.parentHeight;}if (this.viewDragHelper.smoothSlideViewTo(child, child.getLeft(), top)) { this.setStateInternal(STATE_SETTLING); ViewCompat.postOnAnimation(child, new GaoDeBottomSheetBehavior.SettleRunnable(child, state));} else { this.setStateInternal(state);} } void dispatchOnSlide(int top) {View bottomSheet = (View) this.viewRef.get();if (bottomSheet != null && this.callback != null) { if (top > this.collapsedOffset) {this.callback.onSlide(bottomSheet, (float) (this.collapsedOffset - top) / (float) (this.parentHeight - this.collapsedOffset)); } else {this.callback.onSlide(bottomSheet, (float) (this.collapsedOffset - top) / (float) (this.collapsedOffset - this.getExpandedOffset())); }} } @VisibleForTesting int getPeekHeightMin() {return this.peekHeightMin; } public static <V extends View> GaoDeBottomSheetBehavior<V> from(V view) {LayoutParams params = view.getLayoutParams();if (!(params instanceof CoordinatorLayout.LayoutParams)) { throw new IllegalArgumentException('The view is not a child of CoordinatorLayout');} else { Behavior behavior = ((CoordinatorLayout.LayoutParams) params).getBehavior(); if (!(behavior instanceof GaoDeBottomSheetBehavior)) {throw new IllegalArgumentException('The view is not associated with BottomSheetBehavior'); } else {return (GaoDeBottomSheetBehavior) behavior; }} } @SuppressLint('WrongConstant') private void updateImportantForAccessibility(boolean expanded) {if (this.viewRef != null) { ViewParent viewParent = ((View) this.viewRef.get()).getParent(); if (viewParent instanceof CoordinatorLayout) {CoordinatorLayout parent = (CoordinatorLayout) viewParent;int childCount = parent.getChildCount();if (VERSION.SDK_INT >= 16 && expanded) { if (this.importantForAccessibilityMap != null) {return; } this.importantForAccessibilityMap = new HashMap(childCount);}for (int i = 0; i < childCount; ++i) { View child = parent.getChildAt(i); if (child != this.viewRef.get()) {if (!expanded) { if (this.importantForAccessibilityMap != null && this.importantForAccessibilityMap.containsKey(child)) {ViewCompat.setImportantForAccessibility(child, (Integer) this.importantForAccessibilityMap.get(child)); }} else { if (VERSION.SDK_INT >= 16) {this.importantForAccessibilityMap.put(child, child.getImportantForAccessibility()); } ViewCompat.setImportantForAccessibility(child, 4);} }}if (!expanded) { this.importantForAccessibilityMap = null;} }} } protected static class SavedState extends AbsSavedState {final int state;public static final Creator<GaoDeBottomSheetBehavior.SavedState> CREATOR = new ClassLoaderCreator<GaoDeBottomSheetBehavior.SavedState>() { @Override public GaoDeBottomSheetBehavior.SavedState createFromParcel(Parcel in, ClassLoader loader) {return new GaoDeBottomSheetBehavior.SavedState(in, loader); } @Override public GaoDeBottomSheetBehavior.SavedState createFromParcel(Parcel in) {return new GaoDeBottomSheetBehavior.SavedState(in, (ClassLoader) null); } @Override public GaoDeBottomSheetBehavior.SavedState[] newArray(int size) {return new GaoDeBottomSheetBehavior.SavedState[size]; }};public SavedState(Parcel source) { this(source, (ClassLoader) null);}public SavedState(Parcel source, ClassLoader loader) { super(source, loader); this.state = source.readInt();}public SavedState(Parcelable superState, int state) { super(superState); this.state = state;}@Overridepublic void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(this.state);} } private class SettleRunnable implements Runnable {private final View view;private final int targetState;SettleRunnable(View view, int targetState) { this.view = view; this.targetState = targetState;}@Overridepublic void run() { if (GaoDeBottomSheetBehavior.this.viewDragHelper != null && GaoDeBottomSheetBehavior.this.viewDragHelper.continueSettling(true)) {ViewCompat.postOnAnimation(this.view, this); } else {GaoDeBottomSheetBehavior.this.setStateInternal(this.targetState); }} } @Retention(RetentionPolicy.SOURCE) @RestrictTo({Scope.LIBRARY_GROUP}) public @interface State { } public abstract static class BottomSheetCallback {public BottomSheetCallback() {}public abstract void onStateChanged(@NonNull View var1, int var2);public abstract void onSlide(@NonNull View var1, float var2); }}

使用的時(shí)候直接設(shè)置:

<androidx.appcompat.widget.LinearLayoutCompat android: android:layout_width='match_parent' android:layout_height='match_parent' android:background='@android:color/white' android:orientation='vertical' android:visibility='visible' app:behavior_hideable='false' app:behavior_middleHeight='200dp' app:behavior_peekHeight='80dp' app:layout_behavior='.gaode.GaoDeBottomSheetBehavior' tools:ignore='MissingPrefix'> //.... </androidx.appcompat.widget.LinearLayoutCompat>

對(duì)于按鈕滑動(dòng)及通明度漸變隱藏顯示也是通過(guò)實(shí)現(xiàn)behavior,因?yàn)楸容^的簡(jiǎn)單直接上代碼:

/** * 高德首頁(yè)按鈕處理 */public class GaoDeBtnBehavior extends CoordinatorLayout.Behavior { private View rightActions; private View topActions; public GaoDeBtnBehavior() { } public GaoDeBtnBehavior(Context context, AttributeSet attrs) {super(context, attrs); } @Override public boolean onLayoutChild(@NonNull CoordinatorLayout parent, @NonNull View child, int layoutDirection) {if (ViewCompat.getFitsSystemWindows(parent) && !ViewCompat.getFitsSystemWindows(child)) { child.setFitsSystemWindows(true);}if (rightActions == null) { rightActions = parent.findViewById(R.id.rightActions);}if (topActions == null) { topActions = parent.findViewById(R.id.topActions);}return super.onLayoutChild(parent, child, layoutDirection); } @Override public boolean layoutDependsOn(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) {return dependency instanceof LinearLayoutCompat || super.layoutDependsOn(parent, child, dependency); } @Override public boolean onDependentViewChanged(@NonNull CoordinatorLayout parent, @NonNull View child, @NonNull View dependency) {//判斷當(dāng)前dependency 是內(nèi)容布局if (dependency instanceof LinearLayoutCompat && dependency.getId() == R.id.bottom_sheet) { if (rightActions != null) {GaoDeBottomSheetBehavior behavior = GaoDeBottomSheetBehavior.from(dependency);int middleHeight = behavior.getParentHeight() - behavior.getMiddleHeight() - rightActions.getMeasuredHeight();CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) rightActions.getLayoutParams();int newY = dependency.getTop() - rightActions.getHeight() - layoutParams.bottomMargin;if (newY >= middleHeight) { rightActions.setTranslationY(newY - layoutParams.bottomMargin);} else { rightActions.setTranslationY(middleHeight);}int offset = behavior.getParentHeight() - behavior.getMiddleHeight() - layoutParams.bottomMargin - dependency.getTop();float alpha = 1f - offset * 1.0f / rightActions.getHeight();rightActions.setAlpha(alpha);if (topActions != null) { topActions.setAlpha(alpha);} }}return super.onDependentViewChanged(parent, child, dependency); }}

源碼地址:

https://github.com/yixiaolunhui/FGaoDeIndexDemo

到這里就結(jié)束啦。

以上就是Android實(shí)現(xiàn)三段式滑動(dòng)效果的詳細(xì)內(nèi)容,更多關(guān)于Android 三段式滑動(dòng)效果的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 免费在线观看成年人视频 | 日韩不卡一区二区 | 日韩一区二区三区av | 99色综合| 91麻豆产精品久久久久久 | 欧美自拍视频一区 | 日韩精品免费在线观看 | 日韩性欧美 | 欧美日韩一区免费 | 色资源 | 亚洲成人av电影 | 国产精品久久国产精麻豆99网站 | 天天干国产 | 99re国产精品视频 | 狠狠操夜夜操 | 日韩一区在线观看视频 | 狠狠干美女 | 国产精品无码久久久久 | 一区二区中文 | 在线成人www免费观看视频 | 亚洲免费人成在线视频观看 | 日韩国产欧美一区 | 黄色大片网站在线观看 | 青青草久久 | 一区二区三区四区精品 | 亚洲一区二区在线 | 亚洲精品久久久 | 日韩成人在线视频 | 亚洲国产精品人人爽夜夜爽 | 久久久91精品国产一区二区精品 | 久久99视频| 日本天堂一区二区 | 免费的国产视频 | 日本不卡一二三 | 日日干日日操 | 国产99久久久国产精品 | gogo熟少妇大胆尺寸 | 一色屋精品久久久久久久久久 | 日韩成人精品视频在线观看 | 亚洲视频中文字幕 | 欧美亚洲激情 | 国产一区二区在线播放 | 国产在线一区二区三区 | 伊人爱爱网 | 久久69精品久久久久久久电影好 | 国产精品久久久久无码av | 精品少妇一区二区三区日产乱码 | 自拍偷拍专区 | 久草综合在线 | 在线视频第一页 | www.99热.com | 欧美在线视频不卡 | 精品国产1区2区3区 在线国产视频 | 香蕉av777xxx色综合一区 | 在线观看中文字幕 | 成人在线免费视频 | 成人免费在线看片 | 国产日韩欧美一区 | 99re视频| 日韩在线观看中文字幕 | 亚洲精品一二三区 | 99re在线视频| 色性av| 午夜免费一区二区播放 | 欧美美乳 | 天天干夜夜爽 | 国产精品久久久久9999赢消 | 亚洲精品国产第一综合99久久 | 色黄视频在线观看 | 成人久久 | 午夜精品久久久久久久久久久久 | 日韩和的一区二在线 | 中文字幕精品三区 | 亚洲欧美在线一区二区 | 亚洲一区二区三区四区在线 | 成人a网| 青青草网| 精品欧美一区二区三区久久久 | 91精品国产综合久久香蕉922 | 日本视频一区二区三区 | 成人午夜影院 | 久久一区 | 亚洲高清视频在线观看 | 精品国产欧美一区二区三区成人 | 毛片一区二区 | 国产免费看 | 亚洲视频在线免费观看 | 激情.com | 国产综合亚洲精品一区二 | 99re视频在线播放 | 亚洲第一视频 | 欧美亚洲国产一区 | 国产一区二精品区在线 | 99亚洲精品 | 日本天堂在线播放 | 五月网婷婷| 成人欧美| 青青草国产 | 亚洲精品久久久一区二区三区 | 国产乱肥老妇国产一区二 | 国外成人在线视频网站 | 成人欧美一区二区三区黑人孕妇 | 91网站在线看 | 精品久久久久久亚洲综合网站 | 国产一区www | 日韩欧美精品在线 | www.色在线| 欧美日韩一区二区在线播放 | 国产另类一区 | 中文字幕在线资源 | 99re在线观看| 国产毛片精品 | 波多野结衣先锋影音 | 99久久婷婷国产综合精品电影 | 国产精品久久久久9999鸭 | 一级毛片黄 | 欧美大片一区二区 | 国产一区二区三区在线视频 | 久久久久久久久一区二区三区 | 美女一级a毛片免费观看97 | 久久国产综合 | 天天天操| 狠狠操夜夜操天天操 | 欧美日韩亚 | 精品天堂 | 亚洲精品91| 91国偷自产一区二区三区亲奶 | 亚洲一区电影 | 久久综合一区二区三区 | 成人在线观看免费视频 | 国产成人精品午夜视频免费 | 日本福利网站 | 男女www视频| 国产日韩欧美亚洲 | 欧美亚洲 | 国产福利视频 | 午夜影院在线 | 91精品国产色综合久久 | h网站在线观看 | 一区二区三区四区在线视频 | 九九久久精品 | 午夜精品一区二区三区在线视频 | 日本免费一区二区在线观看 | 91夜夜操 | 欧美一区二区三区精品 | 国产性×xxx盗摄xxxx | 国产精品一区二区三区在线 | 欧美一区二区三区在线观看视频 | 色偷偷噜噜噜亚洲男人 | 亚洲瑟瑟 | 日比视频网站 | 国产免费一区二区三区最新不卡 | 黄色毛片在线播放 | 亚洲一区免费观看 | 精品一二区 | 九九热免费看 | 国产福利视频 | 精品国产999 | 在线播放国产一区二区三区 | 国产成人av一区 | 91精品国产高清久久久久久久久 | 欧美亚洲国产一区二区三区 | 玖玖免费 | 91精品啪啪 | 中文字幕亚洲视频 | 99热国产在线观看 | 91亚洲国产精品 | 欧美日韩国产一区二区三区在线观看 | 国产a久久精品一区二区三区 | 日韩欧美精品一区二区三区 | 一区在线观看 | 一区二区三区精品 | 日韩a∨| 国产1页| 视频1区2区 | www久久久| 九色在线| 一区二区免费 | 国产日韩中文字幕 | 99精品电影 | 日韩视频免费 | 99色综合 | 99精品一区二区三区 | 欧美一级特 | 欧美激情久久久 | 亚洲一区在线视频 | 伊人在线 | 精品96久久久久久中文字幕无 | 日韩成年视频 | 日韩欧美~中文字幕 | 欧美精品成人一区二区三区四区 | 99色影院 | 国产毛片a级 | 夜夜天天操 | 亚洲精品在线国产 | 国产精品九九九 | 99视频网站 | 久久久国产精品视频 | 九色av| 日本在线一区二区三区 | 国产精品国产三级国产aⅴ原创 | 欧美一级黄| 羞羞视频免费网站 | 欧美激情自拍偷拍 | 自拍视频在线观看免费 | www.欧美.com | 青青久久| 亚州精品天堂中文字幕 | av在线一区二区三区 | 中文字幕日韩视频 | 国产免费拔擦拔擦8x高清在线人 | 久久久婷婷| 国产一区二区自拍视频 | 国产乱肥老妇国产一区二 | 欧美在线xxx | 日韩欧美一区二区在线观看视频 | 日韩中文字幕一区二区高清99 | 国产精品美女www爽爽爽软件 | 日韩有码电影 | 久久精品亚洲精品国产欧美 | 久久精品亚洲 | 久久美女视频 | 欧美黑人xxx | 久草观看| 国产日产精品一区二区三区四区 | 激情久久av一区av二区av三区 | 久久人 | 国产成人精品综合 | 国产成人精品久久 | 精品亚洲成a人在线观看 | 国产伦精品一区二区三区四区视频 | 免费看片一区二区三区 | 欧洲精品久久久 | 国产色在线 | 精品一区二区三区免费 | 久久爱综合网 | 91精品国产91久久久久久久久久久久 | 欧美成人精品在线视频 | 国产中文字幕在线 | 久久精品免费一区二区三区 | 成人精品视频在线 | 美女高潮久久久 | 亚洲不卡视频 | 97在线播放 | 97国产精品久久久 | 交视频在线观看国产 | 国产精品国产三级国产aⅴ中文 | 色黄视频在线看 | 六月丁香av | 欧美日本一区二区三区 | 国产精品久久久久久吹潮 | 成人欧美一区二区三区在线播放 | 亚洲精品电影在线观看 | 91在线免费视频 | www312aⅴ欧美在线看 | 久久久久久久一区 | 91久久精品一区 | 五月天婷婷在线视频 | 日韩免费区 | 黄色片在线免费观看 | 永久免费网站 | 国产欧美日韩中文字幕 | 天堂va在线高清一区 | 欧美亚洲视频在线观看 | 亚洲一区二区精品视频 | 亚洲一区中文字幕在线观看 | 亚洲精品一区二区三区中文字幕 | 国产欧美久久久久久 | 777777777亚洲妇女 | 国产一区二区视频在线 | 精品二区 | 久久久久久国产精品 | 欧美一二三区在线 | 一级久久久久 | 国产欧美在线一区二区 | 99热影院 | 男人天堂视频在线观看 | 国产一区二区视频在线 | 一区二区在线看 | 亚洲成人一区二区 | 国产欧美一区二区三区国产幕精品 | 91在线高清 | 国产成人在线免费观看视频 | 国产精品夜夜春夜夜爽久久电影 | 中文字幕精品一区 | 中字幕视频在线永久在线观看免费 | jlzzjlzz国产精品久久 | 亚洲欧美在线观看 | 欧美一级在线观看 | 国产精品久久久久免费 | 久久精品国产91精品亚洲高清 | 亚洲精品国产高清 | 日韩中文久久 | 久久青 | 在线观看你懂的网站 | 国产高清精品一区二区三区 | 日韩精品一区二区三区在线播放 | www中文字幕在线观看 | 日韩一区二区三区在线视频 | 国产精品久久久久久久久久久久久 | 黄色成人av | 国产视频久久久久 | 中文字幕一区二区三 | 亚洲精品乱码8久久久久久日本 | 一级特黄毛片 | 久久久久久久国产精品 | 91久久夜色精品国产九色 | 日韩中文字幕在线观看 | 欧美一区久久 | 久久99视频这里只有精品 | 亚洲人成在线播放 | 91精品一二区 | 亚洲看片网站 | 91免费观看| 国产精品二区三区在线观看 | 久久99国产精品久久99果冻传媒 | 综合久久99 | 日韩高清在线一区 | 国产一区二区在线免费观看 | 亚洲一区二区三区免费视频 | 国产无套一区二区三区久久 | 国产一区二区三区久久 | 精品视频久久 | 日韩欧美一级精品久久 | 99爱视频| 久久久精品电影 | 97精品国产97久久久久久免费 | 国产精品99久久久久久动医院 | h片在线免费观看 | 久久精品一区二区三区四区 | 91九色国产视频 | а天堂中文最新一区二区三区 | 7777久久| 一级毛片网 | 日韩免费在线观看视频 | 妞干网av | 欧美一区久久 | 欧美自拍视频 | 日韩欧美一区二区三区视频 | 久久久亚洲精 | 99精品一区二区 | 亚洲视频中文字幕 | 免费一级在线观看 | 国产精久久 | 久久久久久网站 | 黄色免费网址大全 | 中文字幕91| 午夜影院普通用户体验区 | 波多野结衣一区二区三区高清 | 国产二区在线播放 | 国内精品视频一区二区三区八戒 | 亚洲国产一区二区在线 | 成人av一区二区三区 | 久久久久久日产精品 | 免费观看一级特黄欧美大片 | 日本在线一二 | 欧美一区二区三区视频 | 亚洲精品成人免费 | 午夜剧| 国产日韩一区二区三区 | 欧美一区二区在线视频 | 中国电影黄色一级片免费观看 | 国产精品一区二区三区在线 | 男人天堂中文字幕 | 国产在线一级视频 | 91av久久| 99re6在线视频精品免费 | 亚洲国产成人久久 | 国产精品高清在线 | 精品国产一级毛片 | 亚洲第一区在线 | 免费操片 | 午夜精品久久久久久久星辰影院 | 欧美日韩一区二区三区免费视频 | 天天射天天干 | 亚洲精品一区二区三区蜜桃下载 | 亚洲精品v | 色吊丝2288sds中文字幕 | 伊人二区| 中文字幕在线视频观看 | 国产免费中文字幕 | 国产精品不卡视频 | 伊人激情影院 | 亚洲www啪成人一区二区 | 伊人99| 亚洲成人福利在线观看 | 国产亚洲精品美女久久久久久久久久 | 欧美一区二区三区在线视频 | 草草网站| 亚洲视频区 | 在线色网站 | 美女视频一区二区三区 | 免费看片www | 波多野结衣一区二区三区四区 | 久久久99国产精品免费 | 蜜桃精品久久久久久久免费影院 | 在线播放一级片 | 大胆裸体gogo毛片免费看 | 黄色精品| 久久精品系列 | 久久久2o19精品 | 日韩免费观看视频 | 精品中文字幕一区 | 成人av影院| 一区二区av| 久久久二| 一级人爱视频 | 天天曰夜夜操 | 在线视频二区 | 午夜免费福利影院 | 中文字幕91 | 九九热免费精品视频 | 一区二区三区无码高清视频 | 亚洲国产一区视频 | 一二三四区视频在线观看 | 日韩一区在线视频 | 日韩精品久 | 一区二区三区成人久久爱 | 久久久久中文 | 国产成人精品久久 | 日韩在线国产 | 亚洲欧美日韩电影 | 亚洲a人 | 日韩av视屏 | 毛片网站在线观看 | 在线看一区二区 | 日本精品视频在线观看 | 亚洲人成在线播放 | 黄色av毛片 | 中文字幕日韩一区二区 | 精品国产乱码久久久久久蜜臀 | 激情六月婷 | 青青草久久久 | 欧美日韩黄 | 日日干,天天干 | 在线免费观看色视频 | 91精品一区二区三区久久久久久 | 91高清视频在线观看 | 伊人色播 | 日韩中文字幕免费视频 | 91精品国产欧美一区二区成人 | 在线高清av | 亚洲欧洲精品一区二区 | 69av片| 男人的天堂在线视频 | 久热精品国产 | 黄毛片| 有码在线| 日本高清中文字幕 | 欧美日韩精品在线一区 | 国产一区二区三区免费 | 国产大片久久久 | 91成人区 | 国产精品99久久久久久动医院 | 国产精品自拍视频网站 | 亚洲美女一区二区三区 | 日韩在线视频第一页 | 国产在线网站 | 亚洲成人一区二区三区 | 欧美日韩黄色一级片 | 毛片在线视频 | 一区免费看 | 91久久夜色精品国产网站 | 国产在线一级片 | 欧美啊v | 久久无码精品一区二区三区 | 国产午夜精品一区二区 | 欧美日韩大片在线观看 | 精品二区 | 精品视频一区二区在线 | 我爱操 | 亚洲精品久久久久999中文字幕 | 2021最新热播中文字幕-第1页-看片视频 青青青久草 | 美女久久| 日本aⅴ毛片成人实战推荐 成人免毛片 | 91视频在线免费观看 | 中文字幕在线视频观看 | 91精品国产综合久久久久久丝袜 | 欧美日韩精品在线一区 | 国产亚洲欧美一区二区三区 | 97久久久国产精品 | 国内自拍视频在线观看 | 国产精品毛片久久久久久 | 一级黄色录像在线观看 | 二区视频 | 美女国产 | 精品无人乱码一区二区三区的优势 | 国产中文字幕在线观看 | 狠狠av| 国产精品久久久久久久久 | 日韩资源| 国产精品二区三区 | 在线免费观看av片 | 国产精品久久久久久久久久东京 | 亚洲国产精品久久久 | 日韩精品一区在线 | 激情毛片| 日韩 国产 在线 | 精品国产不卡一区二区三区 | 成人在线视频免费观看 | 久久久久久av | 日韩一区高清视频 | 亚洲 欧美日韩 国产 中文 | av黄色在线免费观看 | 日韩av电影免费 | 色婷婷综合久久久中文字幕 | 免费一看一级毛片 | 国产日韩精品久久 | 国产成人一区二区三区 | 一区二区日本 | 国产成人精品一区二区三区 | 99精品国产在热久久 | 欧美日韩一级二级三级 | 91亚洲国产成人久久精品网站 | 91在线精品视频 | 在线播放国产一区二区三区 | 久久一区 | a在线观看| 人人干天天干 | 欧美美女爱爱视频 | 狠狠操电影 | 亚洲一区精品在线 | 久久大陆 | 久久精品一级 | 久久精品在线 | 欧美一区二区三区四区视频 | 欧美精品久久久久久久久久丰满 | 欧美人妖在线 | 99re视频在线观看 | 97成人精品视频在线观看 | 男女午夜| 91在线一区二区 | 精品国产伦一区二区三区观看说明 | 久久性| 中文字幕一区在线 | 91精品国产乱码久久久久久久久 | 欧美天堂在线观看 | 亚洲精品视频在线看 | 中文字幕日韩一区二区不卡 | 很黄很污的网站 | 综合天天 | 日日操天天操 | 日韩一区二区三区在线观看 | 亚洲最新中文字幕 | 91色视频在线观看 | 色综合久久天天综合网 | 国产欧美精品一区二区三区 | 99热在线精品播放 | 国产精品1区2区3区 国产在线观看一区 | 色综合欧美 | 激情综合久久 | 日韩av电影在线免费观看 | 国产视频福利在线 | 亚洲国产视频精品 | www中文字幕在线观看 | 欧美视频三区 | 91精品在线播放 | 欧美日韩亚洲三区 | 久久91精品国产 | 不卡中文一区 | 国产精品久久久久久福利一牛影视 | 欧美一级在线 | 色播久久久 | 夜夜艹| 一区国产视频 | 999视频在线免费观看 | 视频1区 | 综合久久网 | 午夜一级黄色片 | 欧美日韩一区二区中文字幕 | 成人av网站在线观看 | 久久伊人久久 | 国产日韩精品在线观看 | 北条麻妃国产九九九精品小说 | 亚洲国产成人av好男人在线观看 | 综合网亚洲| 国产目拍亚洲精品99久久精品 | 99在线视频精品 | 国产精品高潮呻吟 | 一区二区不卡视频在线观看 | 日韩欧美在线观看视频网站 | 日日干夜夜操 | 毛片在线看片 | 欧洲免费av | 亚洲另类小视频 | 亚色在线 | 久久免费小视频 | 欧美一区久久 | 国产xxxx精品| 午夜视频在线观看网站 | 久草网站 | 欧美在线观看网站 | 精品乱子伦一区二区三区 | 欧美在线a| 蜜臀av在线播放一区二区三区 | 91黄色在线观看 | 黄色大片网 | 丁香六月av| 日韩欧美在线观看视频网站 | 国产精品久久久久久久久久大牛 | 亚洲精品国产9999久久久久 | 亚洲国产精品99久久久久久久久 | 欧洲毛片 | 亚洲成人一区 | av片免费看 | 国产在线精品一区二区三区 | 国产精品日产欧美久久久久 | 色接久久 | 午夜视 | 97成人精品视频在线观看 | 欧美成人精品一区二区男人看 | 五月婷婷丁香 | 色黄视频在线观看 | 久久精品99国产精品日本 | 日韩拍拍|