Android開發(14)——動畫實戰:炫酷登錄

本節內容

1.第三方庫實現虛化

2.添加輸入框和按鈕

3.按鈕狀態

4.鍵盤隱藏

5.監聽焦點改變的事件

6.手臂旋轉動畫

7.手掌和手臂動畫

Demo簡介
1.做一個炫酷登錄的界面。
image.png
  • 當我們輸入密碼的時候,貓頭鷹會捂住眼睛。點擊其他地方后,它的手臂又會張開。
QQ圖片20210329154151.png
  • 登錄按鈕只有當用戶名和密碼都輸入了之后,才會變成藍色,否則就是灰色。
QQ圖片20210329154304.png
一、第三方庫實現虛化
1.首先在gradle中添加一個依賴庫,然后同步一下。
implementation 'io.alterac.blurkit:blurkit:1.1.0'
2.在code中添加一個虛化框
<io.alterac.blurkit.BlurLayout
        android:id="@+id/blurLayout"
        android:layout_width="0dp"
        android:layout_height="270dp"
        android:layout_marginEnd="20dp"
        app:blk_blurRadius="20"
        app:blk_cornerRadius="10dp"
        app:blk_fps="1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/mHead">
    </io.alterac.blurkit.BlurLayout>
  • app:blk_blurRadius="20",表示虛化半徑為20.
  • app:blk_cornerRadius="10dp",表示虛化框的圓角半徑。
  • app:blk_fps="1",表示每秒幀數。
3.讓它在onStart()方法里面就開始虛化。
 override fun onStart() {
        super.onStart()
        //開始虛化
        blurLayout.startBlur()
    }
4.啟動完畢之后再停止虛化
override fun onResume() {
        super.onResume()
        //暫停虛化
        blurLayout.pauseBlur()
    }
二、添加輸入框和按鈕
1.拖動兩個EditText到虛化框里面,設置id為mName和mPassword。
2.給這兩個控件添加一個邊框,新建資源文件自己設計一個邊框
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="5dp"/>
    <stroke android:color="#FFF "  android:width="1dp"/>
</shape>
然后在code中把這個添加到EditText中去
android:background="@drawable/edit_shape"
3.在輸入框左側再添加一張圖片,并設置一下內間距,再設置一下內部的文字與該圖片的間距,還有文字間的間距。其他屬性自行調整。
 android:drawableStart="@drawable/iconfont_user"
 android:paddingStart="10dp"
 android:drawablePadding="10dp"
android:letterSpacing="0.1"
4.添加一個按鈕,為了實現不同狀態下顯示不同顏色的效果,我們添加一個<selector>選擇器
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false"  android:drawable="@color/colorGrey"/>
    <item android:state_enabled="true"  android:drawable="@color/colorBlue"/>
</selector>
5.為了有更多的顏色可以選擇,我們可以在colors.xml中多添加幾個顏色
<resources>
    <color name="colorPrimary">#6200EE</color>
    <color name="colorPrimaryDark">#3700B3</color>
    <color name="colorAccent">#03DAC5</color>
    <color name="colorBlue">#4496EF</color>
    <color name="colorGrey">#D6D7D7</color>
    <color name="colorBlackGrey">#666</color>
    <color name="colorWhite">#FFF</color>
</resources>
6.找到button的code,將background設置為我們創建的資源文件
android:background="@drawable/loginbtn_state"
三、按鈕狀態
1.輸入框設置內容改變的監聽器
        mName.addTextChangedListener(this)
        mPassword.addTextChangedListener(this)
2.只需要實現輸入完了的事件,只有輸入框都不為空時才能點擊
override fun afterTextChanged(s: Editable?) {
        //當兩個輸入框都有內容才能點擊
        mLogin.isEnabled = mName.text.isNotEmpty() &&mPassword.text.isNotEmpty()
    }
四、鍵盤隱藏(只有用戶輸入名字和密碼的時候才彈出鍵盤,其他時候點擊任何其他地方就需要把鍵盤隱藏起來)
1.當一個輸入框被點擊 這個輸入框就獲取到焦點focus。系統自動彈出一個鍵盤和擁有焦點的輸入框進行綁定。
2.鍵盤是由一個類來管理的(InputMethodManager),它是系統提供的服務service
3.實現onTouchEvent方法,如果點下去了,那么就隱藏鍵盤。
 override fun onTouchEvent(event: MotionEvent?): Boolean {
        if(event?.action==MotionEvent.ACTION_DOWN){
             //隱藏鍵盤
         hideKeyboard()
        }
        return super.onTouchEvent(event)
    }
4.實現隱藏鍵盤的方法
private fun hideKeyboard(){
        //取消焦點
        if(mName.hasFocus()){
            mName.clearFocus()
        }
        if(mPassword.hasFocus()){
            mPassword.clearFocus()
        }
       //獲取管理輸入的Manager
      val inputMethodManager=
          getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(mPassword.windowToken,InputMethodManager.HIDE_NOT_ALWAYS)
    }
五、監聽焦點改變的事件
1.主類必須繼承一個焦點的監聽器
class MainActivity : AppCompatActivity(),TextWatcher,View.OnFocusChangeListener {
}
2.實現焦點改變的事件的方法
override fun onFocusChange(v: View?, hasFocus: Boolean) {
       if(v == mPassword){
         if(hasFocus){
          coverEye()
         }else{
          openEye()
         }
       }
    }
3.輸入焦點改變的監聽事件
        mName.onFocusChangeListener = this
        mPassword.onFocusChangeListener = this
4.在隱藏鍵盤的時候,要取消焦點,所以前面hideKeyboard()里有取消焦點的方法。
六、手臂旋轉動畫
1.一開始手掌是一半在上,一半在虛化框背后的。
image.png
2.接著當我們輸入密碼時,手掌就要向下,然后手臂從下面旋轉上來。所以手臂一開始也隱藏在虛化框背后。
image.png
  • 當放下手臂時,手掌又會重新露出來。
3.配置的時候差不多如下圖所示,手臂完全在虛化框后面,手掌一半在里面,一半在外面。
image.png
4. 遮住眼睛:兩只手掌同時向下移動 ->兩只手同時旋轉。打開眼睛:兩只手同時旋轉 ->兩個手掌同時向上移動。
實現創建一次有兩種方法:懶加載。定義一個變量 定義一個方法 在方法中判斷這個變量是否有值。這里我們使用懶加載。
5.使用懶加載 定義動畫的對象。手臂的動畫不僅包括旋轉,還包括移動,而且手臂的向上和向右移動是同時進行的。
  • 左手臂向上旋轉
val leftArmUpAnim:AnimatorSet by lazy {
      val rotate=  ObjectAnimator.ofFloat(mLeftArm,"rotation",140f).apply {
            duration = 500
        }
        //手臂向右移動
      val tx=  PropertyValuesHolder.ofFloat("translationX",dpToPx(48f))
        //手臂向上移動
      val ty=  PropertyValuesHolder.ofFloat("translationY",-dpToPx(40f))
      val translate=  ObjectAnimator.ofPropertyValuesHolder(mLeftArm,tx,ty)

        AnimatorSet().apply {
            playTogether(rotate,translate)
            duration = 500
        }
    }
  • 右手臂向上旋轉
   val leftArmDownAnim:AnimatorSet by lazy {
      val rotate=  ObjectAnimator.ofFloat(mLeftArm,"rotation",0f).apply {
            duration = 500
        }
        //手臂向左移動
        val tx=  PropertyValuesHolder.ofFloat("translationX",0f)
        //手臂向下移動
        val ty=  PropertyValuesHolder.ofFloat("translationY",0f)
        val translate=  ObjectAnimator.ofPropertyValuesHolder(mLeftArm,tx,ty)

        AnimatorSet().apply {
            playTogether(rotate,translate)
            duration = 500
        }
    }
  • 右手臂向下旋轉
val rightArmDownAnim:AnimatorSet by lazy {
     val rotate=   ObjectAnimator.ofFloat(mRightArm,"rotation",0f).apply {
            duration = 500
        }
        //手臂向右移動
        val tx=  PropertyValuesHolder.ofFloat("translationX",0f)
        //手臂向下移動
        val ty=  PropertyValuesHolder.ofFloat("translationY",0f)
        val translate=  ObjectAnimator.ofPropertyValuesHolder(mRightArm,tx,ty)

        AnimatorSet().apply {
            playTogether(rotate,translate)
            duration = 500
        }
    }
6.實現捂眼睛動畫函數
private fun coverEye(){
           AnimatorSet().apply {
               play(leftHandDownAnim)
                   .with(rightHandDownAnim)
                   .before(leftArmUpAnim)
                   .before(rightArmUpAnim)
               start()
           }
    }
7.實現打開眼睛的動畫
private fun openEye(){
        AnimatorSet().apply {
            play(leftArmDownAnim)
                .with(rightArmDownAnim)
                .before(leftHandUpAnim)
                .before(rightHandUpAnim)
            start()
        }
    }
七、手掌和手臂動畫
1.將dp值轉化為像素
private fun dpToPx(dp:Float):Float{
        val display= DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(display)
        return display.density*dp
    }
2.手掌移動動畫
  • 左手掌下移
val leftHandDownAnim:ObjectAnimator by lazy {
        ObjectAnimator.ofFloat(mLeftHand,"translationY",mLeftHand.height*0.5f).apply {
            duration = 500
        }
    }
  • 左手掌上移
val leftHandUpAnim:ObjectAnimator by lazy {
        ObjectAnimator.ofFloat(mLeftHand,"translationY",0f).apply {
            duration = 500
        }
    }
  • 右手掌下移
val rightHandDownAnim:ObjectAnimator by lazy {
        ObjectAnimator.ofFloat(mRighrHand,"translationY",mRighrHand.height*0.5f).apply {
            duration = 500
        }
    }
  • 右手掌上移
 val rightHandUpAnim:ObjectAnimator by lazy {
        ObjectAnimator.ofFloat(mRighrHand,"translationY",0f).apply {
            duration = 500
        }
    }
所有內容就差不多了,可以結合前面的文章食用。主要的重難點就是監聽焦點,還有動畫的分析過程以及實現過程。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容