使用
mFinishLayout.setOnSildingFinishListener(new SildingFinishLayout.OnSildingFinishListener() {
@Override
public void onSildingFinish() {
startActivity(new Intent(ScreenActivity.this, MainActivity.class));
finish();
}
});
mFinishLayout.setOnSildingRightFinishListener(new SildingFinishLayout.OnSildingRigthFinishListener() {
@Override
public void onSildingRightFinish() {

finish();
}
});
自定义布局
package com.androapplite.kuaiya.battermanager.view;

/**
* Created by thinkpad on 2016/5/9.
*/
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.Scroller;

/**
* 自定义可以滑动的RelativeLayout, 类似于IOS的滑动删除页面效果,当我们要使用
* 此功能的时候,需要将该Activity的顶层布局设置为SildingFinishLayout
*
* @author caokai 2016-5-9
*/
public class SildingFinishLayout extends RelativeLayout{
/**
* SildingFinishLayout布局的父布局
*/
private ViewGroup mParentView;
/**
* 滑动的最小距离
*/
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 OnSildingRigthFinishListener onSildingRightFinishListener;
private boolean isFinish;
private boolean isRigthFinsh;


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
public boolean onInterceptTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = tempX = (int) ev.getRawX();
downY = (int) ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int moveX = (int) ev.getRawX();
//满足此条件屏蔽SildingFinishLayout里面子类的touch事件
if (Math.abs(moveX - downX) > mTouchSlop
&& Math.abs((int) ev.getRawY() - downY) < mTouchSlop) {
return true;
}
break;
}

return super.onInterceptTouchEvent(ev);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
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;
}

if (isSilding) {
mParentView.scrollBy(deltaX, 0);
}
break;
case MotionEvent.ACTION_UP:
isSilding = false;
if (mParentView.getScrollX() <= -viewWidth / 3) {
isFinish = false;
isRigthFinsh=true;
scrollRight();

} else if(mParentView.getScrollX()>=viewWidth / 3){
isFinish = true;
scrollLeft();
}else {
scrollOrigin();
isFinish = false;
}
break;
}

return true;
}



@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;
}

public void setOnSildingRightFinishListener(
OnSildingRigthFinishListener onSildingFinishListener) {
this.onSildingRightFinishListener = onSildingFinishListener;
}



/**
* 向左滚出界面
* */
private void scrollLeft(){
final int delta = (viewWidth - mParentView.getScrollX());
// 调用startScroll方法来设置一些滚动的参数,我们在computeScroll()方法中调用scrollTo来滚动item
mScroller.startScroll(mParentView.getScrollX(), 0, delta-1, 0,
Math.abs(delta));
postInvalidate();
}
/**
* 滚动出界面
*/
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();
}


@Override
public void computeScroll() {
// 调用startScroll的时候scroller.computeScrollOffset()返回true,


if (mScroller.computeScrollOffset()) {
mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();



if (mScroller.isFinished() && isFinish) {

if (onSildingFinishListener != null) {
onSildingFinishListener.onSildingFinish();
}else{
//没有设置OnSildingFinishListener,让其滚动到其实位置
scrollOrigin();
isFinish = false;
}
}

if(mScroller.isFinished() &&isRigthFinsh){
onSildingRightFinishListener.onSildingRightFinish();
isFinish=false;

}

}
}
public interface OnSildingFinishListener {
public void onSildingFinish();
}
public interface OnSildingRigthFinishListener {
public void onSildingRightFinish();
}


}





<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<com.androapplite.kuaiya.battermanager.view.SildingFinishLayout
android:id="@+id/sildingFinishLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
可以清单文件 这么写

<activity
android:name=".activity.ScreenActivity"
android:theme="@style/FullScreenTheme"
android:alwaysRetainTaskState="true"
android:excludeFromRecents="true"
android:launchMode="singleInstance" />

<style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>



这个布局有一个bug 如果新画的布局超过本布局 会导致该布局被系统裁剪掉












可以在住这个布局下加上这么一句话解决这个bug
android:clipChildren="false"








<style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>

android:clipChildren="false"