千家信息网

如何实现Android登陆页面仿拉钩动效

发表于:2024-09-26 作者:千家信息网编辑
千家信息网最后更新 2024年09月26日,如何实现Android登陆页面仿拉钩动效,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。哈哈,看到这个标题是不是JH一紧,你可能会说我
千家信息网最后更新 2024年09月26日如何实现Android登陆页面仿拉钩动效

如何实现Android登陆页面仿拉钩动效,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

哈哈,看到这个标题是不是JH一紧,你可能会说我就没遇到过,但是现在没遇到不代表就遇不到,毕竟设计也是变幻莫测,只有你想不到的,没有你不能实现的,说的这么吊,到底是啥效果?没错就是一个小小的登录页面,大家都有拉勾app吧,看拉勾的登录页做的很是平滑动画,而且带动画效果,所以就有了类似拉勾登录效果,如图:

虽然是个简单的页面,但是涵盖的东西不算少啊,很纳闷为何谷歌一直不提供简单,方便,准确的键盘监听事件?惆怅啊,所以我们只能自己从侧面监听键盘事件了,我们可以监听最外层布局的变化来判断键盘是不是弹起了。闲话不多说,上车吧。

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

我们要想监听键盘事件,首先我们想得到的是键盘弹起的时候我们可以去搞点事情,键盘搜起的时候我们再去搞点事情,知道这些还不够,我们还要知道键盘弹起了多少,以及需要平移多少的距离。我们都知道我们的一个页面弹起键盘的时候这个页面的根布局会回调他的监听方法:addOnLayoutChangeListener( );当键盘弹起的时候,我们的布局是变化了,因此会执行这个回调方法,但是前提是必须设置我们的Activity的windowSoftInputMode属性为adjustResize。

我们想让布局整体平移的距离也就是弹起时候处于***部的view距离顶部的高度减去我们键盘的高度。现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起

 scrollView.addOnLayoutChangeListener(new ViewGroup.OnLayoutChangeListener() {             @Override             public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {               /* old是改变前的左上右下坐标点值,没有old的是改变后的左上右下坐标点值               现在认为只要控件将Activity向上推的高度超过了1/3屏幕高,就认为软键盘弹起*/                 if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {                     Log.e("wenzhihao", "up------>"+(oldBottom - bottom));                     int dist = btn_login.getBottom() - bottom;                     if (dist>0){                         ObjectAnimator mAnimatorTranslateY = ObjectAnimator.ofFloat(content, "translationY", 0.0f, -dist);                         mAnimatorTranslateY.setDuration(300);                         mAnimatorTranslateY.setInterpolator(new LinearInterpolator());                         mAnimatorTranslateY.start();                         zoomIn(logo, dist);                     }                     service.setVisibility(View.INVISIBLE);                  } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {                     Log.e("wenzhihao", "down------>"+(bottom - oldBottom));                     if ((btn_login.getBottom() - oldBottom)>0){                         ObjectAnimator mAnimatorTranslateY = ObjectAnimator.ofFloat(content, "translationY", content.getTranslationY(), 0);                         mAnimatorTranslateY.setDuration(300);                         mAnimatorTranslateY.setInterpolator(new LinearInterpolator());                         mAnimatorTranslateY.start();                         //键盘收回后,logo恢复原来大小,位置同样回到初始位置                         zoomOut(logo);                     }                     service.setVisibility(View.VISIBLE);                 }             }         }); /n_login是登录按钮

这样我们发现是可以实现效果了,但是我想全屏显示,懵比了,发现全屏的时候不回调这个方法了,怎么办?又是查资料一看原来这个也是一个bug,但是有解决方案,AndroidBug5497Workaround。也是谷歌提供的?直接拷贝过来,会发现其实他的作用就是让Activity最外层的根布局,当有布局变化时去响应这个变化mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener();

package com.wzh.study.login;   import android.app.Activity;  import android.graphics.Rect;  import android.view.View;  import android.view.ViewTreeObserver;  import android.widget.FrameLayout;   public class AndroidBug5497Workaround {       // For more information, see https://code.google.com/p/android/issues/detail?id=5497      // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.       public static void assistActivity (Activity activity) {          new AndroidBug5497Workaround(activity);      }       private View mChildOfContent;      private int usableHeightPrevious;      private FrameLayout.LayoutParams frameLayoutParams;       private AndroidBug5497Workaround(Activity activity) {          FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);          mChildOfContent = content.getChildAt(0);          mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {              public void onGlobalLayout() {                  possiblyResizeChildOfContent();              }          });          frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();      }       private void possiblyResizeChildOfContent() {          int usableHeightNow = computeUsableHeight();          if (usableHeightNow != usableHeightPrevious) {              int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();              int heightDifference = usableHeightSansKeyboard - usableHeightNow;              if (heightDifference > (usableHeightSansKeyboard/4)) {                  // keyboard probably just became visible                  frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;              } else {                  // keyboard probably just became hidden                  frameLayoutParams.height = usableHeightSansKeyboard;              }              mChildOfContent.requestLayout();              usableHeightPrevious = usableHeightNow;          }      }       private int computeUsableHeight() {          Rect r = new Rect();          mChildOfContent.getWindowVisibleDisplayFrame(r);          return (r.bottom - r.top);      }   }

使用方式,如果我们设置了全屏,就去加载它,不设置不管:

if(isFullScreen(this)){              AndroidBug5497Workaround.assistActivity(this);  }  ...  public boolean isFullScreen(Activity activity) {      return (activity.getWindow().getAttributes().flags &              WindowManager.LayoutParams.FLAG_FULLSCREEN)==WindowManager.LayoutParams.FLAG_FULLSCREEN;  }

接下来就看具体动画事件了,键盘弹起来的时候整体向上平移,LOGO缩小,键盘收起的时候整体下移,并且LOGO恢复原来大小。这里用到的都是属性动画,只有属性动画我们才可以实现真正平移效果。

我看网上很多人使用addOnLayoutChangeListener()去监听键盘事件,但是这个方法回调的太频繁,比如本例特效,输入框后面有文字时候显示清除的图标,如果用这个方法那么也会执行一次,可能会影响你的动画,当然你也可以去记录***次的高度让他不会走逻辑,但是我觉得也不是很靠谱,虽然我这个方法也不是很棒 ๑乛◡乛๑~。

***贴上源码:

关于如何实现Android登陆页面仿拉钩动效问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

键盘 时候 布局 方法 页面 监听 事件 动画 效果 高度 变化 平移 登录 属性 整体 问题 登陆 事情 位置 只有 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全知识宣传页图片 网络技术人员能力 数据库安全审计系统哪个品牌好 天谕手游服务器等级开放时间 网络安全特工 网络安全运营中心建设背景 换个服务器服务器服务器 苹果怎么一直连接服务器失败 本地ftp服务器账户管理 一些免费的代理云服务器 星网锐捷网络技术邮箱公司 云计算网络安全数据挖掘书籍 防火墙阻止远程访问数据库 hp刀片服务器硬盘重启 网络安全高校总结 宁波互联网智慧工地软件开发 一梦江湖如何切换服务器 网络安全违法违规app 校园卡管理系统数据库图表 福建纵腾网络技术 苹果软件开发手续费 通过统计调查得到数据库 康姆猫重庆互联网科技公司 青少年网络安全素养学习心得 数据库并发控制任务范围 星网锐捷网络技术邮箱公司 十三五期间网络安全成就 文件夹批量生成目录 导入数据库 软件开发小公司累 沈阳定制软件开发解决方案
0