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布局,非常简单:

<yifeiyuan.practice.practicedemos.drager.SwipeBackFrameLayout
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">
 <TextView
  android:layout_width="40dp"
  android:layout_height="match_parent"
  android:text="@string/hello_world"
  android:gravity="center"
  android:background="#ffff00"
  />
 <View
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#ff00ff"
  />
</yifeiyuan.practice.practicedemos.drager.SwipeBackFrameLayout>

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
<alpha
android:duration="300"
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="1.0"
></alpha>

//out_to_right
<translate
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fromXDelta="0%"
android:toXDelta="100%"
></translate>

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行代码实现滑动返回效果的代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Android仿考拉全局滑动返回及联动效果的实现方法

    前言 首次通过右滑来返回到上一个页面的操作是在 IOS7上出现.到目前android应用上支持这种操作的依然不多.分析其主要原因应该是android已有实体的返回按键,这样的功能变得不重要,但我觉得有这样的功能便于单手操作,能提升app的用户体验,特别是从ios转到android的用户.写这篇博文希望可以对大家有所帮助,希望自己的app上有滑动返回功能的可以参考下. 原理的简单描述 Android系统里有很多滑动相关的API和类,比如ViewDragHelper就是一个很好的滑动助手类.首先设置

  • Android使用SlidingPaneLayout 实现仿微信的滑动返回

    上周,公司的项目改版要求加上一个右滑返回上一个界面,于是就在网上找了一些开源库打算实现.但是在使用的时候遇见了许多的问题.试了两天用过 https://github.com/ikew0ng/SwipeBackLayout , https://github.com/r0adkll/Slidr 等库都没成功. 然后在//www.jb51.net/article/138869.htm看见了使用SlidingPaneLayout 来实现的一个滑动返回案例然后就看了看发现不错于是就使用了这个. 虽然上面链

  • Android 滑动返回Activity的实现代码

    Android 滑动返回Activity的实现代码 近来玩微信的时候偶然发现,向左滑动朋友圈竟然可以返回主页,故引起兴趣特研究 代码很简洁 package com.example.wyj.cainiaoshopping.activity; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import com.

  • Android开发之使用150行代码实现滑动返回效果

    今天带大家实现滑动返回效果.,具体内容如下所示: 先看看效果图: 因为没有具体内容,也没有简书的图片资源,所以稍微简陋了点. 但是依然不妨碍我们的效果展示~ OK,接下来惯例,通过阅读本文你能学习到: ViewDragHelper的使用(如果你想学习自定义View,那么ViewDragHelper你绝对不能错过) 好像也没有什么了.... 这个效果,难度不大,会ViewDragHelper的同学应该10分钟就能写出来了吧~ 如果不会也没关系~ 1. 我们自定义一个SwipeBackFrameLa

  • Android开发之使用ViewPager实现图片左右滑动切换效果

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • jquery仅用6行代码实现滑动门效果

    本文实例讲述了jquery仅用6行代码实现滑动门效果.分享给大家供大家参考.具体如下: 这是一个基于jQuery的滑动门导航栏,仅6行代码,不知还有没有比此更少的代码了,在滑动门的实现过程中,用背景图片修饰了每个"门"的背景,更美观漂亮,有着极好的用户操作体验. 运行效果如下图所示: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-simple-nav-menu-style-codes/ 具体代码如下: <!DOCTYPE html P

  • Android开发仿IOS滑动开关实现代码

    Android开发仿IOS滑动开关实现代码 Android与iOS相比,ios好多控件都是自带的,而android需要使用自定义来实现.今天说的是ios的滑动开关,我层看到好多博客都是通过自定义ToggleButton实现的.这里我通过自定义view来实现他的效果. 首先在onsizechange里把2个半圆和一个矩形绘制出来. width = w; height = h; left = top = 0; right = width; bottom = height * 0.8f; cx = (

  • 150行代码带你实现微信小程序中的数据侦听

    在小程序项目中, 我们的通常会使用到使用到一个全局对象作为各个页面通用的数据存储容器, 将它绑定到app对象后, 就能在每一个页面都自由的操纵这个对象. 然而在实践中, 由于这个对象及其属性不具备响应式条件, 它不能直接参与业务逻辑的编写, 能力仅仅局限于数据储存. 若是在VueJS项目中, 我们可能经常使用到 Vue.$watch 去侦听某个数据是否发生变化, 小程序却缺乏这种能力. 在这篇文章中, 我将用150行代码, 手把手带你打造一个小程序也可以使用的侦听器(下简称VX): // 一个快

  • Android开发在RecyclerView上面实现"拖放"和"滑动删除"-2

    上篇给大家介绍了Android一步步带你在RecyclerView上面实现"拖放"和"滑动删除"功能 效果如下: 拖动手柄 在设计一个支持"拖放"的列表时, 通常提供一个在触摸时初始化拖拽的"拖动手柄". 因其可发现性和可用性而被Material Guidelines所推荐, 尤其是列表处于"可编辑模式"时. 首先更新item的布局(item_main.xml): <FrameLayout xmlns

  • Android开发之模仿微信打开网页的进度条效果(高仿)

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是实现方法都是一样的,而且,都忽略了微信加载网页时,进度条的缓慢动画效果,它不是生硬地一滑而过,而是用户体验很好,有个速度的变化,由慢到快的效果,语言难于描述,相信各位都有下载微信,可以随便打开个公众号的文章看看效果. 好了,上面说到,之前网上的方法都是都忽略了微信加载网页时,进度条的缓慢动画效果,实现代码也是

  • Android开发在RecyclerView上面实现"拖放"和"滑动删除"-2

    上篇给大家介绍了Android一步步带你在RecyclerView上面实现"拖放"和"滑动删除"功能 效果如下: 拖动手柄 在设计一个支持"拖放"的列表时, 通常提供一个在触摸时初始化拖拽的"拖动手柄". 因其可发现性和可用性而被Material Guidelines所推荐, 尤其是列表处于"可编辑模式"时. 首先更新item的布局(item_main.xml): <FrameLayout xmlns

  • Android开发中RecyclerView模仿探探左右滑动布局功能

    我在此基础上优化了部分代码, 添加了滑动回调, 可自定义性更强. 并且添加了点击按钮左右滑动的功能. 据说无图都不敢发文章了. 看图: 1:这种功能, 首先需要自己管理布局 继承 RecyclerView.LayoutManager , 显示自己管理布局, 比如最多显示4个view, 并且都是居中显示. 底部的View还需要进行缩放,平移操作. public class OverLayCardLayoutManager extends RecyclerView.LayoutManager { p

  • Android开发实现的圆角按钮、文字阴影按钮效果示例

    本文实例讲述了Android开发实现的圆角按钮.文字阴影按钮效果.分享给大家供大家参考,具体如下: 效果图: 如果要实现圆角图片,并变色须在drawable中配置背景文件如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item andro

随机推荐