Android中Activity滑动关闭的效果

最近感觉有一个Activity关闭的效果挺不错的,就是手势滑动就可以关闭当前Activity,于是就想写一篇博客和大家一起分享下!废话不多说,老规矩,还先上效果图,更直观!

项目地址:https://github.com/xinyitiandi/SlidingFinishDemo

上代码:

1.第一个Activity:

package com.ekeguan.slidingfinishdemo;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private Button button;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
  initEventListener();
 }
 private void initView() {
  button = (Button) findViewById(R.id.button);
 }
 private void initEventListener() {
  button.setOnClickListener(this);
 }
 @Override
 public void onClick(View view) {
  switch(view.getId())
  {
   case R.id.button:
    startActivity(new Intent(MainActivity.this,SecondActivity.class));
    break;
   default:
    break;
  }
 }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.ekeguan.slidingfinishdemo.MainActivity">
 <Button
  android:id="@+id/button"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="跳转到第二个Activity"
  app:layout_constraintBottom_toBottomOf="parent"
  app:layout_constraintLeft_toLeftOf="parent"
  app:layout_constraintRight_toRightOf="parent"
  app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

2.第二个Activity,即要跳转的目标Activity

package com.ekeguan.slidingfinishdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
 private SildingFinishLayout mSildingFinishLayout;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_second);
  initView();
  initEventListener();
 }
 private void initView() {
  mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.sildingFinishLayout);
  mSildingFinishLayout.setTouchView(mSildingFinishLayout);
 }
 private void initEventListener() {
  mSildingFinishLayout
    .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
     @Override
     public void onSildingFinish() {
      finish();
     }
    });
 }
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<com.ekeguan.slidingfinishdemo.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/sildingFinishLayout"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center">
 <FrameLayout
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#f0f0f0">
  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="向右滑动关闭当前Activity"
   android:layout_gravity="center"
   android:textColor="#000"/>
 </FrameLayout>
</com.ekeguan.slidingfinishdemo.SildingFinishLayout>

注意:这里用到了一个自定义的布局SildingFinishLayout ,关于这个布局的代码,我一会在下面贴出,大家不用着急。需要注意的是想要滑动关闭的Activity的布局文件最外层要被SildingFinishLayout 布局包裹,被SildingFinishLayout 包裹的里面的布局设置背景色,如FrameLayout,我在这里设置了背景色为“#f0f0f0”,字体要设置字体颜色,如TextView,我在这里设置了“#000”

为了达到理想的效果,在AndroidMainfest.xml文件里面要给想要手势滑动的Activity添加上一个透明的主题,如:

<activity android:name=".SecondActivity"
   android:screenOrientation="portrait"
   android:theme="@style/Theme.AppCompat.Translucent"></activity>

主题:

<style name="Theme.AppCompat.Translucent">
  <item name="android:windowBackground">@android:color/transparent</item>
  <item name="android:colorBackgroundCacheHint">@null</item>
  <item name="android:windowIsTranslucent">true</item>
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>
 </style>

好了,到这里差不多了,下面贴上自定义布局SildingFinishLayout的代码:

package com.ekeguan.slidingfinishdemo;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.Scroller;
/**
 * 自定义可以滑动的RelativeLayout, 类似于IOS的滑动删除页面效果,当我们要使用
 * 此功能的时候,需要将该Activity的顶层布局设置为SildingFinishLayout,
 * 然后需要调用setTouchView()方法来设置需要滑动的View
 *
 * @author xiaanming
 *
 * @blog http://blog.csdn.net/xiaanming
 *
 */
