Android仿微信右滑返回功能的實(shí)例代碼
先上效果圖,如下:
先分析一下功能的主要技術(shù)點(diǎn),右滑即手勢(shì)判斷,當(dāng)滑到一直距離時(shí)才執(zhí)行返回,并且手指按下的位置是在屏幕的最左邊(這個(gè)也是有一定范圍的), 這些可以實(shí)現(xiàn)onTouchEvent來(lái)實(shí)現(xiàn)。 接著就是返回時(shí),有滑動(dòng)效果,很顯然這個(gè)是Acitivty切換動(dòng)畫(huà)實(shí)現(xiàn)的。好啦,分析完了就開(kāi)干。下面上代碼:
@Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: x=event.getX(); y=event.getY(); // Log.e("ACTION_DOWN","x="+x); break; case MotionEvent.ACTION_MOVE: float mX = event.getX(); float mY = event.getY(); float dX = Math.abs(mX-x); float dY = Math.abs(mY-y); scollX = mX-x; if (isScroll && scollX>0){ view.scrollTo(-(int) scollX,0); } break; case MotionEvent.ACTION_UP: if (isScroll && scollX>300){ finish(); overridePendingTransition(R.anim.bga_sbl_activity_backward_enter,R.anim.bga_sbl_activity_backward_exit); }else { isScroll = false; view.scrollTo(0,0); } break; } return false; }
這段代碼主要是實(shí)現(xiàn)了 手指在屏幕上滑動(dòng)時(shí),判斷方向是否是右滑,是的話就用scrollTo()來(lái)實(shí)現(xiàn)Activity的滑動(dòng),當(dāng)滑動(dòng)超過(guò)300px時(shí)就執(zhí)行返回,并且加上切換動(dòng)畫(huà)??吹竭@里細(xì)心的朋友應(yīng)該會(huì)發(fā)現(xiàn)scrollTo()方法滑動(dòng)的只是內(nèi)容,并不是View的本身,那是怎么實(shí)現(xiàn)整個(gè)activity的滑動(dòng)的呢?沒(méi)錯(cuò),如果只是上面這部分代碼,當(dāng)你滑動(dòng)時(shí),是看不懂上一個(gè)界面的內(nèi)容的,因?yàn)槲覀兊腣iew還在,這里說(shuō)一下這個(gè)View是我獲取的activity的根布局。好啦,既然是這個(gè)View擋住了我們的的上一層布局,那么是不是只要讓它透明就可以了呢?答案是肯定的,我記得要讓根布局透明只需要改一下主題即可,如下:
<!-- 用于開(kāi)啟滑動(dòng)返回功能的 Activity --> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item>
只需要把上面兩行代碼添加到你的主題中即可。
感覺(jué)已經(jīng)大功告成了,其實(shí)不是的,前面我們說(shuō)了,當(dāng)手指從屏幕的最左邊向右滑時(shí),才實(shí)發(fā)滑動(dòng),這個(gè)就涉及到事件分發(fā)了。比如我們一個(gè)按鈕的寬占滿(mǎn)全屏,那當(dāng)我們手指在按鈕的最左側(cè)按下時(shí),是執(zhí)行點(diǎn)擊事件還是執(zhí)行滑動(dòng)呢?這個(gè)時(shí)候就需要用到dispatchTouchEvent來(lái)處理這個(gè)問(wèn)題。下面看代碼:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction()==MotionEvent.ACTION_DOWN){ float x = ev.getX(); // Log.e("dispatchTouchEvent","x="+x); if (x<=50&&isCanScroll){ isScroll = true; return true; } } return super.dispatchTouchEvent(ev); }
上面的代碼是當(dāng)我們的手指在屏幕最左側(cè)按下時(shí),如果小于50(這個(gè)數(shù)值可以根據(jù)需求自己設(shè)置),我們就認(rèn)為用戶(hù)需要右滑,于是,我們就消費(fèi)掉,不往下一層傳遞。
當(dāng)沒(méi)有小于50時(shí),正常執(zhí)行。
整個(gè)流程已經(jīng)講完了,是不是很簡(jiǎn)單!這些代碼最好放到Activity基類(lèi)中實(shí)現(xiàn)!這樣方便管理!
總結(jié)
以上所述是小編給大家介紹的Android仿微信右滑返回功能的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Android TextWatcher內(nèi)容監(jiān)聽(tīng)死循環(huán)案例詳解
這篇文章主要介紹了Android TextWatcher內(nèi)容監(jiān)聽(tīng)死循環(huán)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Android AlertDialog自定義樣式實(shí)現(xiàn)代碼
這篇文章主要介紹了Android AlertDialog自定義樣式實(shí)現(xiàn)代碼的相關(guān)資料,這里提供了實(shí)例代碼,一個(gè)簡(jiǎn)單示例,需要的朋友可以參考下2016-12-12Android入門(mén)之ProgressBar的使用教程
Android里的ProgressBar默認(rèn)為一個(gè)不斷轉(zhuǎn)圈的圓,它也可以自定義。這篇文章主要通過(guò)示例和大家介紹下ProgressBar的使用,感興趣的可以了解一下2022-11-11Activity取消界面切換的默認(rèn)動(dòng)畫(huà)方法(推薦)
下面小編就為大家?guī)?lái)一篇Activity取消界面切換的默認(rèn)動(dòng)畫(huà)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Android實(shí)現(xiàn)小米相機(jī)底部滑動(dòng)指示器
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)小米相機(jī)底部滑動(dòng)指示器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Android中WebView與Js交互的實(shí)現(xiàn)方法
本文給大家介紹android中webview與js交互的實(shí)現(xiàn)方法,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)2016-05-05詳解Android——藍(lán)牙技術(shù) 帶你實(shí)現(xiàn)終端間數(shù)據(jù)傳輸
藍(lán)牙技術(shù)在智能硬件方面有很多用武之地,本篇文章主要介紹了Android——藍(lán)牙技術(shù),實(shí)現(xiàn)兩個(gè)終端間數(shù)據(jù)的傳輸,有興趣的朋友可以了解一下。2016-12-12