自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android登陸頁面仿拉鉤動(dòng)效,你總會(huì)需要它!

移動(dòng)開發(fā) Android
看到這個(gè)標(biāo)題是不是JH一緊,你可能會(huì)說我就沒遇到過,但是現(xiàn)在沒遇到不代表就遇不到,畢竟設(shè)計(jì)也是變幻莫測,只有你想不到的,沒有你不能實(shí)現(xiàn)的,說的這么吊,到底是啥效果?沒錯(cuò)就是一個(gè)小小的登錄頁面,大家都有拉勾app吧,看拉勾的登錄頁做的很是平滑動(dòng)畫,而且?guī)?dòng)畫效果,所以就有了類似拉勾登錄效果。

[[187872]]

哈哈,看到這個(gè)標(biāo)題是不是JH一緊,你可能會(huì)說我就沒遇到過,但是現(xiàn)在沒遇到不代表就遇不到,畢竟設(shè)計(jì)也是變幻莫測,只有你想不到的,沒有你不能實(shí)現(xiàn)的,說的這么吊,到底是啥效果?沒錯(cuò)就是一個(gè)小小的登錄頁面,大家都有拉勾app吧,看拉勾的登錄頁做的很是平滑動(dòng)畫,而且?guī)?dòng)畫效果,所以就有了類似拉勾登錄效果,如圖: 

 

 

 

雖然是個(gè)簡單的頁面,但是涵蓋的東西不算少啊,很納悶為何谷歌一直不提供簡單,方便,準(zhǔn)確的鍵盤監(jiān)聽事件?惆悵啊,所以我們只能自己從側(cè)面監(jiān)聽鍵盤事件了,我們可以監(jiān)聽最外層布局的變化來判斷鍵盤是不是彈起了。閑話不多說,上車吧。

布局文件,大家都能看懂吧。 

 

 

 

我們要想監(jiān)聽鍵盤事件,首先我們想得到的是鍵盤彈起的時(shí)候我們可以去搞點(diǎn)事情,鍵盤搜起的時(shí)候我們?cè)偃ジ泓c(diǎn)事情,知道這些還不夠,我們還要知道鍵盤彈起了多少,以及需要平移多少的距離。我們都知道我們的一個(gè)頁面彈起鍵盤的時(shí)候這個(gè)頁面的根布局會(huì)回調(diào)他的監(jiān)聽方法:addOnLayoutChangeListener( );當(dāng)鍵盤彈起的時(shí)候,我們的布局是變化了,因此會(huì)執(zhí)行這個(gè)回調(diào)方法,但是前提是必須設(shè)置我們的Activity的windowSoftInputMode屬性為adjustResize。

我們想讓布局整體平移的距離也就是彈起時(shí)候處于***部的view距離頂部的高度減去我們鍵盤的高度?,F(xiàn)在認(rèn)為只要控件將Activity向上推的高度超過了1/3屏幕高,就認(rèn)為軟鍵盤彈起

  1.  scrollView.addOnLayoutChangeListener(new ViewGroup.OnLayoutChangeListener() { 
  2.             @Override 
  3.             public void onLayoutChange(View v, int leftint topint rightint bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
  4.               /* old是改變前的左上右下坐標(biāo)點(diǎn)值,沒有old的是改變后的左上右下坐標(biāo)點(diǎn)值 
  5.               現(xiàn)在認(rèn)為只要控件將Activity向上推的高度超過了1/3屏幕高,就認(rèn)為軟鍵盤彈起*/ 
  6.                 if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) { 
  7.                     Log.e("wenzhihao""up------>"+(oldBottom - bottom)); 
  8.                     int dist = btn_login.getBottom() - bottom; 
  9.                     if (dist>0){ 
  10.                         ObjectAnimator mAnimatorTranslateY = ObjectAnimator.ofFloat(content, "translationY", 0.0f, -dist); 
  11.                         mAnimatorTranslateY.setDuration(300); 
  12.                         mAnimatorTranslateY.setInterpolator(new LinearInterpolator()); 
  13.                         mAnimatorTranslateY.start(); 
  14.                         zoomIn(logo, dist); 
  15.                     } 
  16.                     service.setVisibility(View.INVISIBLE); 
  17.  
  18.                 } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) { 
  19.                     Log.e("wenzhihao""down------>"+(bottom - oldBottom)); 
  20.                     if ((btn_login.getBottom() - oldBottom)>0){ 
  21.                         ObjectAnimator mAnimatorTranslateY = ObjectAnimator.ofFloat(content, "translationY", content.getTranslationY(), 0); 
  22.                         mAnimatorTranslateY.setDuration(300); 
  23.                         mAnimatorTranslateY.setInterpolator(new LinearInterpolator()); 
  24.                         mAnimatorTranslateY.start(); 
  25.                         //鍵盤收回后,logo恢復(fù)原來大小,位置同樣回到初始位置 
  26.                         zoomOut(logo); 
  27.                     } 
  28.                     service.setVisibility(View.VISIBLE); 
  29.                 } 
  30.             } 
  31.         }); 
  32. /n_login是登錄按鈕   

