Android 左划返回控件SildingFinishLayout

    xiaoxiao2021-03-25  112

    首先要将activity设为透明背景 style: @android:color/transparent true @null <activity android:name=".Main2Activity" android:theme="@style/AppTheme.TransparentActivity" > </activity> SildingFinishLayout控件: /** * Created by Administrator on 2017/3/8. */ public class SildingFinishLayout extends LinearLayout implements View.OnTouchListener{ /** * SildingFinishLayout布局的父布局 */ private ViewGroup mParentView; /** * 滑动的最小距离 */ private int mTouchSlop; /** * 按下点的X坐标 */ private int downX; /** * 临时存储X坐标 */ private int tempX; /** * 按下点的Y坐标 */ private int downY; /** * 滑动类 */ private Scroller mScroller; /** * SildingFinishLayout的宽度 */ private int viewWidth; /** * 记录是否正在滑动 */ private boolean isSilding; /** * 处理滑动逻辑的View */ private View touchView; //private OnSildingFinishListener onSildingFinishListener; private boolean isFinish; private int dustion=0; private OnSildingFinishListener onSildingFinishListener; public SildingFinishLayout(Context context) { this(context,null); } public SildingFinishLayout(Context context, AttributeSet attrs) { this(context, attrs,0); } public SildingFinishLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //获取滑动的最小距离 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){ //获取父布局 mParentView = (ViewGroup) this.getParent(); viewWidth = mParentView.getWidth(); } } /** * 设置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) { Log.d("ke","touch"); switch (event.getAction()){ case MotionEvent.ACTION_DOWN: downX = tempX = (int) event.getX(); downY = (int) event.getY(); dustion = 0; break; case MotionEvent.ACTION_MOVE: int moveX = (int)event.getX(); int deltaX = tempX - moveX; dustion +=deltaX; tempX = moveX; if (Math.abs(moveX - downX) > mTouchSlop && Math.abs((int) event.getY() - downY) < mTouchSlop) isSilding = true; Log.d("ke",deltaX+" "+mTouchSlop+" "+isSilding); // 若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 (Math.abs(moveX - downX) >= 0 && isSilding) { Log.d("kes",mParentView.getScrollX()+"scroll++:"+dustion); // mParentView.scrollBy(deltaX, 0); if((mParentView.getScrollX()+dustion)<0) { mScroller.startScroll(mParentView.getScrollX(), 0, dustion, 0, Math.abs(deltaX)); postInvalidate(); } // 屏蔽在滑动过程中ListView ScrollView等自己的滑动事件 if (isTouchOnScrollView() || isTouchOnAbsListView()) { return true; } } break; case MotionEvent.ACTION_UP: isSilding = false; if (mParentView.getScrollX() <= -viewWidth / 4) { isFinish = true; scrollRight(); } else { scrollOrigin(); isFinish = false; } break; } 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 void setOnSildingFinishListener(OnSildingFinishListener mOnSildingFinishListener){ this.onSildingFinishListener = mOnSildingFinishListener; } public interface OnSildingFinishListener { public void onSildingFinish(); } } @android:color/transparent true @null
    转载请注明原文地址: https://ju.6miu.com/read-5889.html

    最新回复(0)