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阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容