亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

Android Activity向右滑動(dòng)返回

瀏覽:4日期:2022-09-23 14:42:24

向右滑動(dòng)返回,對于屏幕過大的手機(jī)來說,在單手操作時(shí),是一個(gè)不錯(cuò)的用戶體驗(yàn),用戶不必再費(fèi)力的或者用另一個(gè)手去點(diǎn)擊屏幕左上角的返回按鈕或者,手機(jī)右下角的返回按鈕,輕輕向右滑動(dòng)屏幕即可返回上一頁,這個(gè)功能如今大部分APP都已經(jīng)支持啦,你的APP支持了嗎?

自己在網(wǎng)上百度了一些滑動(dòng)返回的方法,有的是用的第三方控件如swipebackLayout但弊端過大如與自己自定義的一些控件沖突等,有的是通過判斷手勢監(jiān)聽但步驟相當(dāng)繁瑣,總之沒有盡如人意的,本篇所講的實(shí)現(xiàn)方法其實(shí)也是通過監(jiān)聽事件分發(fā)來實(shí)現(xiàn)的,但是步驟非常簡單,且效果經(jīng)本人不斷測試也相當(dāng)不錯(cuò),接下來本人講解下實(shí)現(xiàn)過程:

實(shí)現(xiàn)該功能需同時(shí)滿足幾個(gè)條件,并要考慮用戶的操作意圖,既要保證足夠的靈敏度,不要出現(xiàn)向右滑動(dòng)好多次還沒返回上一頁的情況,也不要出現(xiàn)本來是想上下滑動(dòng)(斜著上下滑動(dòng))而非向右滑動(dòng)返回,也被判斷為向右滑動(dòng)返回而結(jié)束了當(dāng)前界面,那么我們需要滿足:

1.用戶需向右滑動(dòng)一段距離,且X軸距離>某一設(shè)定的值;

2.因?yàn)橄蛴一瑒?dòng)時(shí),不可能時(shí)嚴(yán)格的水平方向而不向Y軸偏移,所以向Y軸的偏移量不能超過某一設(shè)定的值,否則認(rèn)為用戶意圖不是滑動(dòng)返回而是上下滑動(dòng);

Android Activity向右滑動(dòng)返回

3.在測試過程中,如果用戶意圖是上下滑動(dòng)時(shí),那么手指在y軸移動(dòng)速度(我們按每秒移動(dòng)的像素值,可通過VelocityTracker類計(jì)算)非常大,通常在幾千到過萬,而在正常的水平滑動(dòng)時(shí),y軸的移動(dòng)速度通常只有100左右,因此,我們需要判斷的是,如果y軸上手指滑動(dòng)速度超過某一設(shè)定值(本人將該值設(shè)置為了1000),則認(rèn)為用戶意圖是上下滑動(dòng)而非向右滑動(dòng)返回;

好了,接下來我們便可自定義一個(gè)BaseActivity繼承Activity,并在BaseActivity中重寫事件分發(fā)dispatchTouchEvent,并記錄手指按下,移動(dòng)的距離及手指滑動(dòng)速度,從而判斷用戶的意圖,完整代碼:

