国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android 側(cè)滑關(guān)閉Activity的實(shí)例

2019-10-22 18:31:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Android 側(cè)滑關(guān)閉Activity的實(shí)例

實(shí)現(xiàn)原因

其實(shí)側(cè)滑關(guān)閉activity在網(wǎng)上也有大量的文章去介紹他,我也有去看,要么是代碼實(shí)在太多看不下去,要么就是跑了項(xiàng)目沒(méi)有反應(yīng)的。唯一的方法還是自己隨手魯一個(gè)~,側(cè)滑這個(gè)東西在A(yíng)ndroid中是比較少見(jiàn)的,iOS是最常見(jiàn)不過(guò)了,因?yàn)楫吘顾麄儧](méi)有物理返回鍵。還有UIScrollView那些。然而我們用的最多的QQ也只是有個(gè)功能,并沒(méi)有真正的滑動(dòng)效果。至于微信的,我記得N久以前滑出了一個(gè)bug。也沒(méi)什么印象了。估計(jì)也是極小的概率事件。于是,當(dāng)初我就強(qiáng)行的魯了一個(gè)。下面我們一步步分析實(shí)現(xiàn)的思路以及代碼。

百行代碼解決側(cè)滑關(guān)閉

首先來(lái)看下我們一些簡(jiǎn)單的定義:

private Activity activity;  private Scroller scroller;  //上次ACTION_MOVE時(shí)的X坐標(biāo)  private int last_X;  //屏幕寬度  private int width;  //可滑動(dòng)的最小X坐標(biāo),小于該坐標(biāo)的滑動(dòng)不處理  private int min_X;  // 頁(yè)面邊緣的陰影圖  private Drawable left_shodow;  //頁(yè)面邊緣陰影的寬度默認(rèn)值  private static final int SHADOW_WIDTH = 16;  // 頁(yè)面邊緣陰影的寬度  private int shadow_width;  // Activity finish標(biāo)識(shí)符  private boolean isFinish;

這邊我已經(jīng)注釋過(guò)了,就不做過(guò)多就寫(xiě)了。接下來(lái),我們看下我們的一些初始化已經(jīng)外部調(diào)用方法:

 private void initView(Activity activity) {    this.activity = activity;    scroller = new Scroller(activity);    left_shodow = getResources().getDrawable(R.drawable.left_shadow);    int density = (int) activity.getResources().getDisplayMetrics().density;    shadow_width = SHADOW_WIDTH * density;    // 這里你一定要設(shè)置成透明背景,不然會(huì)影響你看到底層布局    setBackgroundColor(Color.argb(0, 0, 0, 0));  }  public void bindActivity(Activity activity) {    ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();    View child = decorView.getChildAt(0);    decorView.removeView(child);    addView(child);    decorView.addView(this);

我們主要看下bindactivity這個(gè)方法。這個(gè)是我們用來(lái)綁定一個(gè)activity的。這個(gè)activity你們可以基于baseactivity實(shí)現(xiàn)一個(gè)backactivity。為什么要這么做,因?yàn)槟忝總€(gè)activity都要寫(xiě)這么一句話(huà),我感覺(jué)就是浪費(fèi)時(shí)間,一個(gè)基類(lèi)直接解決。這個(gè)activity我們可以這么寫(xiě):

public abstract class SWBackActivity extends Activity {  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    SWBackLayout layout = new SWBackLayout(this);    layout.bindActivity(this);  }  protected abstract void afterInject();  protected abstract void afterInitView();}