public class SildingFinishLayout extends RelativeLayout implements
  OnTouchListener {
 /**
  * SildingFinishLayout布局的父布局
  */
 private ViewGroup mParentView;
 /**
  * 处理滑动逻辑的View
  */
 private View touchView;
 /**
  * 滑动的最小距离
  */
 private int mTouchSlop;
 /**
  * 按下点的X坐标
  */
 private int downX;
 /**
  * 按下点的Y坐标
  */
 private int downY;
 /**
  * 临时存储X坐标
  */
 private int tempX;
 /**
  * 滑动类
  */
 private Scroller mScroller;
 /**
  * SildingFinishLayout的宽度
  */
 private int viewWidth;
 /**
  * 记录是否正在滑动
  */
 private boolean isSilding;
 private OnSildingFinishListener onSildingFinishListener;
 private boolean isFinish;
 public SildingFinishLayout(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }
 public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
  mScroller = new Scroller(context);
 }
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
  super.onLayout(changed, l, t, r, b);
  if (changed) {
   // 获取SildingFinishLayout所在布局的父布局
   mParentView = (ViewGroup) this.getParent();
   viewWidth = this.getWidth();
  }
 }
 /**
  * 设置OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
  *
  * @param onSildingFinishListener
  */
 public void setOnSildingFinishListener(
   OnSildingFinishListener onSildingFinishListener) {
  this.onSildingFinishListener = onSildingFinishListener;
 }
 /**
  * 设置Touch的View
  *
  * @param touchView
  */
 public void setTouchView(View touchView) {
  this.touchView = touchView;
  touchView.setOnTouchListener(this);
 }
 public View getTouchView() {
  return touchView;
 }
 /**
  * 滚动出界面
  */
 private void scrollRight() {
  final int delta = (viewWidth + mParentView.getScrollX());
  // 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item
  mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
    Math.abs(delta));
  postInvalidate();
 }
 /**
  * 滚动到起始位置
  */
 private void scrollOrigin() {
  int delta = mParentView.getScrollX();
  mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
    Math.abs(delta));
  postInvalidate();
 }
 /**
  * touch的View是否是AbsListView, 例如ListView, GridView等其子类
  *
  * @return
  */
 private boolean isTouchOnAbsListView() {
  return touchView instanceof AbsListView ? true : false;
 }
 /**
  * touch的view是否是ScrollView或者其子类
  *
  * @return
  */
 private boolean isTouchOnScrollView() {
  return touchView instanceof ScrollView ? true : false;
 }
 @Override
 public boolean onTouch(View v, MotionEvent event) {
  switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    downX = tempX = (int) event.getRawX();
    downY = (int) event.getRawY();
    break;
   case MotionEvent.ACTION_MOVE:
    int moveX = (int) event.getRawX();
    int deltaX = tempX - moveX;
    tempX = moveX;
    if (Math.abs(moveX - downX) > mTouchSlop
      && Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
     isSilding = true;
     // 若touchView是AbsListView,
     // 则当手指滑动,取消item的点击事件,不然我们滑动也伴随着item点击事件的发生
     if (isTouchOnAbsListView()) {
      MotionEvent cancelEvent = MotionEvent.obtain(event);
      cancelEvent
        .setAction(MotionEvent.ACTION_CANCEL
          | (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
      v.onTouchEvent(cancelEvent);
     }
    }
    if (moveX - downX >= 0 && isSilding) {
     mParentView.scrollBy(deltaX, 0);
     // 屏蔽在滑动过程中ListView ScrollView等自己的滑动事件
     if (isTouchOnScrollView() || isTouchOnAbsListView()) {
      return true;
     }
    }
    break;
   case MotionEvent.ACTION_UP:
    isSilding = false;
    if (mParentView.getScrollX() <= -viewWidth / 2) {
     isFinish = true;
     scrollRight();
    } else {
     scrollOrigin();
     isFinish = false;
    }
    break;
  }
  // 假如touch的view是AbsListView或者ScrollView 我们处理完上面自己的逻辑之后
  // 再交给AbsListView, ScrollView自己处理其自己的逻辑
  if (isTouchOnScrollView() || isTouchOnAbsListView()) {
   return v.onTouchEvent(event);
  }
  // 其他的情况直接返回true
  return true;
 }
 @Override
 public void computeScroll() {
  // 调用startScroll的时候scroller.computeScrollOffset()返回true,
  if (mScroller.computeScrollOffset()) {
   mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
   postInvalidate();
   if (mScroller.isFinished()) {
    if (onSildingFinishListener != null && isFinish) {
     onSildingFinishListener.onSildingFinish();
    }
   }
  }
 }
 public interface OnSildingFinishListener {
  public void onSildingFinish();
 }
}

