Activity滑動(dòng)返回效果的實(shí)現(xiàn)

Activity滑動(dòng)返回效果的實(shí)現(xiàn)

在很多的App中这刷,都會(huì)發(fā)現(xiàn)利用手指滑動(dòng)事件胚想,進(jìn)行高效且人性化的交互于微。在一個(gè)大家越來越觸摸不到屏幕左上方返回鍵的大屏幕時(shí)代蹋嵌,若執(zhí)拗的不去改變自己的設(shè)計(jì)方法,不去換一種思路葫隙,那就是自尋死路栽烂。

在詳情頁面中,我希望有兩種方式來進(jìn)行返回:

  1. 點(diǎn)擊左上角的返回按鈕,返回上一級(jí)
  2. 手指從左往右滑動(dòng)腺办,返回上一級(jí)

方法一:OnClickListener

該方法很簡單粗暴焰手,為你的返回按鈕添加監(jiān)聽事件,調(diào)用finish(),同時(shí)可以在finish之后怀喉,實(shí)現(xiàn)一些動(dòng)畫效果书妻。比如我用的:

overridePendingTransition(R.anim.push_left_in,
                    R.anim.push_right_out);

R.anim.push_left_in也很簡單:

<translate android:fromXDelta="100%" android:toXDelta="0"
        android:duration="600" />

R.anim.push_left_out:

android:fromXDelta="0" android:toXDelta="100%"

這就能實(shí)現(xiàn)一個(gè)很簡單的滑動(dòng)滑出的動(dòng)畫。

在做這個(gè)動(dòng)畫的時(shí)候躬拢,不太理解其中屬性的含義躲履,一直出不來自己想要的結(jié)果。搜索了很多聊闯,然后自己也總結(jié)一下:

  • fromXDelta 動(dòng)畫起始時(shí)X坐標(biāo)位置(左正右負(fù)工猜,下同)
  • toXDelta 動(dòng)畫結(jié)束時(shí)X坐標(biāo)位置
  • fromYDelta 動(dòng)畫起始時(shí)Y坐標(biāo)位置
  • toYDelta 動(dòng)畫結(jié)束時(shí)Y坐標(biāo)位置
  • duration 動(dòng)畫的持續(xù)時(shí)間ms

注:在沒有指定的時(shí)候,默認(rèn)是以自己為相對(duì)參照物菱蔬。屬性中+%表示和自身的百分比篷帅,+p表示以父View為參考。

方法二:onTouchEvent

大概的思路就是:監(jiān)聽手勢按下以及移動(dòng)的距離和速度拴泌,若超過合理的范圍魏身,我就認(rèn)定用戶是在返回

說起來還是很簡單,實(shí)現(xiàn)起來也不是特別的復(fù)雜蚪腐。我將其寫入在我的菜單基類里面箭昵,便于其他菜單繼承。

  • 設(shè)置向右滑動(dòng)的最小速度SPEED_MIN = 200;
  • 設(shè)置向右滑動(dòng)的最小距離DISTANCE_MIN = 150;
  • 用兩個(gè)變量削茁,記錄手指按下時(shí)的橫坐標(biāo)xDown宙枷,和移動(dòng)時(shí)的橫坐標(biāo)xMove;
  • 在onTouch中得到xMove-xDown之間的距離,并通過函數(shù)計(jì)算出當(dāng)時(shí)的速度茧跋。若都大于最小值慰丛,則判定用戶是在返回,調(diào)用finish();
  • 創(chuàng)建VelocityTracker對(duì)象瘾杭,并將觸摸content界面的滑動(dòng)事件加入到VelocityTracker當(dāng)中
