Android自定义拖拉窗控件

来源:互联网 发布:单片机课程设计目的 编辑:程序博客网 时间:2024/06/05 23:42

    在项目中有这样一个需求,一张全屏的地图,上面覆盖一个窗口显示路线列表,而这个窗口是个拖拉窗,可以全屏,半屏,和不显示,这个跟IOS7和android中的消息栏有点像,只不过可以拖到中间。Android中有一个SlidingDrawer控件,但无法满足上面说的三个状态,自己就写了一个,把demo简单介绍一下。

    实现原理还是比较简单,一个FrameLayout做容器,里面直接显示地图,然后再在上面放一个Layout做为drawer layout,剩下的就是让这个drawer layout在处理onTouch事件,拖动时改变位置,点击时改变状态等。需要注意的一个问题是,手指离开屏幕后,drawer layout能自动滑动到对应的状态位置(底部,中间,上面),此时只能使用property animation或者自己去重绘动画,如果使用属性动画的话,程序又要支持低版本,可以使用nineoldandroid兼容包(属性动画api11才开始支持)。

demo github地址:https://github.com/dfqin/SlidingDrawer


部分代码:

private void move2Bottom(int duration){if(duration < 100){duration = 100;Log.e("", "move2Top(int duration, boolean isUp) pass the wrong duration");}state = DrawerState.Bottom;ObjectAnimator ani;if(duration == FAST_ANIMATION_DURATION || duration < 200){ani = ObjectAnimator.ofFloat(drawer, "translationY", 0, containerHeight - drawer.getTop() - DRAG_BAR_VALUE ).setDuration(duration);} else {int offTemp = containerHeight - drawer.getTop() - DRAG_BAR_VALUE;ani = ObjectAnimator.ofFloat(drawer, "translationY", 0, offTemp, offTemp - ANIMATION_BOUND_VALUE, offTemp ).setDuration(duration);}ani.addListener(this);ani.start();}


0 0