您的位置:首页 > 大数据 > 人工智能

How to Animate the Up-Button to Hamburger like in Gmail

2016-08-15 18:43 369 查看
在使用Drawerlayout时,Toolbar左上角的汉堡图标可以呼出侧栏菜单,当google推荐侧栏显示延伸到状态栏下面时,曾经的酷炫的汉堡变箭头动画就被盖住了,这么酷的动画似乎没有存在的必要。

gmail首页中,点击列表任意item都会进入邮件详情页面,这个过程Toolbar左上角的汉堡图标会变换成箭头图标。如下:



这样的话,当点击汉堡图标呼出侧栏菜单时,动画就可以去掉了。而且,在进入邮件详情时,如果想快速进入其它主菜单,可以直接在左侧屏幕边缘右滑呼出侧栏菜单,不用点返回再去呼出侧栏菜单,减少了操作层次。

接下来,可以尝试去实现这个效果。

在普通的DrawerLayout中,汉堡变箭头动画是随着DrawerLayout呼出而变化的。从源码ActionBarDrawerArrowToggle中可以找到,控制汉堡变箭头动画是由方法setProgress();控制的:

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
mSlider.setPosition(Math.min(1f, Math.max(0, slideOffset)));
}


public void setPosition(float position) {
if (position == 1f) {
setVerticalMirror(true);
} else if (position == 0f) {
setVerticalMirror(false);
}
setProgress(position);
}


onDrawerSlide是DrawerListener的回调方法,也就是但侧栏滑动过程时调用。mSlider是继承DrawerArrowDrawable的DrawerArrowDrawableToggle内部类对象,DrawerArrowDrawable则就是主要这个动画的实现类,实现方法就是setProgress()。
实现这个动画主要是调用mSlider.setPosition(some_float_between_0_and_1);所以可以这样实现:

1,由于mSlider是私有变量,我们可以通过反射取到这个私有变量,然后调用setPosition(some_float_between_0_and_1);由于是要实现动画,所以传递的参数可以用ValueAnimator.ofFloat(float... values)实现。

2,另外,可以稍微封装起来,这样可以不用反射,增加适用性。效果如下:



在stackoverflow上找到了另外一种方法,但是实际效果却不怎么好http://stackoverflow.com/questions/36631288/how-to-animate-the-up-button-to-hamburger-like-in-gmail第一个回答。

github地址:https://github.com/XYScience/DrawerToggleLikeGmail
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: