楼主手机上装了好多个软件,陌陌不常玩的,看了下它的登录注册下面是一些美女的图片,而且有透明度的变化,关键是图片没有压缩和失真的情况,然后分析了下,这些肯定不是一张背景图了,可想而知,著名的9宫格啊,这样的话,实现方式就多了,GridView,自定义Layout等,今天我以自定义ViewGroup的方式来尝试下这个实现

先看下效果

首先看了下,一行是3张图片,按照矩阵的思路,就是3 * 3,看着效果图就是5行3列,也就是这个子View的总数 = rows * columns = 5 * 3 = 15

自定义ViewGroup流程 大家可以去百度很多讲解的不错,楼主也没看过源码,只知道onmeasure(测量子View,为当前容器设置大小)-----> onLaout(设置子View位置,也就是测量后排版)

最好的是自己定义一个ViewGroup看一下执行的流程,以下是我写的时候测试的方法执行顺序

可以看到先执行onFinishInflate,这里一般处理布局layout里child的初始化,getchild(0)

可以看到onSizeChanged只执行一次,这里可以获取viewGroup的宽高

而onMeasure,onLayout可能执行多次,这里是2次,我们可以使用标示位做些处理,当onLayout执行两次的时候我没处理,导致第一张图片会重复覆盖的情况,我加了标示位后问题解决。

以下是代码实现思路

onmeaure时addChildView

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {Log.i("MoMoHomeLayout","onMeasure");
    addChildView();
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
}

默认是getSugesstionWidth和getSugesstionHeight

onLayout根据想要摆放的位置来定位child的position,根据陌陌的效果是5 * 3 即是5行3列的 所以总的child个数是 5 * 3,所以要获取到每个childView 的position 计算出这个childview 的left 和 top 完成Layout的工作 ,简单的算法如下

private int[] getLetTop(int childIndex) {int[] LeftTop = new int[2];
    for (int i = 0; i < rows; i++) {for (int j = 0; j < columns; j++) {if (i * columns + j == childIndex) {LeftTop[0] = i;
                LeftTop[1] = j;
                Log.i("LeftTop", "row is " + i + "columns is " + j);
                break;
            }}}return LeftTop;

}

根据安卓的坐标系 onLayout代码如下

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {Log.i("MoMoHomeLayout","onLayout");
    if(!once){for (int i = 0; i < getChildCount(); i++) {View view = getChildAt(i);
            int[] position = getLetTop(i);
            int mLeft = singleWidth * position[1];
            int mTop = singleHeight * position[0];
            view.layout(mLeft, mTop, mLeft + singleWidth, singleHeight + mTop);
            once = true;
        }}
}

这里代码基本已完成了80%了,下面就是一些效果的实现,忽明忽暗的很容易想到alpha,而且要用到随机数

代码如下

int randowN = (int) (Math.random() * (rows * columns - 1));
if(cIndex == -1){cIndex = randowN;
    View view = getChildAt(randowN);
    ObjectAnimator animator = ObjectAnimator.ofFloat(view,
            "alpha", 1.0F);
    animator.setDuration(500);
    animator.start();
}else{View oldView = getChildAt(cIndex);
    cIndex = randowN;
    View newView = getChildAt(randowN);
    ObjectAnimator oldAnimator = ObjectAnimator.ofFloat(oldView,
            "alpha", 0.4f);
    oldAnimator.setDuration(500);
    oldAnimator.start();
    ObjectAnimator newAnimator = ObjectAnimator.ofFloat(newView,
            "alpha", 1.0f);
    newAnimator.setDuration(500);
    newAnimator.start();
}
postDelayed(runnable,2000);

使用handler postDelayed 递归实现 随机切换

总体来说很简单

可以熟悉一下自定义ViewGroup的流程及执行的顺序

Android仿老版本陌陌登录注册介绍页实现相关推荐

  1. 微信小程序仿淘票票之登录注册讲解

    微信小程序仿淘票票之登录注册讲解(这也是我学习的第一步嘛) 前言 一.登录以及注册的业务逻辑 二.核心代码 1.register代码 2.login代码 总结 前言 愉快的期末,终于结束了,我准备把程 ...

  2. Android Studio老版本下载方法(2019.11.29)

    近期学习Android开发,找到的资源都是使用Android Studio老版本进行教学,与新版本在操作上略有不同,学习时可能会有一些步骤跟不上,而且以Anrdoid Studio3.5为基础的问题分 ...

  3. Android+SpringBoot前后端分离实现登录注册

    Android+SpringBoot前后端分离实现登录注册 一.登录 1.界面设计 2.Android端 (1)布局文件(activity_login) (2)java文件(LoginActivity ...

  4. 带翻转特效的会员登录注册html页面源码

    大家好,今天给大家介绍一款,带翻转特效的会员登录注册html页面源码(图1).送给大家哦,获取方式在本文末尾. 图1 点击登录和注册切换时,带翻转特效(图2) 图2 源码完整,需要的朋友可以下载学习( ...

  5. Android+Blockly大作业(含登录注册系统、碎片式浏览、Blockly设计)

    此次大作业实现功能包括: 1.数据库的搭建 2.登录注册界面及主界面界面的设计 3.碎片的应用 4.webBlockly的嵌套 我曾在不同活动调用数据库的bug.数据库的检索和碎片的实现上花了很多时间 ...

  6. android安卓Sqlite数据库实现用户登录注册

    看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下! 建立一个类 并继承SQLiteOpenHelper public ...

  7. Android Studio开发:简单的登录注册界面

    Android开发:编写简单的登录界面与注册界面 1.登录界面布局 1.1主布局的布局方式是垂直布局,第一个TextView控件在顶部居中布置,显示"用户登录 "字样 <Te ...

  8. android 内核老版本下载安装,百度极速版老版本下载安装

    百度极速版老版本是一款非常好用的手机搜索软件,不仅搜索引擎极其强大,而且用户还可以分各种类别来搜索自己想要看到的内容,有句话是叫不知道问度娘,正是因为百度的搜索引擎十分的强大,万事皆可在百度上进行搜索 ...

  9. javaweb开发的仿推特项目之登录注册功能

    博主最近学习一个仿推特javaweb项目,其采用Jsp+Servlet的方式进行设计,MySQL数据库,Tomcat8服务,界面上十分美观,功能也较为健全,给大家分享一下: 项目地址 登录界面: 核心 ...

最新文章

  1. js怎么取到遍历中的特定值_LeetCode 1028 hard 从先序遍历还原二叉树 Python解题记录...
  2. 专访 | 周涛:从窄门进最终走出宽路来
  3. mysql主从同步-问题梳理
  4. 基于 FPGA 的数字抢答器设计
  5. linux安装mysql5.7.18_Linux下安装mysql5.7.18版本步骤
  6. Androidd打开文件选择器并返回文件的真实路径——听风便是雨,倚栏卧人间
  7. 2019云栖大会归来有感
  8. 语义分割论文:Fully Convolutional Networks for Semantic Segmentation (CVPR2015)
  9. 在framework下新建系统api
  10. wps怎么减少行间距_wps怎么设置行距_wps的行间距在哪怎么调整单倍行距及1.5倍行距_wps文字_office之家...
  11. 花998购买的拍摄技巧和7天起号培训文档,学了一周的总结。
  12. 康威定律,作为架构师还不会灵活运用?
  13. YELP NLP 英文文本断句
  14. XSell和Xftp的简单使用方法
  15. Vue知识点总结(一)
  16. 间歇控制器的工作原理,神经网络控制应用实例
  17. 信息学奥赛一本通| 1187:统计字符数
  18. SPSS(十二)SPSS对应分析(图文+数据集)
  19. From Data Mining to Knowledge Discovery in Databases
  20. win7 x64 windbg 双机调试

热门文章

  1. 输入法字母和数字间距变大的解决方法
  2. Linux配置Yum软件仓库
  3. BlueStacks蓝叠 安装后启动时:初始化失败或者引擎启动失败
  4. linux安装 openbabel pybel
  5. Ubuntu18.04下安装openfoam的一种方法
  6. 百度WebUploader之实现文件上传与下载
  7. DirectX11 With Windows SDK--09 纹理映射与采样器状态
  8. 达梦数据库全备失败故障处理[-718]错误
  9. 太强了,阿里高级工程师熬夜n天码出 Java 150K 字面试宝典
  10. 谷歌浏览器安全警告“您要访问的网站包含恶意软件”的解决方法