




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么实现仿iOS侧滑退出当前界面功能
在下给大家分享一下Android中怎么实现仿iOS侧滑退出当前界面功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先看下效果图:分析:(1)要想模仿ios的这种效果,因为我们通过手指的滑动,所以这里肯定跟我们的滑动事件有关系(onInterceptTouchEvent,onTouchEvent这两个方法的关系,如果不清楚,请直接查阅事件传递机制原理)(2)我们要想直接拦截我们的所有触摸事件,我们可以在上层父级布局中进行拦截和处理,这里我们想到了DecorView。首先我们应该知道Activity的顶级父View是DecorView,获取我们的DecorView也很简单getWindow().getDecorView()我们平时写的那些xml布局文件都是包裹在这个DecorView中的,所以这里我们就有了一个思路:我们可以在我们的xml布局和DecorView中间添加一个中间布局(SlidingLayout),然后所有的滑动逻辑和滑动冲突全部在这里面处理。(3)比较关键的是:当我们需要使用侧滑动能的Activity我们需要将它的主题设置成透明,这样滑动的时候就不会遮挡下面的Activity,代码如下:<style
name="AppTheme.Slide"
parent="@style/AppTheme">
<!--Required-->
<item
name="android:windowBackground">@android:color/transparent</item>
<item
name="android:windowIsTranslucent">true</item>
<item
name="android:windowAnimationStyle">@style/AppTheme.Slide.Animation</item>
</style>(4)当我们滑动超过半屏的时候,退出当前界面,否则则回退到原始位置。这里使用Scroller下面直接上代码进行分析:1)、触摸事件的处理过程,按下的位置大于X轴的十分之一就拦截当前事件,交给SlidingLayout的onTouchEvent处理/**
*
根据手指移动的距离判断是否拦截触摸事件
*
*
@param
ev
*
@return
*/
@Override
public
boolean
onInterceptTouchEvent(MotionEvent
ev)
{
int
x
=
(int)
ev.getX();
int
y
=
(int)
ev.getY();
boolean
mIntercept
=
false;
switch
(ev.getAction())
{
case
MotionEvent.ACTION_DOWN:
mInterceptDownX
=
x;
mLastInterceptX
=
x;
mLastInterceptY
=
y;
break;
case
MotionEvent.ACTION_MOVE:
int
moveX
=
x
-
mLastInterceptX;
int
moveY
=
y
-
mLastInterceptY;
//按下的位置的X位置小于屏幕的十分之一,并且x移动的距离大于y移动的距离,就拦截
if
(mInterceptDownX
<
(getWidth()
/
10)
&&
Math.abs(moveX)
>
Math.abs(moveY))
{
mIntercept
=
true;
}
else
{
mIntercept
=
false;
}
mLastInterceptX
=
x;
mLastInterceptY
=
y;
break;
case
MotionEvent.ACTION_UP:
//抬起的时候重置参数
mIntercept
=
false;
mInterceptDownX
=
mLastInterceptX
=
mLastInterceptY
=
0;
break;
}
return
mIntercept;
}
private
int
mTouchDownX;
private
int
mLastTouchX;
private
int
mLastTouchY;
@Override
public
boolean
onTouchEvent(MotionEvent
event)
{
boolean
mConsumed
=
false;
int
x
=
(int)
event.getX();
int
y
=
(int)
event.getY();
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
mTouchDownX
=
x;
mLastTouchX
=
x;
mLastTouchY
=
y;
break;
case
MotionEvent.ACTION_MOVE:
int
moveX
=
x
-
mLastTouchX;
int
moveY
=
y
-
mLastTouchY;
if
(mTouchDownX
<
(getWidth()
/
10)
&&
Math.abs(moveX)
>
Math.abs(moveY)
&&
!mConsumed)
{
mConsumed
=
true;
}
if
(mConsumed)
{
int
rightMoveX
=
(int)
(mLastTouchX
-
event.getX());
if
((getScrollX()
+
rightMoveX)
>
0)
{
//向左滑动的时候,getScrollX()和rightMoveX都大于0,所以禁止滑动
scrollTo(0,
0);
}
else
{
scrollBy(rightMoveX,
0);
}
}
mLastTouchX
=
x;
mLastTouchY
=
y;
break;
case
MotionEvent.ACTION_UP:
mConsumed
=
false;
mTouchDownX
=
mLastTouchX
=
mLastTouchY
=
0;
if(-getScrollX()<getWidth()/2){
//偏移量不到屏幕宽度的一般,就回到最初的位置
scrollBack();
}else{
scrollFinish();
}
break;
case
MotionEvent.ACTION_CANCEL:
mConsumed
=
false;
mTouchDownX
=
mLastTouchX
=
mLastTouchY
=
0;
if(-getScrollX()<getWidth()/2){
//偏移量不到屏幕宽度的一般,就回到最初的位置
scrollBack();
}else{
scrollFinish();
}
break;
}
return
true;
}2)、滑动的偏移量超出屏幕的一办,就关闭当前界面否则回到初始位置/**
*
滑动到最初的位置
*/
private
void
scrollBack()
{
int
startX
=
getScrollX();
int
dx
=
-getScrollX();
mScroller.startScroll(startX,
0,
dx,
0,
300);
invalidate();
}
/**
*
向右滑动关闭
*/
private
void
scrollFinish(){
int
dx
=
-getScrollX()
-
getWidth();
mScroller.startScroll(getScrollX(),0,dx,0,300);
invalidate();
}3)、我们可以将这些侧滑处理放在我们的BaseActivity当中,需要侧滑的Activity只要继承这个BaseActivity并且主题设置成透明就可以了@Override
protected
void
onCreate(@Nullable
Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
if(enableRightSliding()){
SlidingLayout
slidingLayout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 诊所合同范本(2篇)
- 二零二五年度小超市员工劳动合同加班时间记录及审批合同
- 二零二五年度广告品牌推广与传播合同
- 二零二五年度劳动合同法调整下企业高管竞业禁止合同
- 天津2025年度房屋租赁合同(含租金递增条款)
- 二零二五年度平面广告设计合同范本
- 二零二五年度留学生实习实训基地人才培养合作合同
- 城市雕塑制作合同
- 二零二五年度商业住房转租管理合同范本
- 文化产业合同管理与信息化实务
- 公司银行贷款申请书范文
- 机械设计制造及其自动化专业知识
- 钢结构地下停车场方案
- 《上市公司治理培训》课件
- 新人教版小学五年级数学下册《第一单元 观察物体(三)》2022课标大单元整体教学设计-全析
- 期末测试卷(二)(试题 )2024-2025学年二年级上册数学人教版
- 天津市2023-2024学年高二上学期期末考试物理试题(含答案)
- 《光伏电站运行与维护》课件-项目五 光伏电站常见故障处理
- 第九单元 课题1 溶液及其应用-2024-2025学年九年级化学下人教版教学课件
- 《大学生创新创业基础教程》教学教案
- 2024专利代理人考试真题及答案
评论
0/150
提交评论