热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android中Activity滑动关闭的效果

这篇文章主要介绍了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;
  }
 }
}

布局文件:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

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();
     }
    });
 }
}

布局文件:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

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

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

主题:


好了,到这里差不多了,下面贴上自定义布局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 &#63; true : false;
 }
 /**
  * touch的view是否是ScrollView或者其子类
  *
  * @return
  */
 private boolean isTouchOnScrollView() {
  return touchView instanceof ScrollView &#63; 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) = 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滑动关闭的效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


推荐阅读
  • Flutter 开发中集成极光推送的详细步骤
    本文详细介绍了如何在 Flutter 项目中集成极光推送服务,包括配置和测试的具体步骤。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文详细介绍了如何在 Android 应用中获取系统的版本号,包括具体的应用场景和实现步骤。 ... [详细]
  • 本文介绍了如何使用 CMD 批处理脚本进行文件操作,包括将指定目录下的 PHP 文件重命名为 HTML 文件,并将这些文件复制到另一个目录。 ... [详细]
  • 本文详细介绍了DMA控制器如何通过映射表处理来自外设的请求,包括映射表的设计和实现方法。 ... [详细]
  • Spark中使用map或flatMap将DataSet[A]转换为DataSet[B]时Schema变为Binary的问题及解决方案
    本文探讨了在使用Spark的map或flatMap算子将一个数据集转换为另一个数据集时,遇到的Schema变为Binary的问题,并提供了详细的解决方案。 ... [详细]
  • 基于Web的Kafka管理工具Kafkamanager首次访问Web界面的详细配置指南(附图解)
    首次访问Kafkamanager Web界面时,需要对Kafka集群进行配置。这一过程相对简单,用户只需依次点击【Cluster】>【Add Cluster】,按照提示完成相关设置即可。本文将通过图文并茂的方式,详细介绍每一步的配置步骤,帮助用户快速上手Kafkamanager。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
author-avatar
孙一诺她爹_480
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有