真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android微信右滑退出功能的實(shí)現(xiàn)代碼

先給大家展示下效果圖,如果大家感覺(jué)效果不錯(cuò),請(qǐng)參考實(shí)例代碼,

目前成都創(chuàng)新互聯(lián)公司已為成百上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、閻良網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

Android微信右滑退出功能的實(shí)現(xiàn)代碼 

act2是Main2Activity,act3是Main3Activity

原理

滾動(dòng)

首先我們知道每個(gè)Activity展示的內(nèi)容一般都是DecorView去承載的,不知道的看下圖,其中狀態(tài)欄背景也包括在內(nèi):

Android微信右滑退出功能的實(shí)現(xiàn)代碼 

DecorView

所以我們第一步,只需要滾動(dòng)DecorView內(nèi)容或者平移DecorView就行了。

使上一個(gè)Activity可見(jiàn)

上面的Activity不可見(jiàn)其實(shí)是因?yàn)楸划?dāng)前Activity給擋住了。那問(wèn)題來(lái)了。

Q:為什么我把布局顏色設(shè)置成透明背景,可還是看不到上面的Activity呢?

A:看上面的DecorView那張圖,我們Activity布局只是填充content里面的內(nèi)容,也就是說(shuō)我們是被ContentFrameLayout包裹住的,Activity布局文件的根元素并不是Activity的根元素,由層級(jí)可知。 我們的Activity被上層的Activity擋住,其實(shí)是因?yàn)镈ecorView具有背景顏色,我們只需要把它的背景色去掉就行了。

實(shí)現(xiàn)

第一步設(shè)置透明主題


 
 

   
    
    
   
  
  

我們把Main3Activity的DecorView背景色去掉了。

滾動(dòng)DecorView內(nèi)容

這里我們使用滾動(dòng)DecorView內(nèi)容而不是滾動(dòng)整個(gè)DecorView。

首先大家需要搞懂一個(gè)View的 ScrollBy 和 ScrollTo 是什么回事,參考 Android scrollTo和scrollBy方法使用說(shuō)明

Main3Activity.java

public class Main3Activity extends AppCompatActivity {
 /**
  * DecorView左邊滑出間距占屏幕寬度PRESENT_TO_FINISH時(shí)表示用戶(hù)需要退出當(dāng)前Activity
  */
 private static final float PRESENT_TO_FINISH = 0.3f;
 /**
  * 用戶(hù)距離左邊MIN_EDGE_DISTANCE內(nèi)拖動(dòng)有效
  */
 private static final int MIN_EDGE_DISTANCE = 100;
 /**
  * 屏幕寬度
  */
 private static float mScreenW = -1;
 /**
  * 用戶(hù)計(jì)算用戶(hù)在屏幕滑動(dòng)的距離
  */
 private float mStartX = 0;
 /**
  * 當(dāng)前是否允許拖動(dòng)
  */
 private boolean mIsScrollEnable = false;
 /**
  * 當(dāng)前Activity的DecorView
  */
 private View mDecorView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main3);
  // 初始化
  mDecorView = getWindow().getDecorView();
  if (mScreenW == -1) {
   DisplayMetrics metrics = new DisplayMetrics();
   getWindowManager().getDefaultDisplay()
     .getMetrics(metrics);
   mScreenW = metrics.widthPixels;
  }
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
   mStartX = event.getX();
   if (mStartX < MIN_EDGE_DISTANCE) {
    // 距離左邊距離足夠小,設(shè)置為可拖動(dòng)狀態(tài)
    mIsScrollEnable = true;
   }
  } else if (event.getAction() == MotionEvent.ACTION_MOVE && mIsScrollEnable) {
   // 滾動(dòng)DecorView內(nèi)容
   float dX = event.getX() - mStartX;
   mStartX = event.getX();
   mDecorView.scrollBy((int) -dX, 0);
   return true;
  } else if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
   // 觸摸操作取消,重置
   mIsScrollEnable = false;
   // 根據(jù)當(dāng)前滑動(dòng)狀態(tài)判斷最終是滑到左邊還是滑到右邊(結(jié)束Activity)
   final int targetX = -mDecorView.getScrollX() / mScreenW > PRESENT_TO_FINISH ? (int) -mScreenW : 0;
   ValueAnimator animator = ValueAnimator.ofInt(mDecorView.getScrollX(), targetX);
   animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
     mDecorView.scrollTo((Integer) animation.getAnimatedValue(), 0);
    }
   });
   animator.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {
    }
    @Override
    public void onAnimationEnd(Animator animation) {
     if (targetX == -mScreenW) {
      finish();
     }
    }
    @Override
    public void onAnimationCancel(Animator animation) {
    }
    @Override
    public void onAnimationRepeat(Animator animation) {
    }
   });
   animator.start();
  }
  return super.onTouchEvent(event);
 }
}

寫(xiě)在最后

這是最簡(jiǎn)單最簡(jiǎn)單的做法,無(wú)任何封裝與擴(kuò)展,包括一些可能存在的滾動(dòng)沖突也沒(méi)有去處理。大家可以封裝一個(gè)比較完善并且容易使用的庫(kù),加入ListView之類(lèi)的滑動(dòng)沖突處理以及背景色透明漸變之類(lèi)的,然后里面的xml代碼轉(zhuǎn)換成對(duì)應(yīng)deJava代碼寫(xiě)法。一句話使Activity實(shí)現(xiàn)該功能也是可以做到的。

總結(jié)

以上所述是小編給大家介紹的Android微信右滑退出功能的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!


網(wǎng)頁(yè)標(biāo)題:Android微信右滑退出功能的實(shí)現(xiàn)代碼
標(biāo)題鏈接:http://weahome.cn/article/jecjih.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部