package com.kincai.store.ui; import com.kincai.store.utils.LogTest; import android.app.Activity;import android.os.Bundle;import android.view.MotionEvent;import android.view.VelocityTracker; /** * * @company KCS互聯(lián)網(wǎng)有限公司 * * @author kincai * * @description baseActivity * * @project Kincai_Store * * @package com.kincai.store.ui * * @time 2015-7-13 上午10:18:29 * */public class BaseActivity extends Activity { // 手指上下滑動(dòng)時(shí)的最小速度 private static final int YSPEED_MIN = 1000; // 手指向右滑動(dòng)時(shí)的最小距離 private static final int XDISTANCE_MIN = 50; // 手指向上滑或下滑時(shí)的最小距離 private static final int YDISTANCE_MIN = 66; private static final String TAG = 'BaseActivity'; // 記錄手指按下時(shí)的橫坐標(biāo)。 private float xDown; // 記錄手指按下時(shí)的縱坐標(biāo)。 private float yDown; // 記錄手指移動(dòng)時(shí)的橫坐標(biāo)。 private float xMove; // 記錄手指移動(dòng)時(shí)的縱坐標(biāo)。 private float yMove; // 用于計(jì)算手指滑動(dòng)的速度。 private VelocityTracker mVelocityTracker; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); LogTest.LogMsg(TAG, 'BaseActivity-onCreate'); } @Override public boolean dispatchTouchEvent(MotionEvent event) { createVelocityTracker(event); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: xDown = event.getRawX(); yDown = event.getRawY(); break; case MotionEvent.ACTION_MOVE: xMove = event.getRawX(); yMove = event.getRawY(); // 滑動(dòng)的距離 int distanceX = (int) (xMove - xDown); int distanceY = (int) (yMove - yDown); // 獲取順時(shí)速度 int ySpeed = getScrollVelocity(); // 關(guān)閉Activity需滿足以下條件: // 1.x軸滑動(dòng)的距離>XDISTANCE_MIN // 2.y軸滑動(dòng)的距離在YDISTANCE_MIN范圍內(nèi) // 3.y軸上(即上下滑動(dòng)的速度)<XSPEED_MIN,如果大于,則認(rèn)為用戶意圖是在上下滑動(dòng)而非左滑結(jié)束Activity if (distanceX > XDISTANCE_MIN && (distanceY < YDISTANCE_MIN && distanceY > -YDISTANCE_MIN) && ySpeed < YSPEED_MIN) { finish(); } break; case MotionEvent.ACTION_UP: recycleVelocityTracker(); break; default: break; } return super.dispatchTouchEvent(event); } /** * 創(chuàng)建VelocityTracker對象,并將觸摸界面的滑動(dòng)事件加入到VelocityTracker當(dāng)中。 * * @param event * */ private void createVelocityTracker(MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); } /** * 回收VelocityTracker對象。 */ private void recycleVelocityTracker() { mVelocityTracker.recycle(); mVelocityTracker = null; } /** * * @return 滑動(dòng)速度,以每秒鐘移動(dòng)了多少像素值為單位。 */ private int getScrollVelocity() { //1000速度 mVelocityTracker.computeCurrentVelocity(1000); int velocity = (int) mVelocityTracker.getYVelocity(); return Math.abs(velocity); } @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); LogTest.LogMsg(TAG, 'BaseActivity-onStart'); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); LogTest.LogMsg(TAG, 'BaseActivity-onResume'); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); LogTest.LogMsg(TAG, 'BaseActivity-onPause'); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); LogTest.LogMsg(TAG, 'BaseActivity-onDestroy'); } }

程序activity想實(shí)現(xiàn)滑動(dòng)返回功能的話 直接繼承BaseActivity即可

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 欧美日韩一区二区综合 | 丁香婷婷激情五月 | 亚洲免费人成在线视频观看 | 亚洲xx网| 亚洲精品区一区二区三区四 | 欧美亚洲综合另类在线观看 | 免费观看性欧美一级 | 精品国产免费久久久久久 | 91免费在线视频观看 | 最新国产成人综合在线观看 | 日韩欧美亚洲综合一区二区 | 国产逼逼视频 | 国产一区二区视频在线播放 | 麻豆影视在线 | 黄色网页在线 | 国产乱人伦精品一区二区 | 久久精品亚洲牛牛影视 | 亚洲精品中文字幕午夜 | 日韩视频免费看 | 成人免费在线播放视频 | 搞黄视频在线观看 | 精品在线观看免费 | 9久9久女女热精品视频免费观看 | 欧美xx毛片免费看 | 性黄色片 | 亚洲国产九九精品一区二区 | 亚洲国产综合专区在线播一一 | 一级黄色在线观看 | 亚洲国产二区 | 久久综合九色婷婷97 | 2020年国产一国产一级毛卡片 | 日日夜夜免费精品视频 | 日本亚洲精品无码专区 | 国产精品久久精品牛牛影视 | 国产91精品在线播放 | 污污网站在线免费观看 | 在线观看国产小屁孩cao大人 | 亚洲天天综合网 | 日本高清中文字幕视频在线 | 青青操在线免费观看 | 成人免费片 |