日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

剖析Android Activity側(cè)滑返回的實(shí)現(xiàn)原理

瀏覽:120日期:2022-09-17 17:43:34
簡(jiǎn)介

使用側(cè)滑Activity返回很常見,例如微信就用到了。那么它是怎么實(shí)現(xiàn)的呢。本文帶你剖析一下實(shí)現(xiàn)原理。我在github上找了一個(gè)star有2.6k的開源,我們分析他是怎么實(shí)現(xiàn)的

//star 2.6k’com.r0adkll:slidableactivity:2.0.5’Slidr使用示例

它的使用很簡(jiǎn)單,首先要設(shè)置透明的窗口背景

<style name='AppTheme' parent='Theme.AppCompat.Light.DarkActionBar'><!-- Customize your theme here. --><item name='android:textAllCaps'>false</item><item name='android:windowActionBar'>false</item><item name='windowActionBar'>false</item><item name='windowNoTitle'>true</item><item name='colorPrimary'>@color/colorPrimary</item><item name='colorPrimaryDark'>@color/colorPrimaryDark</item><item name='colorAccent'>@color/colorAccent</item><item name='android:windowIsTranslucent'>true</item><item name='android:windowBackground'>@android:color/transparent</item> </style>

然后

//setContent(View view)后Slidr.attach(this);

剖析Android Activity側(cè)滑返回的實(shí)現(xiàn)原理

下面可以從三個(gè)步驟看其原理

步驟一 重新包裹界面

Slidr.class

