ViewDragHelper行为测试
来源:互联网 发布:国产电视剧推荐 知乎 编辑:程序博客网 时间:2024/04/26 04:50
只是简单记录一下
以后可能会实现一些效果
ItemTouchHelper之SwipeDismiss
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0822/3349.html
https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf
ViewDragHelper.CallBack中每个方法的用法
http://m.blog.csdn.net/blog/coder_nice/44678153
以后可能会实现一些效果
import android.content.Context;import android.graphics.Point;import android.support.v4.widget.ViewDragHelper;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;/** * http://blog.csdn.net/lmj623565791/article/details/46858663 * http://flavienlaurent.com/blog/2013/08/28/each-navigation-drawer-hides-a-viewdraghelper/ * http://blog.denevell.org/android-viewdraghelper-example-tutorial.html */public class VDHLayout extends LinearLayout{private View mDragView,mAutoBackView,mEdgeTrackerView; private ViewDragHelper mDragHelper; private Point mAutoBackOriginPos = new Point(); public VDHLayout(Context context, AttributeSet attrs) { super(context, attrs); mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() { //返回ture则表示可以捕获该view;可以根据传入的view参数决定哪些可以拖动 @Override public boolean tryCaptureView(View child, int pointerId) { //mEdgeTrackerView禁止直接移动// return child == mDragView || child == mAutoBackView; return true; } //控制水平拖动的边界 @Override public int clampViewPositionHorizontal(View child, int left, int dx) { final int leftBound = getPaddingLeft(); final int rightBound = getWidth() - child.getWidth() - leftBound; final int newLeft = Math.min(Math.max(left, leftBound), rightBound); return newLeft;// return left; } //控制垂直拖动的边界 @Override public int clampViewPositionVertical(View child, int top, int dy) { final int topBound = getPaddingTop(); final int bottomBound = getHeight() - child.getHeight() - topBound; final int newTop = Math.min(Math.max(top, topBound), bottomBound); return newTop;// return top; } //手指释放的时候回调 @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel);// if(yvel>0) {// mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), getMeasuredHeight()-releasedChild.getMeasuredHeight());// } else {// mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), 0);// }// invalidate();// //mAutoBackView手指释放时可以自动原路返回// if (releasedChild == mAutoBackView)// {// //调用settleCapturedViewAt回到初始的位置// mDragHelper.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y);// //需要invalidate()以及结合computeScroll方法一起// invalidate();// } } //在边界拖动时回调 @Override public void onEdgeDragStarted(int edgeFlags, int pointerId) { //在onEdgeDragStarted回调方法中,主动通过captureChildView对其进行捕获,该方法可以绕过tryCaptureView,所以我们的tryCaptureView虽然并为返回true,但却不影响 //注意如果需要使用边界检测需要添加上mDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);。 mDragHelper.captureChildView(mEdgeTrackerView, pointerId); } //让clickable=true的子控件也可以拖动 @Override public int getViewHorizontalDragRange(View child) { return getMeasuredWidth()-child.getMeasuredWidth(); } //让clickable=true的子控件也可以拖动 @Override public int getViewVerticalDragRange(View child) { return getMeasuredHeight()-child.getMeasuredHeight(); } //改变同一个坐标(x,y)去寻找captureView位置的方法。(具体在:findTopChildUnder方法中)@Overridepublic int getOrderedChildIndex(int index) {// TODO Auto-generated method stubreturn super.getOrderedChildIndex(index);}//true的时候会锁住当前的边界,false则unLock。@Overridepublic boolean onEdgeLock(int edgeFlags) {// TODO Auto-generated method stubreturn super.onEdgeLock(edgeFlags);}//当触摸到边界时回调。@Overridepublic void onEdgeTouched(int edgeFlags, int pointerId) {// TODO Auto-generated method stubsuper.onEdgeTouched(edgeFlags, pointerId);}//当captureview被捕获时回调@Overridepublic void onViewCaptured(View capturedChild, int activePointerId) {// TODO Auto-generated method stubsuper.onViewCaptured(capturedChild, activePointerId);}//当ViewDragHelper状态发生变化时回调(IDLE,DRAGGING,SETTING[自动滚动时])@Overridepublic void onViewDragStateChanged(int state) {// TODO Auto-generated method stubsuper.onViewDragStateChanged(state);}//当captureview的位置发生改变时回调@Overridepublic void onViewPositionChanged(View changedView, int left,int top, int dx, int dy) {// TODO Auto-generated method stubsuper.onViewPositionChanged(changedView, left, top, dx, dy);} }); //如果需要使用边界检测需要添加上 mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow();// mDragHelper = ViewDragHelper.create(this, 1.0f, new OurViewDragHelperCallbacks()); } @Override public boolean onInterceptTouchEvent(MotionEvent event) {// final int action = MotionEventCompat.getActionMasked(event);// if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {// mDragHelper.cancel();// return false;// } return mDragHelper.shouldInterceptTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { mDragHelper.processTouchEvent(event); return true; } @Override public void computeScroll() { super.computeScroll(); if(mDragHelper.continueSettling(true)) { invalidate();// ViewCompat.postInvalidateOnAnimation(this); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mAutoBackOriginPos.x = mAutoBackView.getLeft(); mAutoBackOriginPos.y = mAutoBackView.getTop(); } @Override protected void onFinishInflate() { super.onFinishInflate();// mHeaderView = findViewById(R.id.viewHeader);// mDescView = findViewById(R.id.viewDesc); mDragView = getChildAt(0); mAutoBackView = getChildAt(1); mEdgeTrackerView = getChildAt(2); } }
<com.mb.door.VDHLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="10dp" android:background="#FFff0000" android:gravity="center" android:text="I can be dragged !" /> <TextView android:layout_width="50dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="10dp" android:background="#FF00FF00" android:gravity="center" android:text="I can be dragged !" /> <TextView android:layout_width="100dp" android:layout_height="50dp" android:layout_gravity="center" android:layout_margin="10dp" android:background="#FF0000FF" android:gravity="center" android:text="I can be dragged !" /></com.mb.door.VDHLayout>
ItemTouchHelper之SwipeDismiss
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0822/3349.html
https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-b9456d2b1aaf
ViewDragHelper.CallBack中每个方法的用法
http://m.blog.csdn.net/blog/coder_nice/44678153
0 0
- ViewDragHelper行为测试
- DragLayout测试代码(ViewDragHelper)
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- 测试防火墙行为问题
- 杰出经理行为测试
- jasmine行为驱动,测试先行
- 基于测试行为,而不是测试实现
- rails 测试 单元测试 集成测试 行为测试 自动测试
- 80. 测试所需行为,而不是附带行为
- ToolBar&DrawerLayout基本结构
- 一个可以一直滚动的ImageView(可做视差效果)
- android5.0之CardView
- ScrollView做的上拉效果
- ZOJ 3955 想法
- ViewDragHelper行为测试
- support.v4之SlidingPaneLayout简单使用
- LinearLayout增加divider分割线
- CoordinatorLayout之Behavior使用
- android下载封装类Download,支持断点下载
- 实现RadioButton多行多列排列布局
- PathView实现炫酷SVG动画
- ItemTouchHelper之SwipeDismiss
- Design各控件的搭配使用