看到人人网的客户端,不管是ios还是android都有好看的侧边栏滑动的效果,点击上部的按钮可以滑动展开侧边的目录。觉得这个效果比较炫,所以研究了一下实现的方法。关于滑动,实现的思路大概有两种, 一种是利用ScrollView的滑动效果来做,另外一种就是直接使用Animation来作了。
1、使用ScrollView来实现
ScrollView的使用是规则是,当View的Size大于屏幕的边界的时候就可以滚动。实际上,ScrollView并不仅仅只能做这些事情,我们可以对它的属性进行一些设置,让它摇身一变成为我们想要的侧边栏:关掉Scroll Bar,去掉Edge的效果,这样ScrollView看起来就和普通的View没有太大的区别了,接下来的工作就是在ScrollView中填充两个View,一个是我们所需要的侧边栏,另一个就是程序的主内容了,当侧边栏出现的时候主内容要被挤到屏幕外面去。难点来了,这样的要求在layout文件中是定义不出来的。这里我们选择动态的生成这两个View并动态的根据屏幕的大小加载到ScrollView中去。
  @Overridepublic void onGlobalLayout() {    parent.getViewTreeObserver().removeGlobalOnLayoutListener(this);     w = scrollView.getMeasuredWidth();    h = scrollView.getMeasuredWidth();     LayoutInflater inlfater = LayoutInflater.from(parent.getContext());    app = inlfater.inflate(R.layout.slide_app, null);    menu = inlfater.inflate(R.layout.slide_menu, null);    parent.addView(menu, (int) (rate * w), h);    parent.addView(app, w, h);}

通过这样 动态的加载我们可以想象此时View的状态应该是app和menu这两个View并排的出现在ScrollView中,这样我们只要控制ScrollVIew的滑动就可以控制在屏幕中显示的内容了。
@Overridepublic void onClick(View v) {    if (slideOut) {        // hide the menu        System.out.println("hide ");        scrollView.smoothScrollBy((int) (-rate * w), 0);    } else {        // show menu        System.out.println("show ");        scrollView.smoothScrollBy((int) (rate * w), 0);    }     slideOut = !slideOut;} 

基本的效果已经实现了,但是LZ随后又发现了一个问题,就是表面上看到的ScrollView虽然是很正常的状态,但是不要忘了我们动态加载的View已经超过了屏幕的宽度,LZ尝试滑动屏幕发现居然是可以滑动的,这点肯定是不能接受的。LZ翻了一下API,找到一个WorkAround的方法,就是禁止ScrollView的touch事件,这样ScrollView就被阉割了不能接受用户的touch事件,自然就不能被滑动了。
到了这里,效果基本就实现了,但是LZ认为这样WorkAround的方式并不是很优雅,我们可以考虑另外一种实现方式。
2、使用动画来实现
Android提供动画的支持,我们可以快速的定义我们的动画,Android支持的动画中就包括滑动,那么这里我们可以把app和menu看作两个碟在一起的View,app遮盖menu。当我们要显示menu的时候只要把app用动画滑到指定的位置就可以了。
 @Overridepublic void onClick(View v) {    final int w = app.getMeasuredWidth();    final int h = app.getMeasuredHeight();     Animation animation = null;    if (slideOut) {        // hide        animation = new TranslateAnimation(0, -(w * rate), 0, 0);    } else {        // show        animation = new TranslateAnimation(0, w * rate, 0, 0);    }     animation.setFillAfter(true);    animation.setDuration(500);    app.startAnimation(animation);}

启动应用发现滑动效果是出来了,但是LZ发现一个很有意思的问题,当menu被滑出来之后,再点击app上的button没有反应了,而点击app原来那个button的位置却可以触发注册的点击事件。这是为什么呢?原来animation只是引起了app的位移,app的大小没有变化,所以不会触发重新布局app,所以我们看到的app是被移动了,但是它原来的sub view还在原来的地方,这时我们要手动的让app来重新布局,调用app的layout方法。
  @Overridepublic void onAnimationEnd(Animation animation) {    if (!slideOut) {        app.layout((int) (w * rate), 0, (int) (w * rate + w), h);    } else {        app.layout(0, 0, w, h);    }    app.clearAnimation();    slideOut = !slideOut;}

更多相关文章

  1. Android中长TextView实现跑马灯效果
  2. Android(安卓)5.0+ 自定义普通按钮的ripple波纹效果
  3. Android(安卓)Facebook-Rebound弹性动画
  4. 2018-01-22 Android(安卓)屏幕完美适配方案
  5. Android(安卓)动画分析之翻转效果
  6. Android翻页效果原理实现之翻页的尝试
  7. ANDROID GridView 分页平滑滑动 效果的实现(基于android TV遥控器
  8. ListView和Adapter的基础知识
  9. Android(安卓)Fragment生命周期——多屏幕支持

随机推荐

  1. Android/Linux 系统添加对多点触摸屏的支
  2. 给 Android(安卓)初学者的 Gradle 知识普
  3. Android实践——密码本SecretBook
  4. 团队Android小作品Chinchilla Guitar(琴琪
  5. [置顶] 【Android】ListView、RecyclerVi
  6. Android开发:教你开发TVBox应用时使用遥控
  7. 第五章 全局大喇叭---详解广播机制(Broadc
  8. Android使用RadioButton结合ListView显示
  9. Android(安卓)实现视屏播放器、边播边缓
  10. Android(安卓)微信支付快速集成案例及有