最近正在完成一个摇一摇的项目,打算加入一点社交元素。第一步是实现登陆界面,一个人独自设计加开发。最后的效果还是比较满意,但还是有性能上的损失,应该可以做得更好。

背景图片可以循环左右移动,界面里的Edittext使用三方控件:MaterrialEdittext,其实现了Edittext的向下兼容。此库继承自AppCompatEdittext,所以支持Edittext的所有特性,而且添加了字符检测,标签动画,组件颜色的定制等。有了它基本上可以忘记系统提供的Edittext了。jar下载地址 (注意此控件依赖于NineOldAndroid,所以还需要一起导入它的jar包)

  1. MovePicImageView
    主要是基于ImageView添加了自动缩放图片和自动滚动图片的动画。我的想法是:要让图片铺满ImageView,图片的高度一定要正好是ImageView的高度,但是图片宽度一定要比ImageView宽,这样动画播放才会把其余部分显示出来。所以,可以在onSizeChanged() 方法中得到组件的宽高(不能在其它地方尤其是构造方法中调用getWidth()或getHeight(),因为此时View的绘制过程不一定完成了)。如果图片高度和ImageView高度不符合,就进行缩放。下面是方法内部的代码。
 new AsyncTask<Object,Object,Bitmap>(){@Overrideprotected Bitmap doInBackground(Object... params) {//预加载获取图片宽高BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeResource((Resources) params[0],R.drawable.flowbloom,options);imageWidth = options.outWidth;imageHeight = options.outHeight;int inSampleSize = 1;//防止图片过大,出现OOMif (imageHeight > (Integer) params[2] ) {final int halfHeight = imageHeight / 2;while ((halfHeight / inSampleSize) > (Integer) params[2]) {inSampleSize *= 2;}}options.inSampleSize = inSampleSize;options.inJustDecodeBounds = false;return BitmapFactory.decodeResource((Resources)params[0],R.drawable.flowbloom,options);}@Overrideprotected void onPostExecute(Bitmap background) {setImageBitmap(background);Drawable d = getDrawable();if (d == null) return;int dw = d.getIntrinsicWidth();int dh = d.getIntrinsicHeight();Log.i(TAG,"onPostExecute: dw: " + dw + " dh :" + dh);float scale; //缩放值scale = getHeight() * 1f / dh;matrix.postScale(scale,scale);matrix.postTranslate(-100,0);setImageMatrix(matrix);}}.execute(getResources(),w,h);

这里使用了 AsyncTask 新开了一个线程加载图片,然而效果并不好,反而在打开登陆界面时有一段时间的黑屏过程,还不如直接在UI线程中加载。

这里遇到了两个坑:
1、使用Matrix控制图片必须在xml文件中为ImageView添加android:scaleType=”matrix”
2、放在不同资源限定符的drawable文件夹中的Bitmap,它的Density属性是不同的。而每个设备的TargetDensity属性也是不同的(小米note是440,Vivo X3t 是320) ,系统就是根据TargetDensity到不同的drawable文件夹找图片的。举个例子,我只在drawable-mdpi中放了一张图片,那它的Density是160(图片像素1440x900)。小米note加载这张图片,因为drawable-xxhdpi没图片,于是它会对其进行缩放1440 x (440 \ 160) = 3960 , 900 x (440 \ 160 ) = 2475。于是内存中图片的真正像素是(3960 x 2475)。所以,如果不注意为每个drawable文件夹配上图片,可能不同设备上的图片像素会不一致。(注意:测试系统 API23、AndroidStudio2.1)

自动滚动图片是由一个MoveImageAnimator实现的动画的效果。

private class MoveImageAnimator extends Animation {@Overrideprotected void applyTransformation(float interpolatedTime,Transformation t) {super.applyTransformation(interpolatedTime,t);RectF r = getMatrixRectF();if (r.left > 0 || r.right < getWidth()) {back = !back;}if (back) {matrix.postTranslate(2,0);} else {matrix.postTranslate(-2,0);}setImageMatrix(matrix);}}

移动方法很简单,使用Matrix对图片进行水平位移操作。这里需要注意的就是对图片左右边框的判断,如果到达图片的左右边框,让back=!back 就是碰撞到边框马上返回。检测图片的左右边框可以使用下面的方法:

/*** 此方法能获取View中图片的描述RectF* @return*/private RectF getMatrixRectF() {Matrix m = matrix;RectF rectF = new RectF();Drawable d = getDrawable();if (d != null) {rectF.set(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());//当前图片宽高(不改变的)m.mapRect(rectF);//将matrix中的值映射到rectF中}return rectF;}

项目GitHub: https://github.com/HYY-yu/MovePicImageView

MaterialDesign+MovePicImageView实现漂亮的登陆界面相关推荐

  1. [WPF] WPF做的漂亮的登陆界面[附源码]

    登陆界面上的logo都是从网上找的,请大家替换成自己公司的logo即可..... WPF界面库,非常漂亮的WPF界面[附源码] https://www.itsvse.com/thread-4941-1 ...

  2. html5漂亮的登陆界面响应式登录网页源码下载

    下载地址 这个小部件设计使用HTML5和CSS3等web技术,可以直接使用在你的网站上.它有HTML CSS欢迎平登录小部件可用于您的web项目.表单的粉色框模式背景使它看起来有吸引力和清洁. dd:

  3. 高仿Android QQ2012登陆界面和注册界面

    最近工作比较轻松,项目不忙,所以闲着的时间去研究了自己比较感兴趣的UI界面,确实漂亮的UI能给用户带来良好的体验,在android应用中一直尤为重要,这次模仿的是QQ2012Android版的的最新登 ...

  4. 使用层级观察器hierarchyviewer综合各种布局实现Android QQ2012登陆界面和注册界面...

    最近工作比较轻松,项目不忙,所以闲着的时间去研究了自己比较感兴趣的UI界面,确实漂亮的UI能给用户带来良好的体验,在android应用中一直尤为重要,这次模仿的是QQ2012Android版的的最新登 ...

  5. Android 猫头鹰登录界面,WordPress个性化登陆界面(添加会遮挡双眼的猫头鹰动画)...

    在开始本篇文章之前,我们先来看下最终效果,需要的话就继续看下去吧.文章最后面还加了个点心,欢迎品尝. 即当鼠标切换到登陆密码一栏时,那只萌萌的猫头鹰就害羞的遮挡住了双眼.陌小雨给大家分享这效果的具体方 ...

  6. springboot整合mybaits-plusmybaits实现用户登陆界面(适合入门)+唯美界面

    springboot整合mybaits-plus/mybaits实现用户登陆界面(一步步解析)+唯美界面 文章目录 springboot整合mybaits-plus/mybaits实现用户登陆界面(一 ...

  7. android布局基础及范例:QQ登陆界面设计

    使用android手机的用户想必都有android手机QQ客户端吧,我们是不是觉得QQ登陆界面非常漂亮美观而且具有亲和力?我们是不是也想作出像 QQ那样美观的界面?有的人肯定会问,做UI那不是美工人员 ...

  8. 【登录异常解决】Ubuntu 输入正确的密码后重新返回到登陆界面

    [登录异常解决]Ubuntu 输入正确的密码后重新返回到登陆界面 参考文章: (1)[登录异常解决]Ubuntu 输入正确的密码后重新返回到登陆界面 (2)https://www.cnblogs.co ...

  9. 描述linux系统从开机到登陆界面的启动过程

    简述: 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核kernel 5.启动init进程 6.读取inittab文件,执行rc.sysinit,rc等脚本 7.启动minge ...

  10. QML与C++交互:登陆界面设计

    环境: 主机:WIN7 开发环境:Qt5.2.1 说明: QML设计前台界面,C++后台负责逻辑 效果图: 源代码: 前台qml文件 login.qml [javascript] view plain ...

最新文章

  1. 为什么SD-WAN5年增长超过40%,越来越受企业欢迎?
  2. css设置文本自动换行
  3. 亚马逊招聘,无人超市研发部门
  4. 实体类里的内部类怎么单独赋值_java你还在用各种setter赋值初始对象吗?用设计模式化简为易...
  5. 网页设计图片向上浮动_HTML5 背景图片漂浮/浮动特效
  6. FTP 编写 3:同时为多个客户端服务(多线程)
  7. 客户端访问Web Service--参数类型的序列化与反序列化(一)
  8. sql 时间字符串转换
  9. n阶行列式计算Python和C语言实现
  10. 主板电源开关接口图解_主板跳线接法示意图,超详细适合DIY新手
  11. webfigure显示到网页上所踩过的坑--自写servlet
  12. charles全面使用教程及常见功能详解(较详细)
  13. 《诗六十首》一个会写诗的程序员
  14. 30.STM32 DS18B20
  15. Java设计模式——行为型模式之观察者模式
  16. 教程7--Schemas和客户端库
  17. cs224w(图机器学习)2021冬季课程学习笔记8 Colab 2
  18. Fastjson漏洞详情
  19. Unity开发笔记(五)—— 制作第四个小游戏《坦克大战》
  20. java als算法实现_ALS算法实现用户音乐打分预测

热门文章

  1. 一图看清美国最具前景的50家人工智能公司
  2. 考研助手软件制作记录
  3. 无线网络通信技术介绍
  4. redis缓存雪崩解决方案六种
  5. 百人研发团队的难题:研发管理、绩效考核、组织文化和OKR
  6. shapley和树的shap
  7. matlab中数组的创建
  8. 个人博客项目之editormd实现文章详情页面预览
  9. 软件测试 白盒测试用例设计方法动态 逻辑覆盖(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)基本路径测试法
  10. 一种动态阈值白平衡算法实现