左右滑动的布局

使用    
    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"







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值