日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 仿微信右滑銷毀Activity

仿微信右滑銷毀Activity

來源:程序員人生   發布時間:2017-03-16 08:58:02 閱讀次數:4828次

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

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

知識儲備:

  • Android事件分發,請看我這篇博文
  • 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();
        }
    }


    /**
     * 進行事件攔截
     *
     * @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;
    }

    /**
     * 進行事件處理
     *
     * @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,則進行滑動燒毀,否則恢復原位
                    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;
    }

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

    /**
     * Activity燒毀的時候通知回調
     *
     * @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); //設置燒毀的監聽器
        sf_test.attachActivity(this);
    }

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

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

注意,該Activity的Style文件應當加入下面代碼才可以生效 android:windowIsTranslucent。本代碼是把Activity設置成透明狀態

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

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 免费黄色网页 | 亚洲一区久久久 | 91香蕉视频导航 | 欧美日韩一卡二卡 | 91精品久久久久久久久 | 黄色大片网 | 成人自拍视频在线 | 天天操天天碰 | 成人久久网站 | 婷婷99狠狠躁天天躁中文字幕 | 人人插人人爽 | 成人久久视频 | 国产欧美久久一区二区三区 | 欧美日韩三区 | 99久久99久久精品免费看蜜桃 | 欧美日韩在线一区二区 | 精品福利一区二区三区 | 福利片免费观看 | 欧美一区二区三区四区五区 | 91精品一区二区三区久久久久 | 成人做爰高潮免费视频 | 欧美一a一片一级一片 | 亚洲一区二区综合 | 成人精品免费视频 | 日韩2区| 亚洲成人精选 | 国产三级久久久 | 免费观看成人 | 91大神福利视频 | 国内精品久久久久久 | 欧美日韩亚洲视频 | 午夜av免费观看 | 久久国产亚洲 | 国产成人精品亚洲777人妖 | 五月综合激情 | 亚洲综合大片69999 | 欧美色资源 | 亚洲国产精品久久久久久 | 一区二区三区免费 | 久久影视一区 | 亚洲不卡电影 |