这个就是写一个自定义viewgroup,原理是继承自一个横向 scrollView,布局的时候,将主页和菜单页写在这个自定义控件的XML内部就行。 更具体的层级关系是,自定义控件--linealayout(水平)--菜单页、主页 。
这个效果的要点如下:
1.重写 onFinishInflate 方法,此方法会在XML被加载完毕的时候执行,执行在onMeause之前。主要是可以在此方里面,重新定义子控件的长宽。 下面的代码,就是重新指定了主页与菜单页的大小。
2.重写 onTouchEvent 方法, 是为了让滑到一半时松手,能自动滚到最有可能的方向。
3. 快速滑动的处理,这里用了一个 GestureDetector 类,用来拦截快捷滑动。
这里只是设置好了这个监听而以,最后还有把事件传给这个类,如果快速滑动,被拦截,就会执行内部的onFling方法,onFling中返回true,就表示此事件被消费,返回false,就继续走onTouchEvent事件就行了。
4. 比如说现在是 菜单页已经完全显示, 此时主页会有一点点在屏幕右边,单击那个区域,我们要滚回到主页,这里我们就需要让父viewgroup,就是这个自定义VIEW拦截事件了!
这里我们重写了onInterceptTouchEvent! 这里返回true时,子view就不会再有事件了。 并且会调用this的onTouchEvent方法,很多时候,我们还要在这里作一个兼容,让this的onTouchEvent也不执行,否则会出错。
5.滑动过程中什么透明变化、比例变化,当然就是在 onScrollChange中写喽,这里注意用到了 ViewCompat这个非常好用的类,可以直接控制VIEW的一些基本属性:
设置基地就是放大缩小比例的中心点! 最后一个setTraslationX 就是将X轴平移,很好理解嘛,作一些效果。
6.最后一个需求。 当向左滑时,主页的透明度会有一个灰色越来越明显。 如果是在布局里写一个view,增加其透明,这样就太麻烦了。这里的处理是,我们先将主页view在父布局中remove掉,将主页view与灰色view新加入到一个relativelayout中,再将relativelayout add进父布局!
这里要注意的是,新new出的relativeLayout 要给他设置宽高,这个宽高就是原来那个removeView的控件的宽高,直接获取 mContetView的参数置入就行了!
网友评论