這樣我們發(fā)現(xiàn)是可以實(shí)現(xiàn)效果了,但是我想全屏顯示,懵比了,發(fā)現(xiàn)全屏的時(shí)候不回調(diào)這個(gè)方法了,怎么辦?又是查資料一看原來這個(gè)也是一個(gè)bug,但是有解決方案,AndroidBug5497Workaround。也是谷歌提供的?直接拷貝過來,會(huì)發(fā)現(xiàn)其實(shí)他的作用就是讓Activity最外層的根布局,當(dāng)有布局變化時(shí)去響應(yīng)這個(gè)變化mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener();

  1. package com.wzh.study.login; 
  2.  
  3.  
  4. import android.app.Activity; 
  5.  
  6. import android.graphics.Rect; 
  7.  
  8. import android.view.View
  9.  
  10. import android.view.ViewTreeObserver; 
  11.  
  12. import android.widget.FrameLayout; 
  13.  
  14.  
  15. public class AndroidBug5497Workaround { 
  16.  
  17.  
  18.     // For more information, see https://code.google.com/p/android/issues/detail?id=5497 
  19.  
  20.     // To use this class, simply invoke assistActivity() on an Activity that already has its content view set
  21.  
  22.  
  23.     public static void assistActivity (Activity activity) { 
  24.  
  25.         new AndroidBug5497Workaround(activity); 
  26.  
  27.     } 
  28.  
  29.  
  30.     private View mChildOfContent; 
  31.  
  32.     private int usableHeightPrevious; 
  33.  
  34.     private FrameLayout.LayoutParams frameLayoutParams; 
  35.  
  36.  
  37.     private AndroidBug5497Workaround(Activity activity) { 
  38.  
  39.         FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); 
  40.  
  41.         mChildOfContent = content.getChildAt(0); 
  42.  
  43.         mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
  44.  
  45.             public void onGlobalLayout() { 
  46.  
  47.                 possiblyResizeChildOfContent(); 
  48.  
  49.             } 
  50.  
  51.         }); 
  52.  
  53.         frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); 
  54.  
  55.     } 
  56.  
  57.  
  58.     private void possiblyResizeChildOfContent() { 
  59.  
  60.         int usableHeightNow = computeUsableHeight(); 
  61.  
  62.         if (usableHeightNow != usableHeightPrevious) { 
  63.  
  64.             int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); 
  65.  
  66.             int heightDifference = usableHeightSansKeyboard - usableHeightNow; 
  67.  
  68.             if (heightDifference > (usableHeightSansKeyboard/4)) { 
  69.  
  70.                 // keyboard probably just became visible 
  71.  
  72.                 frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; 
  73.  
  74.             } else { 
  75.  
  76.                 // keyboard probably just became hidden 
  77.  
  78.                 frameLayoutParams.height = usableHeightSansKeyboard; 
  79.  
  80.             } 
  81.  
  82.             mChildOfContent.requestLayout(); 
  83.  
  84.             usableHeightPrevious = usableHeightNow; 
  85.  
  86.         } 
  87.  
  88.     } 
  89.  
  90.  
  91.     private int computeUsableHeight() { 
  92.  
  93.         Rect r = new Rect(); 
  94.  
  95.         mChildOfContent.getWindowVisibleDisplayFrame(r); 
  96.  
  97.         return (r.bottom - r.top); 
  98.  
  99.     } 
  100.  
  101.  
  102.  

