前些日子几大互联网巨头展开了一轮网盘空间大战。一下子从G级别提高到了T级别。以后谁的空间没有1T估计都不好意思开口了~~~

试用了一下360云盘的客户端,比较小清新(不是给360打广告~~~)。刚好UI这一块是我最不擅长的,于是萌发了练习模仿它的UI的念头~~~顺便把复习一下自定义控件的使用。

以下是完成的效果图,左边是官方的,右边是我模仿的:

   

  

还挺像的吧~~~

先介绍一个神器:UI Automator Viewer

这个SDK的tools文件夹或DDMS中都可以找到。

它可以很方便地查看UI的视图层级和UI控件的具体位置与实现。相当好用,有了它我们就不用去猜官方到底是怎么实现的、使用什么布局了。

具体实现

先从登录页面开始:

这个页面是比较简单的,从工具来看它的输入框是这么实现的:

一下子就清晰了。边框的线可以用一个“NinePath”图片来做:

关于NinePath的用法,可以查看官方教程:

http://developer.android.com/intl/zh-cn/tools/help/draw9patch.html

接下来第就是自动定义按钮样式了。

首先,直接用一个背景图片肯定是不够的,因为这样就没有按下的效果了。也就是说我们要把一系列的图片组成起来,让它们根据控件的不同状态去选择。比如我们可以这么写:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/btn_add_accounts_pressed" android:state_pressed="true"/>

    <item android:drawable="@drawable/btn_add_accounts_normal"/> 

</selector>

还是比较好理解的,但有一点要注意,一般要在最后给一个没有android:state_xxx的item。这个item表示当前面的状态都不匹配时,使用这个item。

这个xml一般放在res/drawable目录下。然后我们就它设置到按钮的背景上即可。

关于style的使用:

以前我写布局的时候是比较少用style的,但这显然是不利的。因为android引入style的目的就在于,提供一个类似于HTML的编写方式,让样式可以重复使用,减少重复代码。而且对于样式的修改,只需要改动一处即可。

我个人的觉得,如果一个样式只用到一次就没必要把它抽到styles.xml文件中,因为抽出样式会大大妨碍我们阅读布局文件的。但如果这个样式被重复使用了,那就很有必要了。

比如刚刚的边框,就可以写到一个style里面:

<style name="accountInputBorder">

         <item name="android:layout_width">match_parent</item>

         <item name="android:layout_height">36dp</item>

         <item name="android:layout_marginLeft">18dp</item>

         <item name="android:layout_marginRight">18dp</item>

         <item name="android:background">@drawable/login_border</item>

         <item name="android:gravity">center_vertical</item>

         <item name="android:paddingLeft">10dp</item>

         <item name="android:orientation">horizontal</item>

</style>

接下来是重点:

用到了SlidingMenu可以github上的一个开源项目:

https://github.com/jfeinstein10/SlidingMenu

左右切换可以用android-support-v4.jar提供的ViewPager,配合Fragment。

上边的指示器,360是这么实现的:

我估计它是把下边的蓝色指示条用一个RelativeLayout来盛放了。但这个是可以不用的。比如我的实现:

可以用一个TextView就实现,对于要让文字居中,只需要一个android:gravity=”center”即可。根据Android官方文档,减少视图的层级有利于程序的性能。

至于标识的切换,我们只需要给ViewPager设置一个OnPageChangeListener,然后在具体的方法中判断当前页面的编号,并改变相应的title颜色。

接下来我遇到的第一个麻烦,我该如何确定

的高度呢?(百度一下“gridview 高度”,发现好多人遇到这个问题)

显然我是没有办法使用“硬编码”的方式来实现的,因为android设备的屏幕分辨率太多,屏幕比例也很多奇葩的。

最后我只能通过动态计算的方式来实现:

第一个dp与px的转化,dp(也叫dip density-independent pixels),引入这个单位的原因应该是考虑到屏幕分辨率的原因,比如同一个100px * 100px的控件,在相同尺寸分辨率为320p和1080p上看,大小相差很多的。而px与dp是存在一定的比例关系的,如果分辨率为160,那么就是1px = 1dp。如果分辨率为240,就是1.5px = 1dp。具体的换算和理详细的介绍,请自选百度。

在代码在,我们只需要getResources().getDisplayMetrics().density,就可以获得这个比例系数了。

ListView其实没什么好说的,基本上都是通过的写法了,写过一次就知道怎么用了~~~

SlidingMenu的使用,github上的SlidingMenu是很容易用的,官方的Demo也相当给力。看一下再试一下,基本知道怎么用了。比如在我的工程中:

slidingMenu = new SlidingMenu(this);

slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE); // 滑动方式

slidingMenu.setShadowDrawable(R.drawable.shadow_right); // 阴影

slidingMenu.setShadowWidth(30); // 阴影宽度

slidingMenu.setBehindOffset(80); // 前面的视图剩下多少

slidingMenu.setMode(SlidingMenu.RIGHT); // 左滑出不是右滑出

slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);

slidingMenu.setMenu(R.layout.menu_frame); // 设置menu容器

FragmentManager fm = getSupportFragmentManager();

fm.beginTransaction().replace(R.id.menu_frame, new MenuFragment()).commit();

自定义进度条:

进度条和按钮不同,它是有两层的,使用的是layer-list这种drawable文件。它根据id来设置到不同的位置:

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item

        android:id="@android:id/background"

        android:drawable="@drawable/progress_bar_bg">

    </item>

    <item

        android:id="@android:id/progress"

        android:drawable="@drawable/progress_bar_progress"/>

