Android 侧滑关闭Activity的实例
发布时间 - 2026-01-11 02:32:56 点击率:次Android 侧滑关闭Activity的实例

实现原因
其实侧滑关闭activity在网上也有大量的文章去介绍他,我也有去看,要么是代码实在太多看不下去,要么就是跑了项目没有反应的。唯一的方法还是自己随手鲁一个~,侧滑这个东西在Android中是比较少见的,iOS是最常见不过了,因为毕竟他们没有物理返回键。还有UIScrollView那些。然而我们用的最多的QQ也只是有个功能,并没有真正的滑动效果。至于微信的,我记得N久以前滑出了一个bug。也没什么印象了。估计也是极小的概率事件。于是,当初我就强行的鲁了一个。下面我们一步步分析实现的思路以及代码。
百行代码解决侧滑关闭
首先来看下我们一些简单的定义:
private Activity activity; private Scroller scroller; //上次ACTION_MOVE时的X坐标 private int last_X; //屏幕宽度 private int width; //可滑动的最小X坐标,小于该坐标的滑动不处理 private int min_X; // 页面边缘的阴影图 private Drawable left_shodow; //页面边缘阴影的宽度默认值 private static final int SHADOW_WIDTH = 16; // 页面边缘阴影的宽度 private int shadow_width; // Activity finish标识符 private boolean isFinish;
这边我已经注释过了,就不做过多就写了。接下来,我们看下我们的一些初始化已经外部调用方法:
private void initView(Activity activity) {
this.activity = activity;
scroller = new Scroller(activity);
left_shodow = getResources().getDrawable(R.drawable.left_shadow);
int density = (int) activity.getResources().getDisplayMetrics().density;
shadow_width = SHADOW_WIDTH * density;
// 这里你一定要设置成透明背景,不然会影响你看到底层布局
setBackgroundColor(Color.argb(0, 0, 0, 0));
}
public void bindActivity(Activity activity) {
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
View child = decorView.getChildAt(0);
decorView.removeView(child);
addView(child);
decorView.addView(this);
我们主要看下bindactivity这个方法。这个是我们用来绑定一个activity的。这个activity你们可以基于baseactivity实现一个backactivity。为什么要这么做,因为你每个activity都要写这么一句话,我感觉就是浪费时间,一个基类直接解决。这个activity我们可以这么写:
public abstract class SWBackActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SWBackLayout layout = new SWBackLayout(this);
layout.bindActivity(this);
}
protected abstract void afterInject();
protected abstract void afterInitView();
}
那么接下来我们看下,如果对手势的处理让他侧滑关闭呢?
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last_X = (int) event.getX();
width = getWidth();
min_X = width / 10;
break;
case MotionEvent.ACTION_MOVE:
int rightMovedX = last_X - (int) event.getX();
if (getScrollX() + rightMovedX >= 0) {// 左侧即将滑出屏幕
scrollTo(0, 0);
} else if ((int) event.getX() > min_X) {// 手指处于屏幕边缘时不处理滑动
scrollBy(rightMovedX, 0);
}
last_X = (int) event.getX();
break;
case MotionEvent.ACTION_UP:
if (-getScrollX() < width / 3) {
scrollBack();
isFinish = false;
} else {
scrollClose();
isFinish = true;
}
break;
}
return true;
}
private void scrollBack() {
int startX = getScrollX();
int dx = -getScrollX();
scroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
private void scrollClose() {
int startX = getScrollX();
int dx = -getScrollX() - width;
scroller.startScroll(startX, 0, dx, 0, 300);
invalidate();
}
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();
} else if (isFinish) {
activity.finish();
}
super.computeScroll();
}
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
drawShadow(canvas);
}
private void drawShadow(Canvas canvas) {
// 保存画布当前的状态
canvas.save();
// 设置drawable的大小范围
left_shodow.setBounds(0, 0, shadow_width, getHeight());
// 让画布平移一定距离
canvas.translate(-shadow_width, 0);
// 绘制Drawable
left_shodow.draw(canvas);
// 恢复画布的状态
canvas.restore();
}
首先我们在ACTION_DOWN记录按下点的X坐标
然后在ACTION_MOVE中判断,如果我们getScrollX() + rightMovedX是否是大于0的,如果大于0,表示Activity处于滑动状态,并且是向左滑动,同时我们进行了判断,手指处于屏幕边缘时不可以滑动。
最后在ACTION_UP中判断如果手指滑动的距离大于布局宽度的1/3,表示将Activity滑出界面,否则滑动到起始位置,我们利用Scroller类的startScroll()方法设置好开始位置,滑动距离和时间,然后调用postInvalidate()刷新界面,之后就到computeScroll()方法中,我们利用scrollTo()方法对该布局的父布局进行滚动,滚动结束之后,我们判断界面是否滑出界面,如果是那就划出页面让activity finish掉。否则,布局就归位。
使用方法
其实使用方法很简单,直接继承SWBackActivity就可以了。那么我们最后来看下效果图:
以上就是实现Android 侧滑关闭Activity 的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 侧滑关闭Activity的功能
# 侧滑关闭
# Android中调用另一个Activity并返回结果(选择头像功能为例)
# Android中两个Activity之间数据传递及返回问题
# Android中activity处理返回结果的实现方式
# android getActivity.findViewById获取ListView 返回NULL的
# android 获取上一个activity返回值的方法
# 剖析Android Activity侧滑返回的实现原理
# 边缘
# 滑出
# 也有
# 过了
# 我就
# 太多
# 有个
# 让他
# 那就
# 也没
# 最多
# 就不
# 如有
# 为你
# 不可以
# 我们可以
# 去看
# 希望能
# 很简单
# 跑了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
如何在万网自助建站中设置域名及备案?
如何利用DOS批处理实现定时关机操作详解
如何在阿里云部署织梦网站?
详解jQuery中的事件
如何在建站主机中优化服务器配置?
在线教育网站制作平台,山西立德教育官网?
Python高阶函数应用_函数作为参数说明【指导】
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
QQ浏览器网页版登录入口 个人中心在线进入
Laravel如何使用Livewire构建动态组件?(入门代码)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何自定义建站之星网站的导航菜单样式?
如何在万网自助建站平台快速创建网站?
Laravel中的withCount方法怎么高效统计关联模型数量
成都网站制作公司哪家好,四川省职工服务网是做什么用?
网易LOFTER官网链接 老福特网页版登录地址
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
JavaScript如何操作视频_媒体API怎么控制播放
详解Oracle修改字段类型方法总结
如何用wdcp快速搭建高效网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何使用Eloquent进行子查询
Python文件流缓冲机制_IO性能解析【教程】
如何在阿里云完成域名注册与建站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
python中快速进行多个字符替换的方法小结
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
WEB开发之注册页面验证码倒计时代码的实现
如何将凡科建站内容保存为本地文件?
深圳网站制作平台,深圳市做网站好的公司有哪些?
Python文件操作最佳实践_稳定性说明【指导】
如何在阿里云域名上完成建站全流程?
Laravel如何实现API版本控制_Laravel版本化API设计方案
javascript日期怎么处理_如何格式化输出
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
如何基于云服务器快速搭建网站及云盘系统?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】