那么接下來(lái)我們看下,如果對(duì)手勢(shì)的處理讓他側(cè)滑關(guān)閉呢?

  public boolean onTouchEvent(MotionEvent event) {    switch (event.getAction()) {      case MotionEvent.ACTION_DOWN:        last_X = (int) event.getX();        width = getWidth();        min_X = width / 10;        break;      case MotionEvent.ACTION_MOVE:        int rightMovedX = last_X - (int) event.getX();        if (getScrollX() + rightMovedX >= 0) {// 左側(cè)即將滑出屏幕          scrollTo(0, 0);        } else if ((int) event.getX() > min_X) {// 手指處于屏幕邊緣時(shí)不處理滑動(dòng)          scrollBy(rightMovedX, 0);        }        last_X = (int) event.getX();        break;      case MotionEvent.ACTION_UP:        if (-getScrollX() < width / 3) {          scrollBack();          isFinish = false;        } else {          scrollClose();          isFinish = true;        }        break;    }    return true;  }  private void scrollBack() {    int startX = getScrollX();    int dx = -getScrollX();    scroller.startScroll(startX, 0, dx, 0, 300);    invalidate();  }  private void scrollClose() {    int startX = getScrollX();    int dx = -getScrollX() - width;    scroller.startScroll(startX, 0, dx, 0, 300);    invalidate();  }  public void computeScroll() {    if (scroller.computeScrollOffset()) {      scrollTo(scroller.getCurrX(), 0);      postInvalidate();    } else if (isFinish) {      activity.finish();    }    super.computeScroll();  }  protected void dispatchDraw(Canvas canvas) {    super.dispatchDraw(canvas);    drawShadow(canvas);  }  private void drawShadow(Canvas canvas) {    // 保存畫(huà)布當(dāng)前的狀態(tài)    canvas.save();    // 設(shè)置drawable的大小范圍    left_shodow.setBounds(0, 0, shadow_width, getHeight());    // 讓畫(huà)布平移一定距離    canvas.translate(-shadow_width, 0);    // 繪制Drawable    left_shodow.draw(canvas);    // 恢復(fù)畫(huà)布的狀態(tài)    canvas.restore();  }

首先我們?cè)贏(yíng)CTION_DOWN記錄按下點(diǎn)的X坐標(biāo)

然后在A(yíng)CTION_MOVE中判斷,如果我們getScrollX() + rightMovedX是否是大于0的,如果大于0,表示Activity處于滑動(dòng)狀態(tài),并且是向左滑動(dòng),同時(shí)我們進(jìn)行了判斷,手指處于屏幕邊緣時(shí)不可以滑動(dòng)。

最后在A(yíng)CTION_UP中判斷如果手指滑動(dòng)的距離大于布局寬度的1/3,表示將Activity滑出界面,否則滑動(dòng)到起始位置,我們利用Scroller類(lèi)的startScroll()方法設(shè)置好開(kāi)始位置,滑動(dòng)距離和時(shí)間,然后調(diào)用postInvalidate()刷新界面,之后就到computeScroll()方法中,我們利用scrollTo()方法對(duì)該布局的父布局進(jìn)行滾動(dòng),滾動(dòng)結(jié)束之后,我們判斷界面是否滑出界面,如果是那就劃出頁(yè)面讓activity finish掉。否則,布局就歸位。

使用方法

其實(shí)使用方法很簡(jiǎn)單,直接繼承SWBackActivity就可以了。那么我們最后來(lái)看下效果圖:

Android,側(cè)滑關(guān)閉Activity的功能,側(cè)滑關(guān)閉

以上就是實(shí)現(xiàn)Android 側(cè)滑關(guān)閉Activity 的實(shí)例,如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鸡东县| 牙克石市| 嵊州市| 平利县| 射洪县| 阿巴嘎旗| 永宁县| 织金县| 扎兰屯市| 乐陵市| 青岛市| 扶沟县| 沅江市| 新建县| 高雄县| 罗江县| 曲麻莱县| 浠水县| 灵寿县| 襄樊市| 永宁县| 广宗县| 仙居县| 桂林市| 河池市| 通许县| 华容县| 平利县| 资源县| 赣榆县| 依安县| 报价| 金阳县| 兰溪市| 三台县| 民丰县| 鄂伦春自治旗| 阜宁县| 武义县| 蒙城县| 满洲里市|