Android View getLeft() 和 getTop() 研究
在今天的开发中,遇到了一个之前没有关注过的细节。那就是我用view.getTop()
来获取view距离屏幕顶部高度,结果发现得到的数值和理论不一致。我们来举个例子吧,比如我们有如下的布局:
1 |
|
Android View getLeft() 和 getTop() 研究
在今天的开发中,遇到了一个之前没有关注过的细节。那就是我用view.getTop()
来获取view距离屏幕顶部高度,结果发现得到的数值和理论不一致。我们来举个例子吧,比如我们有如下的布局:
1 |
|
“饿了么”导航Tab栏悬浮的效果图。
可以看到上图中的“分类”、“排序”、“筛选”会悬浮在app的顶部,状态随着ScrollView(也可能不是ScrollView,在这里姑且把这滑动的UI控件当作ScrollView吧)的滚动而变化。像这种导航Tab栏悬浮的作用相信大家都能体会到,Tab栏不会随着ScrollView等的滚动而被滑出屏幕外,增加了与用户之间的交互性和方便性。
看到上面的效果,相信大家都跃跃欲试了,那就让我们开始吧。
好了,根据上面的就得到了对ScrollView滑动的监听了。接下来要思考的问题就是如何让Tab栏实现悬浮的效果呢?这里给出的方法有两种,第一种就是使用WindowManager来动态地添加一个View悬浮在顶部;第二种就是随着ScrollView的滑动不断重新设置Tab栏的布局位置。
效果:
是不是觉得有新意多了呢?那就一起来看看吧,先简单讲述一下思路:首先波浪的形状主要是根据三角函数决定的。三角函数相信大家在中学的课程中学习过吧。通用公式就是f(x)=Asin(ωx+φ) + b。其中A就是波浪的振幅,ω与时间周期有关,x就是屏幕宽度的像素点,φ是初相,可以让波浪产生偏移,最后的b就是水位的高度了。最后根据这公式算出y坐标,用canvas.drawLine(startX, startY, stopX, stopY, paint);
来画出竖直的线条,这样就形成了波浪。
效果图:
可以看出来,我们实现的和QQ的效果相差无几。下面就是源码时间了。
先来看一下ListView的item的slip_item_layout.xml
:
1 |
|
在Android开发中,我们都不可避免地要使用SQLite数据库来存储数据。但是Android提供给我们的API在操作数据库中并不简洁,而且更重要的一点是,在读取数据时无法把读到的字段直接映射成对象。于是在这种情况下,产生了许多ORM (对象关系映射 英语:Object Relational Mapping) 的第三方框架,比如greenDAO、ActiveAndroid、ormlite等。说到ORM,在web开发中就有Hibernate、MyBatis等框架提供使用。
根据 greenrobot 官方的介绍,greenDAO是一款轻量,快速,适用于Android数据库的ORM框架。具有很高的性能以及消耗很少的内存。其他的优点和特性就不在这里一一介绍了,想要了解的人可以去访问它的项目地址:https://github.com/greenrobot/greenDAO。
效果如下:
gif的效果可能有点过快,在真机上运行的效果会更好一些。我们主要的思路就是利用属性动画来动态地画出选中状态以及对勾的绘制过程。看到上面的效果图,相信大家都迫不及待地要跃跃欲试了,那就让我们开始吧。
自定义View的第一步:自定义属性。
1 |
|
从早期的 SlidingMenu 再到 AndroidResideMenu 最后到Android自带的DrawerLayout,无处不体现着侧滑菜单的诱人魅力。侧滑菜单可以拓展app的内容,充分利用手机屏幕,增加程序的可玩性。
看完了上面的gif,想不想自己也写一个呢,那还等什么,一起来看看喽。
效果:
看完上面的效果图,大家一定都迫不及待地想要试一试了,那就让我们来动手吧。
首先我们定义一个实体类DropLook:
1 | /** |
大家都知道一般我们使用的UI控件都是继承自共同的父类——View。所以View这个类应该掌管着onTouch事件的相关处理。那就让我们去看看:在View中寻找Touch相关的方法,其中一个很容易地引起了我们的注意:dispatchTouchEvent(MotionEvent event)。根据方法名的意思应该是负责分发触摸事件的,下面给出了源码:
1 | /** |
之前在学习自定义View的时候看到鸿洋_的 《Android 打造形形色色的进度条 实现可以如此简单》 中自带百分比的进度条,于是照着例子自己实现了一下。下面是View的样子:
大家都知道自定义View的主要步骤: