Android自定义拖拉窗控件

    在项目中有这样一个需求,一张全屏的地图,上面覆盖一个窗口显示路线列表,而这个窗口是个拖拉窗,可以全屏,半屏,和不显示,这个跟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();
		}


你可能感兴趣的:(Android自定义拖拉窗控件)