使用方式,如果我們?cè)O(shè)置了全屏,就去加載它,不設(shè)置不管:

  1. if(isFullScreen(this)){ 
  2.  
  3.             AndroidBug5497Workaround.assistActivity(this); 
  4.  
  5.  
  6. ... 
  7.  
  8. public boolean isFullScreen(Activity activity) { 
  9.  
  10.     return (activity.getWindow().getAttributes().flags & 
  11.  
  12.             WindowManager.LayoutParams.FLAG_FULLSCREEN)==WindowManager.LayoutParams.FLAG_FULLSCREEN; 
  13.  
  14.  

接下來就看具體動(dòng)畫事件了,鍵盤彈起來的時(shí)候整體向上平移,LOGO縮小,鍵盤收起的時(shí)候整體下移,并且LOGO恢復(fù)原來大小。這里用到的都是屬性動(dòng)畫,只有屬性動(dòng)畫我們才可以實(shí)現(xiàn)真正平移效果。

我看網(wǎng)上很多人使用addOnLayoutChangeListener()去監(jiān)聽鍵盤事件,但是這個(gè)方法回調(diào)的太頻繁,比如本例特效,輸入框后面有文字時(shí)候顯示清除的圖標(biāo),如果用這個(gè)方法那么也會(huì)執(zhí)行一次,可能會(huì)影響你的動(dòng)畫,當(dāng)然你也可以去記錄***次的高度讓他不會(huì)走邏輯,但是我覺得也不是很靠譜,雖然我這個(gè)方法也不是很棒 ๑乛◡乛๑~。

***貼上源碼: 

 

 

 

如果有什么問題歡迎指出,我將給出例子地址,包含另一種實(shí)現(xiàn)方式就是用scrollview滑動(dòng)到***部的方式來實(shí)現(xiàn)平移效果~ 

責(zé)任編輯:龐桂玉 來源: 安卓巴士Android開發(fā)者門戶
相關(guān)推薦

2011-04-01 16:15:11

Zabbix報(bào)錯(cuò)

2018-04-04 08:47:42

移動(dòng)應(yīng)用AWS云質(zhì)量保證

2012-12-25 13:16:56

AndroidQQ2012UI

2015-08-03 10:40:45

動(dòng)效設(shè)計(jì)優(yōu)勢

2013-04-22 13:32:55

2012-10-15 10:07:45

jQueryJSWeb

2015-08-12 10:06:12

UI動(dòng)效

2011-02-13 13:32:33

Windows 8

2010-08-18 08:21:49

Adobe AIRAndroid

2015-07-31 11:40:36

動(dòng)效Swift

2013-07-22 09:24:33

微信系統(tǒng)推送

2021-04-15 07:50:45

Veu 動(dòng)效Vue應(yīng)用程序

2018-02-28 15:39:52

2022-04-28 12:17:26

瀏覽器連字符hyphens

2014-09-28 10:39:24

AppleWatchUI

2020-02-15 17:15:36

Android 11安卓功能

2011-08-23 16:46:55

谷歌任天堂wii

2011-06-15 10:00:48

騰訊頁游《七雄爭霸》將

2017-05-10 07:33:41

AndroidWebView視頻

2018-02-06 09:39:45

404錯(cuò)誤頁面錯(cuò)誤
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)