Android侧滑结束当前页
来源:互联网 发布:听歌不要钱的软件 编辑:程序博客网 时间:2024/06/06 01:26
第一次开通博客,先写一些笔记试一下吧~
IOS由于不包含返回按钮,所以经常有一个滑动删除当前页面的用户习惯。有时产品为了保持iOS和Android 的风格一致,也会要求侧滑结束当前页面,我也是看的别人的Demo,自己写一些简单的笔记整理一下思路,供大家参考。
自定义可以滑动的RelativeLayout, 类似于IOS的滑动删除页面效果,当我们要使用 此功能的时候,需要将该Activity的顶层布局设置为SildingFinishLayout, 然后需要调用setTouchView()方法来设置需要滑动的View。
1、自定义顶层布局SildingFinishLayout
1.首先要获取其所在的父布局,判断其中的不同操作手势。
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();}}
2.定义接口监听,结束页面
public interface OnSildingFinishListener {public void onSildingFinish();}
3.点击内部控件,执行该控件的相应操作
public void setTouchView(View touchView) {this.touchView = touchView;touchView.setOnTouchListener(this);}
public View getTouchView() {return touchView;}
4.定义几个Boolean类型的方法,当用户点击的是内部的按钮或者AbsListView, 例如ListView, GridView等其子类时,禁止把当前页面finish掉。
private boolean isTouchOnAbsListView() {return touchView instanceof AbsListView ? true : false;}private boolean isTouchOnScrollView() {return touchView instanceof ScrollView ? true : false;}
5.当页面很长时,就需要滑动,此时要设置布局能继续加载出来
/*** 滚动出界面*/private void scrollRight() {final int delta = (viewWidth + mParentView.getScrollX());// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动itemmScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,Math.abs(delta));postInvalidate();}/*** 滚动到起始位置*/private void scrollOrigin() {int delta = mParentView.getScrollX();mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,Math.abs(delta));postInvalidate();}
6.进行最重要的手势判断,判断不同的手势,滑动时的位移,来判断是否结束当前页面
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,// 则当手指滑动,取消item的点击事件,不然我们滑动也伴随着item点击事件的发生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);// 屏蔽在滑动过程中ListView ScrollView等自己的滑动事件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);}// 其他的情况直接返回truereturn true;}
2、页面布局
<com.example.view.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/sildingFinishLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#556677" > <ListView android:id="@+id/listView" android:cacheColorHint="@android:color/transparent" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </com.example.view.SildingFinishLayout>
我只是简单的写了一个,自定义布局继承的是RelativeLayout,按照RelativeLayout写布局即可
3、监听页面
ListView mListView = (ListView) findViewById(R.id.listView);ArrayAdapter<String> adapter = new ArrayAdapter<String>(AbsActivity.this, android.R.layout.simple_list_item_1, list);mListView.setAdapter(adapter);SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.sildingFinishLayout);mSildingFinishLayout.setOnSildingFinishListener(new OnSildingFinishListener() {@Overridepublic void onSildingFinish() {AbsActivity.this.finish();}});// touchView要设置到ListView上面mSildingFinishLayout.setTouchView(mListView);mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {startActivity(new Intent(AbsActivity.this, NormalActivity.class));overridePendingTransition(R.anim.base_slide_right_in,R.anim.base_slide_remain);}});
我只是简单的理一下思路,文笔不好,慢慢练吧。附上源码,不然就太不厚道了
点击下载源码
1 0
- Android侧滑结束当前页
- Android -结束当前activity并返回上一个activity
- 结束当前操作
- jQuery 快速结束当前动画
- 滑动返回结束当前Activity
- js 判断结束日期小于当前日期
- SwipeBackLayout实现滑动结束当前Activity
- 四种结束当前的activity方法
- 结束当前Activity时将值传给上一个Activity
- 四种结束当前的activity方法
- android动画结束后停在结束位置
- android实现结束进程。
- Android 移植项目结束
- android之结束通话
- android 结束进程不起作用
- Android 结束/启动进程
- Android结束进程
- Android 判断动画结束
- 测试222
- cocos2dx3.3 CCNotificationCenter观察者模式
- jQuery源码剖析(一)——概览&工具方法
- CentOS发送邮件(sendmail)
- DI IOC区别
- Android侧滑结束当前页
- 【记录】Apache POI - the Java API for Microsoft Documents - 15秒快速入门
- neo4j入门教程-(安装、配置)
- android,不让edittext一进入页面就获取焦点
- 比较15个数的大小
- 2.2JSON数据解析(一)
- Properties类 of Java 的使用
- ViewPager+FragmentPagerAdapter实现微信5.2.1主界面架构
- html 标签详解(基础<!DOCTYPE> )