</layer-list>

关于SlidingMenu的使用:

SlidingMenu是一个库项目,在我们的项目中引用,只需要在Properties中Add即可。

源码下载:

http://pan.baidu.com/share/link?shareid=1000621439&uk=1812042723

(原创)高仿360云盘android端的UI实现的更多相关文章

  1. PC 端 360 云盘初体验

    首先吐槽一下安装软件,文件名是 360wangpan,安装好后软件名称是"360云盘",好歹得统一下嘛,不然还以为下错了安装文件呢. 一般使用和其他网盘差不多,速度也还行,但还是没 ...

  2. C#制作高仿360安全卫士窗体<一>

    开始写这一系列博客之前先要向大家说声抱歉,放肆雷特建立很久却很少有更新.当然博客人气也不旺,大部分都是看的人多评论收藏的人少.一直想要改变这种状态,正好赶上了最近工作上做了一个高仿360安全卫士窗体. ...

  3. C#制作高仿360安全卫士窗体(四)- 水晶按钮

    项目越来越紧,我也乐此不疲.自从上次C#制作高仿360安全卫士窗体(三)出来之后,就开始有一些人在说为什么还在坚持写这么落后的东西.我想说的是,我是从事企业信息化工作的,所有程序都只对内部使用.所以只 ...

  4. [IT新应用]家用NAS,自建“360云盘”

    360云盘也快要离开了.同事中有人开始尝试使用群晖NAS.西数的NAS来自建云了. [功能对比] [选择参数] [口碑评价]

  5. 哭瞎!360云盘将关停,你的几十T照片和文件该怎么办

    IDO老徐刚得到了一个非常不开心的消息,360云盘将停止个人云盘服务...进行业务转型,在网盘存储.传播内容的合法性和安全性得到彻底解决之前不再考虑恢复,之后转型企业云服务. 而且之前共享的所有资料, ...

  6. 高仿一元云购IOS应用源码项目

    高仿一元云购IOS应用(高仿自一元云购安卓客户端) 本App因官方没有IOS客户端故开发,利用业务时间历时2个星期,终于开发完成,又因苹果的各大审核规则对此App的影响,又历时1个多月才终于成功上架, ...

  7. C#制作高仿360安全卫士窗体<二>

    继上次C#制作高仿360安全卫士窗体<一>发布之后响应还不错,我的博客放肆雷特也来了不少的新朋友,在这里先谢谢大家的支持!我自己也反复看了一下觉得对不起大家,写的非常乱而且很少文字介绍.在 ...

  8. C#制作高仿360安全卫士窗体(三)

    距上篇C#制作高仿360安全卫士窗体(二)也将近一个多月了,这个月事情还是像往常一样的多.不多我也乐在其中,毕竟我做的是我喜欢做的东西.今天特地抽空把怎么制作文本框写一下.同时也希望有爱好这些玩意的同 ...

  9. 为什么要关闭360云盘:新来的美工嫌我们logo太丑,所以就决定关闭了。这个理由怎么样

    新来的美工嫌我们logo太丑,所以就决定关闭了.这个理由怎么样曾经拥有的不要忘记:不能得到的更要珍惜:属于自己的不要放弃:已经失去的留作回忆.我刚来~~~嘿嘿~~ 久经考验的,忠诚的国际宅男主义战士, ...

随机推荐

  1. jdk1.8 HashMap红黑树操作详解-putTreeVal()

    以前也看过hashMap源码不过是看的jdk1.7的,由于时间问题看的也不是太深入,只是大概的了解了一下他的基本原理:这几天通过假期的时间就对jdk1.8的hashMap深入了解了下,相信大家都是对红 ...

  2. Lights inside a 3d Grid UVA - 11605(概率)

    题意: 给出一个n * m * h的空间 每次任意选择两个点  使得在以这两个点连线为对角线的空间的点的值 取反  (初始为0) 求经过k次操作后最后有多少点的值为1 解析: 遇到坐标分维去看  把三 ...

  3. Oracle JDK迁移指南

    Oracle JDK迁移指南 https://docs.oracle.com/en/java/javase/11/migrate/index.html#JSMIG-GUID-C25E2B1D-6C24 ...

  4. jasperReport和Ireport

    <!-- groovy --> <dependency> <groupId>org.codehaus.groovy</groupId> <arti ...

  5. 教你如何开启/关闭ubuntu防火墙

    目录  [隐藏]  1 安装方法 2 使用方法 3 推荐设置 4 详细使用说明 安装方法 sudo apt-get install ufw 当然,这是有图形界面的(比较简陋),在新立得里搜索gufw试 ...

  6. Selenium之WebDriver元素定位方法

    Selenium WebDriver 只是 Python 的一个第三方框架, 和 Djangoweb 开发框架属于一个性质. webdriver 提供了八种元素定位方法,python语言中也有对应的方 ...

  7. 【LOJ#6282】数列分块6

    题目大意:给定一个由 N 个数组成的序列,维护两种操作:单点询问,单点插入.N < 100000 题解:在块内维护一个链表,支持动态插入数字,同时对于非随即数据来说,若块的大小过大,需要重构. ...

  8. react中跨域请求天气预报接口数据

    背景故事:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能, 如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上 ...

  9. 02-HTML5新的input属性

    本节重点 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证 本节介绍新的输入类型: date datetime datetime-local email month numb ...

  10. SQL Server解析XML数据的方法详解

    --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name=&q ...