多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > 仿微信右滑銷毀Activity

仿微信右滑銷毀Activity

來源:程序員人生   發(fā)布時間:2017-03-16 08:58:02 閱讀次數(shù):4816次

1直想自己實現(xiàn)Activity的側(cè)滑燒毀,無奈在finish activity的時候遇到了瓶頸。今天看到1個開源庫,那哥們把Activity的背景設(shè)置成了透明,這才恍然大悟。這里share1下。
效果圖
大體思路講授:

  • 1.獲得Activity的DecorView
  • 2.自定義布局,重寫onInterceptTouchEvent與onTouchEvent函數(shù)對觸摸事件進(jìn)行處理,根據(jù)手勢滑動對DecorView(內(nèi)容)進(jìn)行滑動
  • 3.根據(jù)滑動的距離判斷是燒毀當(dāng)前的Activity還是滑動恢復(fù)到原來位置

知識儲備:

  • Android事件分發(fā),請看我這篇博文
  • Activity、Window、DecorView講授,請看這里
  • Scroller詳解,請看xiaanming大神的博文

貼出核心類

public class SlidingFinishLayout extends FrameLayout {
    private Scroller mScroller;  
    private int mTouchSlop;  
    private ViewGroup parentView;  
    private int screenWidth;  

    private int last_x;  
    private int last_y;

    private int delay_x;
    private int delay_y;

    private boolean isFinish = false;

    private Activity mActivity;

    private SlidingFinishLayout.OnActivityFinishListener onActivityFinish;

    public SlidingFinishLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        mScroller = new Scroller(context);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public void attachActivity(Activity activity) {
        this.mActivity = activity;
    }

    public void detachActivity() {
        if (this.mActivity != null) {
            mActivity = null;
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        if (changed) {
            ViewGroup decor = (ViewGroup) mActivity.getWindow().getDecorView();
            mActivity.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            mActivity.getWindow().getDecorView().setBackgroundColor(Color.TRANSPARENT);
            View decorChild = decor.findViewById(android.R.id.content);
            while (decorChild.getParent() != decor) {
                decorChild = (View) decorChild.getParent();
            }
            parentView = decor;
            screenWidth = getWidth();
        }
    }


    /**
     * 進(jìn)行事件攔截
     *
     * @param ev
     * @return
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean isIntercept = false;

        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                last_x = (int) ev.getRawX();
                last_y = (int) ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int current_x = (int) ev.getRawX();
                int current_y = (int) ev.getRawY();

                delay_x = current_x - last_x;
                delay_y = current_y - last_y;
                if ((Math.abs(delay_x) / (Math.abs(delay_y) + 1) >= 2)) { //30度角的時候才開始攔截事件
                    isIntercept = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return isIntercept;
    }

    /**
     * 進(jìn)行事件處理
     *
     * @param ev
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                last_x = (int) ev.getRawX();
                last_y = (int) ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int current_x = (int) ev.getRawX();
                int current_y = (int) ev.getRawY();

                delay_x = current_x - last_x;
                delay_y = current_y - last_y;

                if (Math.abs(delay_x) > mTouchSlop) {
                    if ((Math.abs(delay_x) / (Math.abs(delay_y) + 1) >= 2)) { //30度角的時候才開始處理事件
                        parentView.scrollBy(-delay_x, 0); //開始滑動
                    } else {
                        return false;
                    }
                } else {
                    return false;
                }

                last_x = current_x;
                last_y = current_y;
                break;
            case MotionEvent.ACTION_UP:

                if (Math.abs(parentView.getScrollX()) > (screenWidth / 3)) { //如果滑動距離超越屏幕3分之1,則進(jìn)行滑動燒毀,否則恢復(fù)原位
                    scrollFinish();
                } else {
                    scrollOriginal();
                }
                break;
        }
        return true;
    }

    /**
     * 滑動燒毀
     */
    private void scrollFinish() {
        final int delta = (screenWidth + parentView.getScrollX());
        mScroller.startScroll(parentView.getScrollX(), 0, -delta + 1, 0);
        postInvalidate();
        isFinish = true;
    }

    /**
     * 恢復(fù)到原始狀態(tài)
     */
    private void scrollOriginal() {
        mScroller.startScroll(parentView.getScrollX(), 0, -parentView.getScrollX(), 0);
        postInvalidate();
        isFinish = false;
    }

    /**
     * Activity燒毀的時候通知回調(diào)
     *
     * @param onActivityFinish
     */
    public void setOnActivityFinishListener(SlidingFinishLayout.OnActivityFinishListener onActivityFinish) {
        this.onActivityFinish = onActivityFinish;
    }

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            parentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            postInvalidate();

            if (mScroller.isFinished() && isFinish) {
                onActivityFinish.onActivityFinish();
            }
        }
    }

在希望右滑燒毀的Activity中使用

public class SlideFinishActivity extends AppCompatActivity implements SlidingFinishLayout.OnActivityFinishListener {

    SlidingFinishLayout sf_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slide_finish);

        sf_test = (SlidingFinishLayout) findViewById(R.id.sf_test);
        sf_test.setOnActivityFinishListener(this); //設(shè)置燒毀的監(jiān)聽器
        sf_test.attachActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        sf_test.detachActivity();
    }

    @Override
    public void onActivityFinish() {
        finish();
    }
}

注意,該Activity的Style文件應(yīng)當(dāng)加入下面代碼才可以生效 android:windowIsTranslucent。本代碼是把Activity設(shè)置成透明狀態(tài)

收工。
項目源碼:https://github.com/WillSprint/SlideFinish

推薦1個側(cè)滑庫,本博客中的1些思想來源于該作者
https://github.com/Jude95/SwipeBackHelper

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日韩精品亚洲人成在线观看 | 国产美女福利视频福利 | 成人精品免费视频 | 能在线观看的一区二区三区 | 亚洲精品自拍视频 | 欧美大胆色图 | 日本高清www视频在线观看 | 欧美一区二区三区视频在线观看 | 琪琪在线影院 | h在线观看免费 | 三浦惠理子中文字幕在线一区二区 | 男人懂得成a人v网站 | 日本xxxx护士hd | 无遮挡很爽很污很黄很色的网站 | 国产精品亚洲欧美日韩久久 | www.99爱 | 免费午夜不卡毛片 | 久久精品综合 | 欧美日韩亚洲国产 | www.av网址| 国产三级中文字幕 | 精品久久久久久久一区二区手机版 | 久久精品国产一区二区三区不卡 | 黄色免费网址大全 | 欧美人与性另类 | 精品一区二区三区亚洲 | 日产日韩亚洲欧美综合搜索 | 99heicom视频 | 欧美jizz18性欧美年轻 | 欧美笫一页 | 男人边吃奶边玩下面舒服 | 亚洲最大免费视频网 | 91久久综合九色综合欧美亚洲 | 国产视频一二三区 | 纯欧美一级毛片_免费 | 狼人天堂网 | 激情爽毛片私人影院 | 亚洲欧美一区二区视频 | 亚洲欧美天堂网 | 国产精品国产午夜免费福利看 | julia一区二区三区中文字幕 |