Android實(shí)現(xiàn)左滑退出Activity的完美封裝
1:定義一個(gè)自己的父級(jí)容器,讓它繼承自一個(gè)布局(LinearLayout、RelativeLayout都可以)
public class SildingFinishLayout extends RelativeLayout implements View.OnTouchListener { /** * SildingFinishLayout布局的父布局 */ private ViewGroup mParentView; /** * 處理滑動(dòng)邏輯的View */ private View touchView; /** * 滑動(dòng)的最小距離 */ private int mTouchSlop; /** * 按下點(diǎn)的X坐標(biāo) */ private int downX; /** * 按下點(diǎn)的Y坐標(biāo) */ private int downY; /** * 臨時(shí)存儲(chǔ)X坐標(biāo) */ private int tempX; /** * 滑動(dòng)類(lèi) */ private Scroller mScroller; /** * SildingFinishLayout的寬度 */ private int viewWidth; /** * 記錄是否正在滑動(dòng) */ private boolean isSilding; private OnSildingFinishListener onSildingFinishListener; private boolean isFinish; public SildingFinishLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); mScroller = new Scroller(context); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (changed) { // 獲取SildingFinishLayout所在布局的父布局 mParentView = (ViewGroup) this.getParent(); viewWidth = this.getWidth(); } } /** * 設(shè)置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity * * @param onSildingFinishListener */ public void setOnSildingFinishListener( OnSildingFinishListener onSildingFinishListener) { this.onSildingFinishListener = onSildingFinishListener; } /** * 設(shè)置Touch的View * * @param touchView */ public void setTouchView(View touchView) { this.touchView = touchView; touchView.setOnTouchListener(this); } public View getTouchView() { return touchView; } /** * 滾動(dòng)出界面 */ private void scrollRight() { final int delta = (viewWidth + mParentView.getScrollX()); // 調(diào)用startScroll方法來(lái)設(shè)置一些滾動(dòng)的參數(shù),我們?cè)赾omputeScroll()方法中調(diào)用scrollTo來(lái)滾動(dòng)item mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0, Math.abs(delta)); postInvalidate(); } /** * 滾動(dòng)到起始位置 */ private void scrollOrigin() { int delta = mParentView.getScrollX(); mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0, Math.abs(delta)); postInvalidate(); } /** * touch的View是否是AbsListView, 例如ListView, GridView等其子類(lèi) * * @return */ private boolean isTouchOnAbsListView() { return touchView instanceof AbsListView ? true : false; } /** * touch的view是否是ScrollView或者其子類(lèi) * * @return */ private boolean isTouchOnScrollView() { return touchView instanceof ScrollView ? true : false; } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = tempX = (int) event.getRawX(); downY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getRawX(); int deltaX = tempX - moveX; tempX = moveX; if (Math.abs(moveX - downX) > mTouchSlop && Math.abs((int) event.getRawY() - downY) < mTouchSlop) { isSilding = true; // 若touchView是AbsListView, // 則當(dāng)手指滑動(dòng),取消item的點(diǎn)擊事件,不然我們滑動(dòng)也伴隨著item點(diǎn)擊事件的發(fā)生 if (isTouchOnAbsListView()) { MotionEvent cancelEvent = MotionEvent.obtain(event); cancelEvent .setAction(MotionEvent.ACTION_CANCEL | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT)); v.onTouchEvent(cancelEvent); } } if (moveX - downX >= 0 && isSilding) { mParentView.scrollBy(deltaX, 0); // 屏蔽在滑動(dòng)過(guò)程中ListView ScrollView等自己的滑動(dòng)事件 if (isTouchOnScrollView() || isTouchOnAbsListView()) { return true; } } break; case MotionEvent.ACTION_UP: isSilding = false; if (mParentView.getScrollX() <= -viewWidth / 2) { isFinish = true; scrollRight(); } else { scrollOrigin(); isFinish = false; } break; } // 假如touch的view是AbsListView或者ScrollView 我們處理完上面自己的邏輯之后 // 再交給AbsListView, ScrollView自己處理其自己的邏輯 if (isTouchOnScrollView() || isTouchOnAbsListView()) { return v.onTouchEvent(event); } // 其他的情況直接返回true return true; } @Override public void computeScroll() { // 調(diào)用startScroll的時(shí)候scroller.computeScrollOffset()返回true, if (mScroller.computeScrollOffset()) { mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); if (mScroller.isFinished()) { if (onSildingFinishListener != null && isFinish) { onSildingFinishListener.onSildingFinish(); } } } } public interface OnSildingFinishListener { public void onSildingFinish(); } }
2.Acitity
在Activity的onCreate()方法里面
@Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.timed_task_SildingFinishLayout); mSildingFinishLayout mSildingFinishLayout .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() { @Override public void onSildingFinish() { finish(); } }); mSildingFinishLayout .setTouchView(mSildingFinishLayout);//綁定底層的布局就可以了 :不起作用的話(huà)換個(gè)你activity 布局里面view就可以啦 }
截止目前,這個(gè)功能已經(jīng)實(shí)現(xiàn)了
解決問(wèn)題:這個(gè)會(huì)出現(xiàn)左滑 背景白色問(wèn)題
1.style.xml中中增加
<style name="AppTheme" parent="android:Theme.Light"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style>
2 acvitiy 的屬性中加上
android:theme="@style/AppTheme"
3 一些屬性的詳解
<item name="android:windowFrame">@null</item> :Dialog的windowFrame框?yàn)闊o(wú) <item name="android:windowIsFloating">true</item>:是否浮現(xiàn)在activity之上 <item name="android:windowIsTranslucent">false</item>:是否半透明 <item name="android:windowNoTitle">true</item>:是否顯示title <item name="android:windowBackground">@drawable/dia_bg</item>:設(shè)置dialog的背景 <item name="android:backgroundDimEnabled">false</item>: 背景是否透明顯示
到此這篇關(guān)于Android實(shí)現(xiàn)左滑退出Activity的完美封裝的文章就介紹到這了,更多相關(guān)Android 左滑退出Activity內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Android封裝一個(gè)全局的BaseActivity
- 詳解Android Activity的啟動(dòng)流程
- c# WPF中System.Windows.Interactivity的使用
- Android利用startActivityForResult返回?cái)?shù)據(jù)到前一個(gè)Activity
- Android非異常情況下的Activity生命周期分析
- Android Activity的4種啟動(dòng)模式圖文介紹
- Android IPC機(jī)制ACtivity綁定Service通信代碼實(shí)例
- 通過(guò)實(shí)例解析android Activity啟動(dòng)過(guò)程
- Android用tabhost實(shí)現(xiàn) 界面切換,每個(gè)界面為一個(gè)獨(dú)立的activity操作
- springboot2.2 集成 activity6實(shí)現(xiàn)請(qǐng)假流程(示例詳解)
- 詳解Android Activity中的幾種監(jiān)聽(tīng)器和實(shí)現(xiàn)方式
相關(guān)文章
Android如何禁止向EditText控件中輸入內(nèi)容詳解
EditText是接受用戶(hù)輸入信息的最重要控件。下面這篇文章主要給大家介紹了關(guān)于Android如何禁止向EditText控件中輸入內(nèi)容的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09Android實(shí)現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)調(diào)用攝像頭進(jìn)行拍照功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android ProgressDialog進(jìn)度條使用詳解
這篇文章主要對(duì)Android開(kāi)發(fā)之ProgressDialog讀取文件進(jìn)度進(jìn)行解析,感興趣的朋友可以參考一下2016-02-02Android編程實(shí)現(xiàn)壓縮圖片并加載顯示的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)壓縮圖片并加載顯示的方法,涉及Android開(kāi)發(fā)中圖片的運(yùn)算、壓縮處理操作及界面布局顯示壓縮圖片等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10android開(kāi)發(fā)權(quán)限詢(xún)問(wèn)的示例代碼
這篇文章主要介紹了android開(kāi)發(fā)權(quán)限詢(xún)問(wèn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Android中使用itemdecoration實(shí)現(xiàn)時(shí)間線效果
這篇文章主要介紹了Android中使用itemdecoration實(shí)現(xiàn)時(shí)間線效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02