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

Android实现左滑退出Activity的完美封装

这篇文章主要介绍了Android实现左滑退出Activity的完美封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1:定义一个自己的父级容器,让它继承自一个布局(LinearLayout、RelativeLayout都可以)

public class SildingFinishLayout extends RelativeLayout implements View.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) = 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();
  }
}

2.Acitity

在Activity的onCreate()方法里面  

 @Override
  public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
    super.onCreate(savedInstanceState, persistentState);
    SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.timed_task_SildingFinishLayout);
mSildingFinishLayout
    mSildingFinishLayout .setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
      @Override
      public void onSildingFinish() {
        finish();
      }
    });
    mSildingFinishLayout .setTouchView(mSildingFinishLayout);//绑定底层的布局就可以了 :不起作用的话换个你activity 布局里面view就可以啦 
  }

截止目前,这个功能已经实现了

解决问题:这个会出现左滑 背景白色问题

1.style.xml中中增加


2 acvitiy 的属性中加上

android:theme="@style/AppTheme" 

3 一些属性的详解

@null :Dialog的windowFrame框为无
true:是否浮现在activity之上
false:是否半透明
true:是否显示title
@drawable/dia_bg:设置dialog的背景
false: 背景是否透明显示

到此这篇关于Android实现左滑退出Activity的完美封装的文章就介绍到这了,更多相关Android 左滑退出Activity内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
author-avatar
手机用户2602896463
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有