栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

public class SildingFinishLayout extends RelativeLayout implements View.onTouchListener {
  
  private ViewGroup mParentView;
  
  private View touchView;
  
  private int mTouchSlop;
  
  private int downX;
  
  private int downY;
  
  private int tempX;
  
  private Scroller mScroller;
  
  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();
    }
  }


  
  public void setonSildingFinishListener(
      onSildingFinishListener onSildingFinishListener) {
    this.onSildingFinishListener = onSildingFinishListener;
  }


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


  
  private boolean isTouchonAbsListView() {
    return touchView instanceof AbsListView ? true : false;
  }


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

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中中增加


  true
  true
  @android:color/transparent

2 acvitiy 的属性中加上

android:theme="@style/AppTheme" 

3 一些属性的详解

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/153671.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号