最近看到一个很NB的仿陌陌的客户端。不知道是哪个大神写的,在此谢过。本帖记录下学习的成果。。帖子最后给出这个demo,我肯定不收费,要是网站收费不要怪我。
1.WelcomeActivity有一个嵌套动画,上升的同时逐渐变大。
2.RegisterActivity注册过程有6步,填写完成一步后点击下一步进入另一个注册步骤,这里的实现方式是用ViewFlipper,包含6个ViewGroup,点击下一步直接执行mVfFlipper.showNext(),当然执行showNext之前要设置下过渡的动画
mVfFlipper.setInAnimation(this, R.anim.push_left_in);
mVfFlipper.setOutAnimation(this, R.anim.push_left_out);
3.主页面MainTabActivity是用TabActivity做的。有5个标签。这里只做了第一个标签页面。也就是附近的人和群组的列表页面NearByActivity。NearByActivity主要是两个Fragement,NearByPeopleFragment和NearByGroupFragment。也就是MainTabActivity主要框架是用TabActivity实现的,然后子Activity的页面交替是用Fragement做的。
4.这个项目的listView全都是下拉刷新ListView---MoMoRefreshListView。实现过程是这样的:设置一个滚动监听器setOnScrollListener。在onScroll方法中判断是不是到顶了:判断方法很简单,onScroll回调方法第二个参数firstVisibleItem就是判断当前完整显示的item的第一个item的index。所以只要firstVisibleItem为0,就说明已经到顶了。同理还能判断是不是已经到底了。然后还监听touch事件回调onTouch方法,在move方法中如果到顶了,就把listView的header的padding重新设置一下,控制这个header露出来的高度。
其它的事就是header的各种动画的绘制了,比如上箭头在露出一定高度后变成下箭头,松开手指后loding动画开始播放,也是两个动画的重叠,效果是有一个匀速转动的效果加一个加速转动的效果。
5.点击某个用户进入用户详情页OtherProfileActivity,上面有一个2行4列的照片墙并能左右滚动。实现方式是自定义了一个LinearLayout的子类UserPhotosView,里面包含了一个ViewPager,每一页又包含了一个2行4列的布局。
6.点击用户动态进入用户动态页OtherFeedListActivity,点击其中一项又进入FeedProfileActivity,这两个页面都相对简单,用的上面说的下拉刷新ListView。
7.从个人详情页面点击对话进入ChatActivity,首先是一个类似微信的左右显示的对话列表页,这个列表页的实现方式作者用了一个MessageItem进行封装,ChatAdapter中返回这个对象包含的view。但是并没有重用convertView,所以性能并不好。重点记录一下ScrollLayout这个类。聊天页面底下有一个类似PagerView的控件,实现了控件随手指滑动而滑动,手指松开根据滑动的距离确定是往哪个页面滚动,而且可以根据手指滑动的速度判断往哪个页面滚动。这个控件就是用ScrollLayout实现的。
8.ScrollLayout:
①首先讲解VelocityTracker,这个类是一个测量速度的类,用起来比较简单,只要在onTouchEvent中mVelocityTracker.addMovement(event),就 可以在up的时候测量你手指的滑动速度了。
②然后是Scroller,这个类是用来进行缓慢移动的。注意这个类本身和view完全无关,它只是一个包装类,包装了一些参数用于记录view滚动时候的各 种临时数据(比如x坐标,y坐标,滚动了多长时间等),我们完全是用view去控制scroll而不是用scroll去控制view。这个类的主要方法有两个:
startScroll (int startX, int startY, int dx, int dy, int duration): 开始一个动画控制,由(startX , startY)在duration时间内前进(dx,dy)个单 位,到达坐标为 (startX+dx , startY+dy)处。
computeScrollOffset: 根据当前已经消逝的时间计算当前的坐标点,保存在mCurrX和mCurrY值中。如果动画还没结束,返回true。
这个类肯定是和view类的computeScroll方法一起使用的,这就是上面说的是用view去控制Scroller,控制方式就是在computeScroll中根据Scroller 记录的当前的x,y坐标,scrollTo到指定的位置。而这个computeScroll方法是在draw方法中调用的,所以上面的startScroll方法执行后,必须要调用 一遍invalidate方法,然后就会执行到computeScroll,就可以根据当前进度滚动view了。
这个类的其它一些就好理解了,move的时候根据move的距离滚动scroll一定的距离就实现了随手指滑动view滚动。然后onInterceptTouchEvent方法要保证滚动的时候返回ture执行自己的onTouch方法,点击输入等情况要返回false,让子view执行onTouch方法。
9.ChatActivity里有个表情输入的解决方案很不错,实现原理比较简单,就是两个GridView分别显示两个不同的表情包,然后点击了就将输入框的内容变一下。输入框显示表情的方式作者也有很好的实现。具体看EmoteInputView和EmoticonsEditText吧。
10.网络loading的弹出框效果不错,就是一个陌陌的logo不断的前后翻转。现在看来这个实现比较简单。主要类是FlippingLoadingDialog和FlippingImageView。FlippingLoadingDialog包含一个FlippingImageView,FlippingImageView里包含了一个翻转的动画,启动dialog时候,在onAttachedToWindow和onSizeChanged方法会播放动画,在onDetachedFromWindow会停掉动画。
11.其它可能还会有细节,最大的感觉就是各种动画的运用,各种手势算法的配合,还有各种自定义组件的运用。总之UI不是好学的东西,通过这个项目确实获益匪浅。稍微总结在这里,希望大家都能回去好好看看这个demo,很不错。
1.WelcomeActivity有一个嵌套动画,上升的同时逐渐变大。
2.RegisterActivity注册过程有6步,填写完成一步后点击下一步进入另一个注册步骤,这里的实现方式是用ViewFlipper,包含6个ViewGroup,点击下一步直接执行mVfFlipper.showNext(),当然执行showNext之前要设置下过渡的动画
mVfFlipper.setInAnimation(this, R.anim.push_left_in);
mVfFlipper.setOutAnimation(this, R.anim.push_left_out);
3.主页面MainTabActivity是用TabActivity做的。有5个标签。这里只做了第一个标签页面。也就是附近的人和群组的列表页面NearByActivity。NearByActivity主要是两个Fragement,NearByPeopleFragment和NearByGroupFragment。也就是MainTabActivity主要框架是用TabActivity实现的,然后子Activity的页面交替是用Fragement做的。
4.这个项目的listView全都是下拉刷新ListView---MoMoRefreshListView。实现过程是这样的:设置一个滚动监听器setOnScrollListener。在onScroll方法中判断是不是到顶了:判断方法很简单,onScroll回调方法第二个参数firstVisibleItem就是判断当前完整显示的item的第一个item的index。所以只要firstVisibleItem为0,就说明已经到顶了。同理还能判断是不是已经到底了。然后还监听touch事件回调onTouch方法,在move方法中如果到顶了,就把listView的header的padding重新设置一下,控制这个header露出来的高度。
其它的事就是header的各种动画的绘制了,比如上箭头在露出一定高度后变成下箭头,松开手指后loding动画开始播放,也是两个动画的重叠,效果是有一个匀速转动的效果加一个加速转动的效果。
5.点击某个用户进入用户详情页OtherProfileActivity,上面有一个2行4列的照片墙并能左右滚动。实现方式是自定义了一个LinearLayout的子类UserPhotosView,里面包含了一个ViewPager,每一页又包含了一个2行4列的布局。
6.点击用户动态进入用户动态页OtherFeedListActivity,点击其中一项又进入FeedProfileActivity,这两个页面都相对简单,用的上面说的下拉刷新ListView。
7.从个人详情页面点击对话进入ChatActivity,首先是一个类似微信的左右显示的对话列表页,这个列表页的实现方式作者用了一个MessageItem进行封装,ChatAdapter中返回这个对象包含的view。但是并没有重用convertView,所以性能并不好。重点记录一下ScrollLayout这个类。聊天页面底下有一个类似PagerView的控件,实现了控件随手指滑动而滑动,手指松开根据滑动的距离确定是往哪个页面滚动,而且可以根据手指滑动的速度判断往哪个页面滚动。这个控件就是用ScrollLayout实现的。
8.ScrollLayout:
①首先讲解VelocityTracker,这个类是一个测量速度的类,用起来比较简单,只要在onTouchEvent中mVelocityTracker.addMovement(event),就 可以在up的时候测量你手指的滑动速度了。
②然后是Scroller,这个类是用来进行缓慢移动的。注意这个类本身和view完全无关,它只是一个包装类,包装了一些参数用于记录view滚动时候的各 种临时数据(比如x坐标,y坐标,滚动了多长时间等),我们完全是用view去控制scroll而不是用scroll去控制view。这个类的主要方法有两个:
startScroll (int startX, int startY, int dx, int dy, int duration): 开始一个动画控制,由(startX , startY)在duration时间内前进(dx,dy)个单 位,到达坐标为 (startX+dx , startY+dy)处。
computeScrollOffset: 根据当前已经消逝的时间计算当前的坐标点,保存在mCurrX和mCurrY值中。如果动画还没结束,返回true。
这个类肯定是和view类的computeScroll方法一起使用的,这就是上面说的是用view去控制Scroller,控制方式就是在computeScroll中根据Scroller 记录的当前的x,y坐标,scrollTo到指定的位置。而这个computeScroll方法是在draw方法中调用的,所以上面的startScroll方法执行后,必须要调用 一遍invalidate方法,然后就会执行到computeScroll,就可以根据当前进度滚动view了。
这个类的其它一些就好理解了,move的时候根据move的距离滚动scroll一定的距离就实现了随手指滑动view滚动。然后onInterceptTouchEvent方法要保证滚动的时候返回ture执行自己的onTouch方法,点击输入等情况要返回false,让子view执行onTouch方法。
9.ChatActivity里有个表情输入的解决方案很不错,实现原理比较简单,就是两个GridView分别显示两个不同的表情包,然后点击了就将输入框的内容变一下。输入框显示表情的方式作者也有很好的实现。具体看EmoteInputView和EmoticonsEditText吧。
10.网络loading的弹出框效果不错,就是一个陌陌的logo不断的前后翻转。现在看来这个实现比较简单。主要类是FlippingLoadingDialog和FlippingImageView。FlippingLoadingDialog包含一个FlippingImageView,FlippingImageView里包含了一个翻转的动画,启动dialog时候,在onAttachedToWindow和onSizeChanged方法会播放动画,在onDetachedFromWindow会停掉动画。
11.其它可能还会有细节,最大的感觉就是各种动画的运用,各种手势算法的配合,还有各种自定义组件的运用。总之UI不是好学的东西,通过这个项目确实获益匪浅。稍微总结在这里,希望大家都能回去好好看看这个demo,很不错。