mVelocityTracker.addMovement(event);
  • 通過getScrollVelocity()诅病,獲得手指的當(dāng)前滑動(dòng)速度(滑動(dòng)速度依靠的是每秒鐘多少像素
private int getScrollVelocity() {
        mVelocityTracker.computeCurrentVelocity(1000);
        int velocity = (int) mVelocityTracker.getXVelocity();
        return Math.abs(velocity);
    }
  • 記住在MotionEvent.ACTION_UP中回收VelocityTracker對(duì)象

我興高采烈的配置完畢,發(fā)現(xiàn)犯傻了粥烁。由于的我項(xiàng)目需要贤笆,我將我的布局寫成了ScrollView,所以首先會(huì)執(zhí)行scrollView中的onTouchEvent()讨阻,而且會(huì)返回true芥永,事件停止傳播。這就會(huì)導(dǎo)致上面寫的OnTouchEvent將不會(huì)被回調(diào)了钝吮。

解決的辦法就是自己自定義一個(gè)ScrollView

  • Override onTouchEvent()方法埋涧,并讓它返回true
  • 在將之前布局中的ScrollView用新的替換掉

萬事OK板辽,按下F11,噫棘催?怎么搞的劲弦,還是返回不了嘛,而且就沒有滑動(dòng)的說(因?yàn)槲以贠nTouchEvent中添加了log)醇坝。

再一次邑跪,我踏上了除蟲之旅。

仔細(xì)的分析過后發(fā)現(xiàn)呼猪,ScrollView中的高度好像不對(duì)画畅,并沒有像我想象的那樣填滿整個(gè)控件,但是我設(shè)置的屬性的的確確是fill_parent吶郑叠。查了查Google夜赵,才發(fā)現(xiàn)要想填滿整個(gè)ScrollView時(shí),fill_parent屬性是不管用的乡革。必須設(shè)置fillViewport="true"寇僧。

這樣改了改,總算完成了預(yù)定想法沸版。

想起來一個(gè)人在知乎上面說的話:“做Android開發(fā)就是嘁傀,解決了一個(gè)問題,又有無數(shù)個(gè)問題冒出來视粮∠赴欤”

對(duì)此,我深感贊同蕾殴。

Have a nice day.


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笑撞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钓觉,更是在濱河造成了極大的恐慌茴肥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荡灾,死亡現(xiàn)場離奇詭異瓤狐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)批幌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門础锐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荧缘,你說我怎么就攤上這事皆警。” “怎么了截粗?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵耀怜,是天一觀的道長恢着。 經(jīng)常有香客問我,道長财破,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任从诲,我火速辦了婚禮左痢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘系洛。我一直安慰自己俊性,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布描扯。 她就那樣靜靜地躺著定页,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绽诚。 梳的紋絲不亂的頭發(fā)上典徊,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音恩够,去河邊找鬼卒落。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蜂桶,可吹牛的內(nèi)容都是我干的儡毕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扑媚,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼腰湾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疆股,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤费坊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后押桃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葵萎,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年唱凯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了羡忘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磕昼,死狀恐怖卷雕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情票从,我是刑警寧澤漫雕,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布滨嘱,位于F島的核電站,受9級(jí)特大地震影響浸间,放射性物質(zhì)發(fā)生泄漏太雨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一魁蒜、第九天 我趴在偏房一處隱蔽的房頂上張望囊扳。 院中可真熱鬧,春花似錦兜看、人聲如沸锥咸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搏予。三九已至,卻和暖如春弧轧,著一層夾襖步出監(jiān)牢的瞬間雪侥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工劣针, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留校镐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓捺典,卻偏偏與公主長得像鸟廓,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子襟己,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 什么是View View 是 Android 中所有控件的基類引谜。 View的位置參數(shù) View 的位置由它的四個(gè)頂...
    acc8226閱讀 1,177評(píng)論 0 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件擎浴、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 《紅樓夢(mèng)》是高中畢業(yè)時(shí)的那個(gè)暑假看的员咽,里面有很多的詩詞,大多詩詞隱藏著各個(gè)人物的結(jié)局贮预,當(dāng)時(shí)的我根本看不懂其紅樓夢(mèng)這...
    昕語心愿閱讀 1,562評(píng)論 18 2
  • 最近經(jīng)歷了很多贝室,失業(yè)?失戀!對(duì)于我這個(gè)年齡來說仿吞,好像生活一下子全亂套了滑频!我無所適從,不知道該怎么辦唤冈?我已經(jīng)不記得自...
    百里朱閱讀 273評(píng)論 0 0