public static SlidrInterface attach(final Activity activity, final int statusBarColor1, final int statusBarColor2){//0 創(chuàng)建滑動(dòng)嵌套界面SliderPanelfinal SliderPanel panel = initSliderPanel(activity, null);//7 Set the panel slide listener for when it becomes closed or opened// 監(jiān)聽回調(diào)panel.setOnPanelSlideListener(new SliderPanel.OnPanelSlideListener() {... //open close等});// Return the lock interfacereturn initInterface(panel); }private static SliderPanel initSliderPanel(final Activity activity, final SlidrConfig config) {//3 獲取decorviewViewGroup decorView = (ViewGroup)activity.getWindow().getDecorView();//4 獲取我們布局的內(nèi)容并刪除View oldScreen = decorView.getChildAt(0);decorView.removeViewAt(0);//5 Setup the slider panel and attach it to the decor// 建立滑動(dòng)嵌套視圖SliderPanel并且添加到DecorView中SliderPanel panel = new SliderPanel(activity, oldScreen, config);panel.setId(R.id.slidable_panel);oldScreen.setId(R.id.slidable_content);//6 把我們的界面布局添加到SliderPanel,并且把SliderPanel添加到decorView中panel.addView(oldScreen);decorView.addView(panel, 0);return panel;}

步驟二 使用ViewDragHelper.class處理滑動(dòng)手勢(shì)

SliderPanel.class

private void init(){ ... //1 ViewDragHelper創(chuàng)建 mDragHelper = ViewDragHelper.create(this, mConfig.getSensitivity(), callback); mDragHelper.setMinVelocity(minVel); mDragHelper.setEdgeTrackingEnabled(mEdgePosition); //2 Setup the dimmer view 添加用于指示滑動(dòng)過程的View到底層 mDimView = new View(getContext()); mDimView.setBackgroundColor(mConfig.getScrimColor()); mDimView.setAlpha(mConfig.getScrimStartAlpha()); addView(mDimView);}

步驟三 在ViewDragHelper.Callback中處理我們的界面的拖動(dòng)

我們首先明確ViewDragHelper僅僅是處理ParentView與它子View的關(guān)系,不會(huì)一直遍歷到最頂層的View。ViewDragHelper的捕獲capture是這樣實(shí)現(xiàn)的

@Nullable public View findTopChildUnder(int x, int y) {final int childCount = mParentView.getChildCount();for (int i = childCount - 1; i >= 0; i--) { final View child = mParentView.getChildAt(mCallback.getOrderedChildIndex(i)); if (x >= child.getLeft() && x < child.getRight() && y >= child.getTop() && y < child.getBottom()) {return child; }}return null; }

重點(diǎn)在SliderPanel.class的ViewDragHelper.Callback callback的實(shí)現(xiàn),作者實(shí)現(xiàn)實(shí)現(xiàn)了很多個(gè)方向的滑動(dòng)處理mLeftCallback、mRightCallback、mTopCallback、mBottomCallback、mVerticalCallback、mHorizontalCallback, 我們?nèi)LeftCallback來分析

private ViewDragHelper.Callback mLeftCallback = new ViewDragHelper.Callback() { //捕獲View @Override public boolean tryCaptureView(View child, int pointerId) {boolean edgeCase = !mConfig.isEdgeOnly() || mDragHelper.isEdgeTouched(mEdgePosition, pointerId);//像前面說的,我們的內(nèi)容是最上層子View,mDecorView這里指的是我們的contentViewreturn child.getId() == mDecorView.getId() && edgeCase; } //拖動(dòng), 最終是通過view.offsetLeftAndRight(offset)實(shí)現(xiàn)移動(dòng) @Override public int clampViewPositionHorizontal(View child, int left, int dx) {return clamp(left, 0, mScreenWidth); } //滑動(dòng)范圍 @Override public int getViewHorizontalDragRange(View child) {return mScreenWidth; } //釋放處理,判斷是滾回屏幕 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) {super.onViewReleased(releasedChild, xvel, yvel);int left = releasedChild.getLeft();int settleLeft = 0;int leftThreshold = (int) (getWidth() * mConfig.getDistanceThreshold());boolean isVerticalSwiping = Math.abs(yvel) > mConfig.getVelocityThreshold();if(xvel > 0){ if(Math.abs(xvel) > mConfig.getVelocityThreshold() && !isVerticalSwiping){settleLeft = mScreenWidth; }else if(left > leftThreshold){settleLeft = mScreenWidth; }}else if(xvel == 0){ if(left > leftThreshold){settleLeft = mScreenWidth; }}//滾動(dòng)到left=0(正常布局) 或者 滾動(dòng)到left=mScreenWidth(滾出屏幕)關(guān)閉ActivitymDragHelper.settleCapturedViewAt(settleLeft, releasedChild.getTop());invalidate(); } //轉(zhuǎn)換位置百分比,確定指示層的透明度 @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {super.onViewPositionChanged(changedView, left, top, dx, dy);float percent = 1f - ((float)left / (float)mScreenWidth);if(mListener != null) mListener.onSlideChange(percent);// Update the dimmer alphaapplyScrim(percent); } //回調(diào)到Slidr處理Activity狀態(tài) @Override public void onViewDragStateChanged(int state) {super.onViewDragStateChanged(state);if(mListener != null) mListener.onStateChanged(state);switch (state){ case ViewDragHelper.STATE_IDLE:if(mDecorView.getLeft() == 0){ // State Open if(mListener != null) mListener.onOpened();}else{ // State Closed 這里回調(diào)到Slidr處理activity.finish() if(mListener != null) mListener.onClosed();}break; case ViewDragHelper.STATE_DRAGGING:break; case ViewDragHelper.STATE_SETTLING:break;} }};

對(duì)于mDragHelper.settleCapturedViewAt(settleLeft, releasedChild.getTop());內(nèi)部是使用Scroller.class輔助滾動(dòng),所以要在SliderPanel中重寫View.computeScroll()

@Overridepublic void computeScroll() { super.computeScroll(); if(mDragHelper.continueSettling(true)){ViewCompat.postInvalidateOnAnimation(this); }}總結(jié)

整體方案如下圖所示

剖析Android Activity側(cè)滑返回的實(shí)現(xiàn)原理

總體來看原理并不復(fù)雜, 就是通過ViewDragHelper對(duì)View進(jìn)行拖動(dòng)。

以上就是Android Activity側(cè)滑返回的實(shí)現(xiàn)原理的詳細(xì)內(nèi)容,更多關(guān)于Activity側(cè)滑返回的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩国产v| 日韩国产精品久久久| 日韩精品三区四区| 亚洲一区二区日韩| 久久成人精品| 国产精品美女久久久浪潮软件| 五月天激情综合网| 在线观看免费一区二区| 欧美日韩国产高清| 国产色综合网| 亚洲精品美女91| 久久国产麻豆精品| 日韩精品久久久久久久软件91| 日韩精品免费一区二区夜夜嗨| 欧美日韩在线精品一区二区三区激情综合 | 亚洲精品免费观看| 亚洲欧洲日韩| 欧美一级二区| 精品国产午夜肉伦伦影院| 日韩欧美午夜| 国产字幕视频一区二区| 夜久久久久久| 亚洲一区欧美| 国产欧美日韩精品一区二区三区| 久久精品国产福利| 日韩成人三级| 亚洲一区国产一区| 欧美一级二级三级视频| 精品国产三区在线| 影视先锋久久| 蜜桃视频在线观看一区二区| 91欧美极品| 国产成人精品免费视| 久久久久亚洲| 色综合视频一区二区三区日韩 | 国产精品普通话对白| 丝袜诱惑制服诱惑色一区在线观看| 亚洲小说春色综合另类电影| 欧美日韩一区二区三区不卡视频 | 蜜臀国产一区二区三区在线播放| 亚洲人成在线影院| 国产丝袜一区| 中文一区一区三区高中清不卡免费| 久久国产日本精品| 91久久视频| 国产一区观看| 国产精品香蕉| 亚洲福利精品| 日韩久久一区| 欧美日韩尤物久久| 日韩一区二区三区在线看| 高清一区二区| 亚洲深爱激情| 国产一区二区三区黄网站| 日韩午夜高潮| 精品午夜av| 日韩在线一区二区| 精品理论电影在线| 亚洲综合小说| 日韩免费视频| 日本精品久久| 激情自拍一区| 久久99久久人婷婷精品综合| 夜夜嗨av一区二区三区网站四季av| 国产精品igao视频网网址不卡日韩 | 国产精品igao视频网网址不卡日韩 | 免费污视频在线一区| 综合一区av| 亚洲精品国产嫩草在线观看| 91伊人久久| 欧美丝袜一区| 精品国产亚洲一区二区三区在线| 蜜臀av一区二区在线免费观看 | 国产日韩欧美中文在线| 免费视频亚洲| 精品一区二区三区四区五区| 在线观看亚洲精品福利片| 日韩欧美一区二区三区免费看| 日韩国产欧美在线播放| 午夜久久美女| 欧美国产偷国产精品三区| 亚洲理论在线| 午夜国产欧美理论在线播放| 国产一区三区在线播放| 日本成人手机在线| 激情丁香综合| 97精品国产| 欧美精品影院| 在线观看视频免费一区二区三区| 福利一区在线| 国产精品亚洲人成在99www| 一区二区亚洲精品| 日韩精品第一区| 精品视频一区二区三区在线观看 | 成人片免费看| 欧美激情三区| 欧美日韩精品一区二区三区视频| 日韩中文字幕1| 午夜久久美女| 九九综合九九| 午夜精品成人av| 精品三级在线| 麻豆91在线播放| 国产精品探花在线观看| 日本一区二区三区视频在线看| 老司机久久99久久精品播放免费| 四虎884aa成人精品最新| 国产一区丝袜| 韩国女主播一区二区三区| 91亚洲精品视频在线观看| 美国欧美日韩国产在线播放| 免费欧美一区| 激情婷婷欧美| 九一精品国产| 亚洲午夜黄色| 日本精品影院| 视频福利一区| 久久精品播放| 激情婷婷欧美| 亚洲一区日本| 一区二区三区国产盗摄| 视频在线观看一区| 日韩影院免费视频| 蜜臀av亚洲一区中文字幕| 男女精品网站| 在线视频亚洲欧美中文| 亚洲制服一区| 欧美日韩网址| 精品九九在线| av资源中文在线| 肉色欧美久久久久久久免费看| 超碰超碰人人人人精品| 日韩综合精品| 欧美大黑bbbbbbbbb在线| 韩日一区二区三区| 麻豆9191精品国产| 亚洲精品乱码| 国产精品一区二区精品| 久久亚洲资源中文字| 久久在线91| 久久电影tv| 亚洲一级黄色| 首页亚洲欧美制服丝腿| 婷婷成人av| 国产免费av一区二区三区| 精品网站999| 亚洲精品一区三区三区在线观看| 黄色亚洲大片免费在线观看| 亚洲精品观看| 国产精品二区影院| 黑人精品一区| 欧美专区18| 国产欧美日韩| 欧美日韩精品免费观看视欧美高清免费大片 | 成人国产精选| 欧美福利一区| 亚洲日本三级| 美腿丝袜亚洲三区| 亚洲啊v在线| 香蕉久久夜色精品国产| 日韩av中文字幕一区| 国产不卡一区| 日韩一区二区免费看| 日韩福利在线观看| 久久精品国产久精国产| 六月婷婷综合| 日韩影院免费视频| 国产高清亚洲| 午夜国产精品视频| 国产欧美日韩一级| 欧美二三四区| 亚洲精品高潮| 91一区二区| 综合精品一区| 国产伦久视频在线观看| 午夜一级在线看亚洲| 国产精品久久久久久妇女| 欧洲一级精品| 69堂精品视频在线播放| 香蕉成人av| 蜜桃av一区二区三区电影| 精品三区视频| 日本欧洲一区二区| 久久久国产精品入口麻豆| 一区视频在线| 久久精品国产久精国产| 在线亚洲一区| 久久久亚洲欧洲日产| 在线亚洲成人| 欧美国产另类| 六月婷婷一区| 欧美国产美女| 日本va欧美va瓶| 久久精品国产99久久| 欧美一区自拍| 国产综合亚洲精品一区二| 国产精品自拍区| 国产精品嫩草99av在线| 国产成人精品亚洲线观看| 日本亚洲视频在线|