android 用代码模拟滑动,Android开发之使用150行代码实现滑动返回效果
今天带大家实现滑动返回效果.,具体内容如下所示:
先看看效果图:
因为没有具体内容,也没有简书的图片资源,所以稍微简陋了点.
但是依然不妨碍我们的效果展示~
OK,接下来惯例,通过阅读本文你能学习到:
ViewDragHelper的使用(如果你想学习自定义View,那么ViewDragHelper你绝对不能错过)
好像也没有什么了....
这个效果,难度不大,会ViewDragHelper的同学应该10分钟就能写出来了吧~
如果不会也没关系~
1. 我们自定义一个SwipeBackFrameLayout继承自FrameLayout
1.1 因为看到左边黄色的View是被遮住的,而另外一个View的宽度是MatchParent的,所以FrameLayout是不错的选择.
顺便增加一个回调,通知activity去finish
public void setCallback(Callback mCallback){
this.mCallback = mCallback;
}
private Callback mCallback;
public interface Callback{
void onShouldFinish();
}
1.2 Xml布局,非常简单:
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/swipe_back"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="yifeiyuan.practice.practicedemos.drager.SwipeBackActivity">
android:layout_width="40dp"
android:layout_height="match_parent"
android:text="@string/hello_world"
android:gravity="center"
android:background="#ffff00"
/>
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff00ff"
/>
1.3 实例化一个ViewDragHelper
//1f代表灵敏度
mDragHelper = ViewDragHelper.create(this, 1f,new ViewDragHelper.Callback() {
@Override
public boolean tryCaptureView(View child, int pointerId) {
return false;
}
}
//因为我们是从左向右滑动 所以设置EDGE_LEFT
mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
1.4 在SwipeBackFrameLayout里实例化xml里的子View
private View mDividerView;
private View mContentView;
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mDividerView = getChildAt(0);
mDividerView.setAlpha(0f);
mContentView = getChildAt(1);
}
1.5 让ViewDragHelper处理touch事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mDragHelper.processTouchEvent(event);
return true;
}
1.6重写ViewDragHelper的一些处理方法
已附上详细注释
@Override
public void onEdgeTouched(int edgeFlags, int pointerId) {
super.onEdgeTouched(edgeFlags, pointerId);
//触摸到左边界的时候 我们capture住mContentView
mDragHelper.captureChildView(mContentView, pointerId);
}
@Override
public int getViewHorizontalDragRange(View child) {
return 1;
}
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
super.onViewPositionChanged(changedView, left, top, dx, dy);
Log.d(TAG, "onViewPositionChanged() called with left = [" + left + "], top = [" + top + "], dx = [" + dx + "], dy = [" + dy + "]");
//0.0 - 1.0
//Notice 这边可以给个接口回调出去,就可以做各种炫酷的效果了
float alpha = (float) (left*1.0/mDividerWidth);
mDividerView.setAlpha(alpha);
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
// Log.d(TAG, "clampViewPositionHorizontal() called with dx = [" + dx + "]");
// 计算left 我们的目标范围是0-dividerwidth的宽度
mLastdx = dx;
int newLeft = Math.min(mDividerWidth, Math.max(left,0));
return newLeft;
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
//>0代表用户想关闭
if (mLastdx>0){
// 还不到关闭条件,我们让view滑动过去,再关闭
if (mDividerWidth != releasedChild.getLeft()) {
mDragHelper.settleCapturedViewAt(mDividerWidth,releasedChild.getTop();
invalidate();
} else {
if (mCallback != null) {
mCallback.onShouldFinish();
}
}
}else{
//用户不想关闭 ,则滑动到最左边
if (mDividerWidth != 0) {
mDragHelper.settleCapturedViewAt(0, releasedChild.getTop());
invalidate();
}
}
}
@Override
public void onViewDragStateChanged(int state) {
super.onViewDragStateChanged(state);
//滑动停止,并且到达了滑动的判断条件 则回调关闭
if(mDragHelper.getViewDragState()==ViewDragHelper.STATE_IDLE&&mCallback != null&&mDividerWidth==mContentView.getLeft()&&mLastdx>0) {
mCallback.onShouldFinish();
}
}
});
1.7 增加对view滑动事件处理,对于以上mDividerWidth我们在onLayout里获取
private int mDividerWidth;
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mDividerWidth = mDividerView.getWidth();
}
//Notice view 刚初始化的时候就会被调用一次
@Override
public void computeScroll() {
super.computeScroll();
// Log.d(TAG, "computeScroll() called with " + "");
if (mDragHelper.continueSettling(true)) {
invalidate();
}
}
我们写完自定义view后还需要自定义一下activity的退出动画~
2.定义activity的finish动画
2.1 在anim目录下,创建两个动画xml:
//no_anim
android:duration="300"
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="1.0"
>
//out_to_right
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromXDelta="0%"
android:toXDelta="100%"
>
2.2 在activity里设置callback监听,并运用动画
mSwipeBack.setCallback(new SwipeBackFrameLayout.Callback() {
@Override
public void onShouldFinish() {
finish();
overridePendingTransition(R.anim.no_anim, R.anim.out_to_right);
}
});
好了!!代码量非常少!就是这么简单~
吐槽一下,简书对代码块的支持太差了,代码复制过来全是乱的!!
同学们还是去看源码吧:
源码在我的Github上
总结
以上所述是小编给大家介绍的教你150行代码实现滑动返回效果的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
android 用代码模拟滑动,Android开发之使用150行代码实现滑动返回效果相关推荐
- hash签名 java_java开发区块链只需150行代码
原标题:java开发区块链只需150行代码 本文帮助你理解什么是区块链.将通过java开发区块链的实战学习方式,用 Java创建开发一个基本的区块链,实现简单的工作量证明系统.Java开发区块链的源代 ...
- 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协议丨C/C++Linux服务器开发
[线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码 视频讲解如下,点击观看: [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协 ...
- 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码
[线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码 视频讲解如下,点击观看: [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协 ...
- C++ 中的多线程的使用和线程池建设。150行代码,手写线程池
C++ 11 引入了 std::thread 标准库,方便了多线程相关的开发工作. 说到多线程开发,可不仅仅是创建一个新线程就好了,不可避免的要涉及到线程同步的问题. 而保证线程同步,实现线程安全,就 ...
- c语言求婚代码大全,继“代码求救”后,程序员用40行代码求婚成功!
原标题:继"代码求救"后,程序员用40行代码求婚成功! 前段时间,程序员又火了一把. 一名程序员掉入传销组织用代码向同事求救,同事秒懂,程序员被成功救出.大家都为程序员的机智点赞, ...
- Android 仿今日头条的视频播放控件(几行代码快速实现)
前段时间由于项目需要用到类似于今日头条的视频播放器,实现在线播放,边缓存边播放,当然也可以播放本地文件,如下图: 这里我推荐大家使用的是jiecaovideoplayer开源库,这个库的播放引擎是ij ...
- java开发区块链只需150行代码
本文目的是通过java实战开发教程理解区块链是什么.将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等.这个基本的java区块链也实现简单的工作量证明系统. ...
- 团队代码规范java,java 开发,适用于团队的代码规范及某些约定
包含 api 开发原则.代码风格.mapper 扩展等. api 开发总则遵循单一职责原则,一个类只做一件(类)事. 数据库表与业务类是 1:N 的关系. 简单业务表建议只有一个业务类,复杂业务表,建 ...
- vrml行走和静止的人代码_CAE二次开发的核心不是代码
作者:朱淑强来源:误入CAE的程序员微信公众号(itincae)文末试看<轮胎建模仿真与模态轮胎的生成>课程 所谓的有限元软件的二次开发工作,绝大部分指的是前后处理的二次开发,基本不涉及求 ...
最新文章
- Qt中使用线程的几种方式及区别
- java环境配置常用链接
- 前端使用react-intl-universal进行国际化
- 前端学习(2624):state
- php只能用浏览器触发吗,PHP只允许某个域名或者URL访问调用不允许浏览器直接执行的方法...
- appium自动化测试(5)-一些pyhon操作
- java no provider for_No provider available for the service com.alibaba.
- jQuery EasyUI 下拉菜单获取日期,最高年份为当前年份,最低年份为当前年份向前推10年...
- Java ME SDK 3.0.5发布!
- linux安装五笔输入法centos,CentOS 7系统怎么安装极点五笔输入法?
- PHP调用京东联盟接口以及配置签名
- Effient技术原理
- 【烈日炎炎战后端 】MyBatis(0.4万字)
- 小程序滑动点击切换中间大图两边小图
- ASP.NET文件后缀名
- html转图片 workflow,用 Workflow + Day one 给未来的自己做时间履历 | Matrix 精选
- 两个led并联和一个电阻串联两个灯不能同时亮问题
- 一般可行性研究报告的主要内容和要求
- javaScript函数和方法的区别
- 【容易打工网】办公室礼仪 职场生存十八定律
热门文章
- 大数据分析的重要性体现在哪里
- 大数据分析应用在哪些方面上
- 物联网卡得持续增长对企业带来怎样的挑战
- dwz怎么使用数据加载中提示_SOLIDWORKS在使用中提示内存不足怎么办?
- 叠螺机_叠螺机如何实现全自动喷淋维护
- python版本控制git_实验一:Git代码版本管理
- virbox protector 为软件设置有效期_条码软件如何打印UCC-128条形码
- 提高mysql性能_提升MySQL性能值得借鉴的几个简易方法
- 读写自旋锁 linux,boost是否像Linux一样提供读写自旋锁机制?
- leetcode 21 java_LeetCode 21. 合并两个有序链表