Android 侧滑关闭Activity的实例

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 的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Android中Activity滑动关闭的效果

    最近感觉有一个Activity关闭的效果挺不错的,就是手势滑动就可以关闭当前Activity,于是就想写一篇博客和大家一起分享下!废话不多说,老规矩,还先上效果图,更直观! 项目地址:https://github.com/xinyitiandi/SlidingFinishDemo 上代码: 1.第一个Activity: package com.ekeguan.slidingfinishdemo; import android.content.Intent; import android.os.B

  • Android实现退出时关闭所有Activity的方法

    本文示例实现了Android退出时关闭所有Activity的功能,分享给大家供大家参考之用.具体方法如下: 一般来说,在Android退出时,有的Activity可能没有被关闭.为了在Android退出时关闭所有的Activity,这里给出了以下的类: //关闭Activity的类 public class CloseActivityClass{ public static List<Activity> activityList = new ArrayList<Activity>(

  • Android 关闭多个Activity的实现方法

    Android 关闭多个Activity的实现方法 总的来说有四种方法: 1.使用Application来进行关闭 public class App extends Application { private static List<Activity> lists = new ArrayList<>(); public static void addActivity(Activity activity) { lists.add(activity); } public static

  • Android利用Intent启动和关闭Activity

    一.简介 Android应用程序中一般都有多个Activity,在Activity中,通过调用StartActivity方法,并在该方法的参数中传递Intent对象,就可以实现不同Activity之间的切换和数据传递. 通过StartActivity方法传递intent对象来启动另一个Activity时,可分为两类: l 显式启动:在创建的Intent对象中明确指定启动的是哪个Activity: l 隐式启动:安卓系统根据Intent的动作和数据决定应该启动哪个Activity. 1.显式启动A

  • Android仿微信activity滑动关闭效果

    Android仿微信activity滑动关闭功能 1.利用具体利用v4包下的slidingPaneLayout实现透明的activity,代码如下: BaseActivity: public class BaseSlideCloseActivity extends AppCompatActivity implements SlidingPaneLayout.PanelSlideListener { @Override protected void onCreate(Bundle savedIns

  • Android 侧滑关闭Activity的实例

    Android 侧滑关闭Activity的实例 实现原因 其实侧滑关闭activity在网上也有大量的文章去介绍他,我也有去看,要么是代码实在太多看不下去,要么就是跑了项目没有反应的.唯一的方法还是自己随手鲁一个~,侧滑这个东西在Android中是比较少见的,iOS是最常见不过了,因为毕竟他们没有物理返回键.还有UIScrollView那些.然而我们用的最多的QQ也只是有个功能,并没有真正的滑动效果.至于微信的,我记得N久以前滑出了一个bug.也没什么印象了.估计也是极小的概率事件.于是,当初我

  • Android侧滑导航栏的实例代码

    今天学习的新内容是侧滑导航栏,我想大家肯定都比较熟悉了,因为这个效果在qq里面也有,最近一直跟室友们玩的游戏是快速让自己的头像的点赞量上千.当然我的效果跟qq是没有办法比的,因为那里面的功能是在是太强大了.下面我来展示一下我做的效果截图. 我做的界面有点丑,但是对比之前已经是有了很大的改观了.想做这样的效果的话可以ps几张比较好看的图片. 下面就是粘贴我代码的时间了. activity_main.xml <cn.edu.rjxy.activity.DragLayout xmlns:android

  • 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 多个Activity之间的传值

    下面是主Activity的代码: 开发:Activity之间的传值 - 51CTO.COM 复制代码 代码如下: package com.chaoyang.activity; import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.text.style.BulletSpan;import android.view.View;import android.wi

  • Android编程四大组件之Activity用法实例分析

    本文实例讲述了Android编程四大组件之Activity用法.分享给大家供大家参考,具体如下: 这里详细介绍如何创建Activity.生命周期.内存管理.启动模式. 创建Activity 一.定义Activity 1. 定义Activity 定义类继承Activity 2.在AndroidManifest.xml的节点中声明<activity> 显式意图创建Activity三种方式方式 //第一种方式:构造函数,代码少 Intent intent1 =new Intent(this,NewA

  • Activity配置、启动和关闭activity实例详解

    大家先看下效果图: Android为我们提供了四种应组件,分别为Activity.Service.Broadcast receivers和Content providers,这些组建也就是我们开发一个Android应用程序的基石.系统可以通过不同组建提供的切入点进入到开发的应用程序中.对用户来说不是所有的组建都是实际的切入点,但是他们之间都是相互依赖的,它们每一个作为存在的实体,扮演着特定的角色,作为独一无二的基石帮助开发者定义Android应用的行为.下面我将整理自己的Activity学习点滴

  • Android中Activity组件实例介绍

    目录 Activity 概述 启动 Activity 的两种情况 关闭 Activity 总结 Activity 概述 在 Android 应用中,提供了 4 大基本组件,分别是 Activity.Service.BroadcastReceiver 和 ContentProvider.而 Activity 是 Android 应用最常见的组件之一.Activity 的中文意思是活动.在 Android 中,Activity 代表手机或者平板电脑中的一屏,它提供了和用户交互的可视化界面.在一个 A

  • Android编程中activity的完整生命周期实例详解

    本文实例分析了Android编程中activity的完整生命周期.分享给大家供大家参考,具体如下: android中 activity有自己的生命周期,对这些知识的学习可以帮助我们在今后写程序的时候,更好的理解其中遇到的一些错误.这篇文章很长,希望不要耽误大家的时间- 今天不会涉及太多关于activity栈的东西,主要说activity自身的生命周期 区分几个概念 1 Activity 官方解释为 "An Activity is an application component that pro

随机推荐