最后项目地址:https://github.com/xinyitiandi/SlidingFinishDemo

以上所述是小编给大家介绍的Android中Activity滑动关闭的效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

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

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

  • Android 侧滑关闭Activity的实例

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

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

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

  • 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.使用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中Activity滑动关闭的效果

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

  • Android中自定义view实现侧滑效果

    效果图: 看网上的都是两个view拼接,默认右侧的不显示,水平移动的时候把右侧的view显示出来.但是看最新版QQ上的效果不是这样的,但给人的感觉却很好,所以献丑来一发比较高仿的. 知识点: 1.ViewDragHelper 的用法: 2.滑动冲突的解决: 3.自定义viewgroup. ViewDragHelper 出来已经比较久了 相信大家都比较熟悉,不熟悉的话google一大把这里主要简单用一下它的几个方法 1.tryCaptureView(View child, int pointerI

  • Android中Activity过渡动画的实例讲解

    目录 前言 分解动画 效果视频 解析 滑动动画 效果视频 解析 淡出动画 效果视频 解析 共享元素 共享单个元素 解析 共享多个元素 效果视频 全部代码 总结 前言 以前Activty之间得跳转非常生硬,自Android.5X后,Google对Activity的切换设计更多丰富的动画效果. Android 5.X提供了三种Transition类型,具体如下: ✧进入:一个进人的过渡动画决定Activity中的所有的视图怎么进入屏幕. ✧退出:一个退出的过渡动画决定-个Activity 中的所有视

  • Android中activity处理返回结果的实现方式

    大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界面,此时的收货信息已经变为我们之前选择的收件信息. 为了实现这个功能,Android提供了一个机制,跳转到其他activity时,再返回,可以接受到其他activity返回的值,无需再start新的当前activity:下面的示例中,创建两个activity,其中在MainActivity中提示输入

  • Android中View跟随手指移动效果

    最近做了一个项目中,其中遇到这样的需求要求图片移动到手指触碰的地方.具体实现代码如下所示: package com.example.plane; import Android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.Display; import android.view.KeyEvent; import android.view.Menu; i

  • Android中Activity的四种启动模式和onNewIntent()

    写在前面 Activity是Android四大组件之一,用于直接跟用户进行交互,本篇文章将介绍Activity的启动流程.用户启动Activity的方式大致有两种:一种是在桌面点击应用程序的图标,进入应用程序的主界面:另一种是在应用程序中,进入一个新的Activity.前者,桌面其实是系统应用launcher的界面,点击应用程序图标,会进行应用程序的主界面,实质是从一个应用的Activity进入另一个应用Activity. 因此,不管是从桌面进入应用主界面,还是在应用里进入一个新的Activit

  • Android中Activity组件实例介绍

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

  • Android中Activity常用功能设置小结(包括全屏、横竖屏等)

    本文实例讲述了Android中Activity常用功能设置小结(包括全屏.横竖屏等).分享给大家供大家参考,具体如下: Activity全屏设置 方式1:AndroidManifest.xml 复制代码 代码如下: <activity android:name="myAcitivty"  android:theme="@android:style/Theme.NoTitleBar.Fullscreen" /> 方式2:代码实现 复制代码 代码如下: re

  • 理解Android中Activity的方法回调

    为什么需要方法回调? 方法回调是功能定义和功能分离的一种手段,是一种松耦合的设计思想.在JAVA中回调是通过接口来实现的.作为一种系统架构,必须要有自己的运行环境,并且要提供用户的实现接口. 下面通过实例来模拟一下Android中Activity的方法回调思想. Activity接口 复制代码 代码如下: package com.xujing.test  //定义接口  public interface Activity{      //创建时调用的方法      public void onC

随机推荐