今天带大家实现滑动返回效果.,具体内容如下所示:

先看看效果图:

因为没有具体内容,也没有简书的图片资源,所以稍微简陋了点.

但是依然不妨碍我们的效果展示~

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行代码实现滑动返回效果相关推荐

  1. hash签名 java_java开发区块链只需150行代码

    原标题:java开发区块链只需150行代码 本文帮助你理解什么是区块链.将通过java开发区块链的实战学习方式,用 Java创建开发一个基本的区块链,实现简单的工作量证明系统.Java开发区块链的源代 ...

  2. 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协议丨C/C++Linux服务器开发

    [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码 视频讲解如下,点击观看: [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协 ...

  3. 【线程池】自行准备linux环境,带你手写线程池,只需仅仅150行代码

    [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码 视频讲解如下,点击观看: [线程池]自行准备linux环境,带你手写线程池,只需仅仅150行代码|内存池|API|连接池|应用协 ...

  4. C++ 中的多线程的使用和线程池建设。150行代码,手写线程池

    C++ 11 引入了 std::thread 标准库,方便了多线程相关的开发工作. 说到多线程开发,可不仅仅是创建一个新线程就好了,不可避免的要涉及到线程同步的问题. 而保证线程同步,实现线程安全,就 ...

  5. c语言求婚代码大全,继“代码求救”后,程序员用40行代码求婚成功!

    原标题:继"代码求救"后,程序员用40行代码求婚成功! 前段时间,程序员又火了一把. 一名程序员掉入传销组织用代码向同事求救,同事秒懂,程序员被成功救出.大家都为程序员的机智点赞, ...

  6. Android 仿今日头条的视频播放控件(几行代码快速实现)

    前段时间由于项目需要用到类似于今日头条的视频播放器,实现在线播放,边缓存边播放,当然也可以播放本地文件,如下图: 这里我推荐大家使用的是jiecaovideoplayer开源库,这个库的播放引擎是ij ...

  7. java开发区块链只需150行代码

    本文目的是通过java实战开发教程理解区块链是什么.将通过实战入门学习,用Java自学开发一个很基本的区块链,并在此基础上能扩展如web框架应用等.这个基本的java区块链也实现简单的工作量证明系统. ...

  8. 团队代码规范java,java 开发,适用于团队的代码规范及某些约定

    包含 api 开发原则.代码风格.mapper 扩展等. api 开发总则遵循单一职责原则,一个类只做一件(类)事. 数据库表与业务类是 1:N 的关系. 简单业务表建议只有一个业务类,复杂业务表,建 ...

  9. vrml行走和静止的人代码_CAE二次开发的核心不是代码

    作者:朱淑强来源:误入CAE的程序员微信公众号(itincae)文末试看<轮胎建模仿真与模态轮胎的生成>课程 所谓的有限元软件的二次开发工作,绝大部分指的是前后处理的二次开发,基本不涉及求 ...

最新文章

  1. Qt中使用线程的几种方式及区别
  2. java环境配置常用链接
  3. 前端使用react-intl-universal进行国际化
  4. 前端学习(2624):state
  5. php只能用浏览器触发吗,PHP只允许某个域名或者URL访问调用不允许浏览器直接执行的方法...
  6. appium自动化测试(5)-一些pyhon操作
  7. java no provider for_No provider available for the service com.alibaba.
  8. jQuery EasyUI 下拉菜单获取日期,最高年份为当前年份,最低年份为当前年份向前推10年...
  9. Java ME SDK 3.0.5发布!
  10. linux安装五笔输入法centos,CentOS 7系统怎么安装极点五笔输入法?
  11. PHP调用京东联盟接口以及配置签名
  12. Effient技术原理
  13. 【烈日炎炎战后端 】MyBatis(0.4万字)
  14. 小程序滑动点击切换中间大图两边小图
  15. ASP.NET文件后缀名
  16. html转图片 workflow,用 Workflow + Day one 给未来的自己做时间履历 | Matrix 精选
  17. 两个led并联和一个电阻串联两个灯不能同时亮问题
  18. 一般可行性研究报告的主要内容和要求
  19. javaScript函数和方法的区别
  20. 【容易打工网】办公室礼仪 职场生存十八定律

热门文章

  1. 大数据分析的重要性体现在哪里
  2. 大数据分析应用在哪些方面上
  3. 物联网卡得持续增长对企业带来怎样的挑战
  4. dwz怎么使用数据加载中提示_SOLIDWORKS在使用中提示内存不足怎么办?
  5. 叠螺机_叠螺机如何实现全自动喷淋维护
  6. python版本控制git_实验一:Git代码版本管理
  7. virbox protector 为软件设置有效期_条码软件如何打印UCC-128条形码
  8. 提高mysql性能_提升MySQL性能值得借鉴的几个简易方法
  9. 读写自旋锁 linux,boost是否像Linux一样提供读写自旋锁机制?
  10. leetcode 21 java_LeetCode 21. 合并两个有序链表