最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年01月22日 15:30:44   作者:August1996  
這篇文章主要介紹了Android微信右滑退出功能的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

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

 

act2是Main2Activity,act3是Main3Activity

原理

滾動(dòng)

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

 

DecorView

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

使上一個(gè)Activity可見

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

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

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

實(shí)現(xiàn)

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

<!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <!-- Customize your theme here. -->
  <item name="colorPrimary">@color/colorPrimary</item>
  <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  <item name="colorAccent">@color/colorAccent</item>
 </style>
 <style name="CustomTheme" parent="AppTheme">
  <item name="android:windowIsTranslucent">true</item>
  <item name="android:windowBackground">@android:color/transparent</item>
 </style>
<activity android:name=".Main2Activity">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
  <activity
   android:name=".Main3Activity"
   android:theme="@style/CustomTheme" />

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

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

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

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

Main3Activity.java

public class Main3Activity extends AppCompatActivity {
 /**
  * DecorView左邊滑出間距占屏幕寬度PRESENT_TO_FINISH時(shí)表示用戶需要退出當(dāng)前Activity
  */
 private static final float PRESENT_TO_FINISH = 0.3f;
 /**
  * 用戶距離左邊MIN_EDGE_DISTANCE內(nèi)拖動(dòng)有效
  */
 private static final int MIN_EDGE_DISTANCE = 100;
 /**
  * 屏幕寬度
  */
 private static float mScreenW = -1;
 /**
  * 用戶計(jì)算用戶在屏幕滑動(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);
 }
}

寫在最后

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

總結(jié)

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

相關(guān)文章

  • Android自定義Dialog實(shí)現(xiàn)加載對(duì)話框效果

    Android自定義Dialog實(shí)現(xiàn)加載對(duì)話框效果

    這篇文章將介紹如何定制當(dāng)今主流的對(duì)話框,通過自定義dialog實(shí)現(xiàn)加載對(duì)話框效果,具體實(shí)現(xiàn)代碼大家通過本文學(xué)習(xí)吧
    2018-05-05
  • Android編程中ViewPage判斷左右滑動(dòng)方向的方法

    Android編程中ViewPage判斷左右滑動(dòng)方向的方法

    這篇文章主要介紹了Android編程中ViewPage判斷左右滑動(dòng)方向的方法,涉及Android中ViewPage針對(duì)滑動(dòng)判定的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-10-10
  • Android 基于Bitmap的四種圖片壓縮方式

    Android 基于Bitmap的四種圖片壓縮方式

    本文中探究的圖片壓縮方式主要是基于 Bitmap 的 api 實(shí)現(xiàn)。文中探究實(shí)現(xiàn)的壓縮方式有四種:質(zhì)量壓縮、采樣率壓縮、Matrix 縮放壓縮、圖片編碼格式壓縮,感興趣的朋友可以參考下
    2021-05-05
  • Android創(chuàng)建Alert框的方法

    Android創(chuàng)建Alert框的方法

    這篇文章主要介紹了Android創(chuàng)建Alert框的方法,實(shí)例分析了Android創(chuàng)建alert彈出窗口的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • Android Http實(shí)現(xiàn)文件的上傳和下載

    Android Http實(shí)現(xiàn)文件的上傳和下載

    這篇文章主要為大家詳細(xì)介紹了Android Http實(shí)現(xiàn)文件的上傳和下載,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android編程中關(guān)于單線程模型的理解與分析

    Android編程中關(guān)于單線程模型的理解與分析

    這篇文章主要介紹了Android編程中關(guān)于單線程模型的理解與分析,較為詳細(xì)的分析了Android編程中關(guān)于單線程的原理與相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android中AsyncTask的用法實(shí)例分享

    Android中AsyncTask的用法實(shí)例分享

    AsyncTask的特點(diǎn)是任務(wù)在主線程之外運(yùn)行,而回調(diào)方法是在主線程中執(zhí)行, 這就有效地避免了使用Handler帶來的麻煩
    2014-02-02
  • Android實(shí)現(xiàn)TCP客戶端支持讀寫操作

    Android實(shí)現(xiàn)TCP客戶端支持讀寫操作

    這篇文章主要介紹了Android-實(shí)現(xiàn)TCP客戶端,支持讀寫操作,主要是通過socket讀寫tcp,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • android獲取屏幕像素思路及代碼

    android獲取屏幕像素思路及代碼

    本文為大家詳細(xì)介紹下android是怎樣獲取屏幕像素的,感興趣的各位可以參考下哈,希望對(duì)你學(xué)習(xí)android有所幫助
    2013-04-04
  • Android中的圖片優(yōu)化完全指南

    Android中的圖片優(yōu)化完全指南

    這篇文章主要給大家介紹了關(guān)于Android中圖片優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評(píng)論

金堂县| 来宾市| 普兰县| 惠来县| 吴江市| 葵青区| 德兴市| 鄂托克前旗| 赤城县| 衡阳县| 息烽县| 镇康县| 青冈县| 万载县| 德昌县| 教育| 威宁| 都兰县| 新源县| 聂荣县| 华阴市| 临沂市| 汾阳市| 乐昌市| 本溪市| 灵石县| 汨罗市| 冀州市| 衡山县| 阜康市| 五原县| 安乡县| 荥经县| 静海县| 全州县| 台东市| 黎平县| 安徽省| 特克斯县| 伊川县| 雅江县|