简单的DragView(二)

实现功能:拖动view之后返回到原位置(平滑返回而非瞬时移动)

分析:用到Scroller类的computeScroll()方法,它是Scroller类的核心方法,这里牵涉到它的循环调用;

1、重写computeScroll():

super.computeScroll();

if(mScroller.computeScrollOffset())

{

((View)getParent).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

invalidate();

}

最后一定要加上invalidate()来实现循环调用的目的,因为它的调用过程是这样的:

invalidate() -> draw() -> computeScroll()    懂我意思吧

 2、判断触摸事件:

View viewGroup = (View)getParent; 

Up: mScroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY, -viewGroup.getScrollX(), -viewGroup.getScrollY(), 300);

invalidate(); //循环computeScroll()的起点

break;

设置的startScroll()的偏移量为其相反数,就平滑的滑回去了。

这里设置了duration参数为300, 可以忽略的, 测试发现好平滑呀hhh

 

DragLinearLayout是一个LinearLayout, 他可是其子View在其范围内可拖动、可交换位置。默认情况下,子View是不可拖动的,你需要调用DragLinearLayout.setViewDraggable(child, child)方法让其可拖动。项目地址:https://github.com/justasm/DragLinearLayout 效果图:如何使用和使用LinearLayout一样:                        2. 让子View可拖动默认情况下子View是不可拖动的,你需要调用dragLinearLayout.setViewDraggable()让子View变为可拖动的。DragLinearLayout dragLinearLayout = (DragLinearLayout) findViewById(R.id.container); //让子view可拖动,默认是不能拖动的         for(int i = 1; i < dragLinearLayout.getChildCount(); i ){             View child = dragLinearLayout.getChildAt(i);             dragLinearLayout.setViewDraggable(child, child);          }可以动态添加可拖动子viewfinal View view = View.inflate(context, R.layout.view_layout, null); dragLinearLayout.addDragView(viewview.findViewById(R.id.view_drag_handle));   // ..   dragLinearLayout.removeDragView(view);使用OnViewSwapListener检测子view之间的排序变化事件:dragLinearLayout.setOnViewSwapListener(new DragLinearLayout.OnViewSwapListener() {     @Override     public void onSwap(View firstView, int firstPosition,             View secondView, int secondPosition) {         // update data, etc..     } });当在ScrollView中使用DragLinearLayout的时候,如果你想在拖拽的时候ScrollView也能滚动,需要调用setContainerScrollView(Scroll
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值