自定义可拖拽的父容器
来源:互联网 发布:iphone手机壳品牌知乎 编辑:程序博客网 时间:2024/06/06 13:59
/** * 可拖拽的父容器Layout,只需要将内容图片在xml布局文件中设置在父容器内即可 * 1.主要利用ViewDragHelper这个类来实现拖拽 * Created by CaiXi on 2016/8/23. */public class DragLayout extends RelativeLayout{ private ViewDragHelper mDragger; public DragLayout(Context context) { this(context, null); } public DragLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DragLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mDragger = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { 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; } @Override public int clampViewPositionVertical(View child, int top, int dy) { final int topBound = getPaddingTop(); final int bottomBound = getHeight() - child.getHeight(); final int newTop = Math.min(Math.max(top, topBound), bottomBound); return newTop; } @Override public int getViewHorizontalDragRange(View child) { return getMeasuredWidth() - child.getMeasuredWidth(); } @Override public int getViewVerticalDragRange(View child) { return getMeasuredHeight() - child.getMeasuredHeight(); } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { moveToSide(releasedChild); invalidate(); } }); } private void moveToSide(View view) { float top = view.getTop(); float bottom = getMeasuredHeight() - view.getBottom(); float right = getMeasuredWidth() - view.getRight(); float left = view.getLeft(); //上下滑动 if ((top < bottom ? top : bottom) / getMeasuredHeight() < (right < left ? right : left) / getMeasuredWidth()) { mDragger.settleCapturedViewAt(view.getLeft(), top < bottom ? 0 : getMeasuredHeight() - view.getMeasuredHeight()); } else { //左右滑动 mDragger.settleCapturedViewAt(left < right ? 0 : getMeasuredWidth() - view.getMeasuredWidth(), view.getTop()); } } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mDragger.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { mDragger.processTouchEvent(event); return false; } @Override public void computeScroll() { if (mDragger.continueSettling(true)) { invalidate(); } } @Override protected void onFinishInflate() { super.onFinishInflate(); for (int i = 0; i < getChildCount(); i++) { getChildAt(i).setClickable(true); } }}
根布局必须为framelayout 才能实现随意拖动效果
阅读全文
0 0
- 自定义可拖拽的父容器
- 自定义可拖拽的容器LinearLayout2
- 自定义容器
- 自定义spring容器--spring容器读取bean配置文件的原理
- 支持stl容器的gdb自定义命令
- 自定义简化版本的vector容器
- Android 自定义水平滚动的容器
- 自定义容器和字体大小
- 自定义容器和字体大小
- 自定义Map容器 comparator
- 自定义列表容器
- 自定义spring容器
- 自定义 ViewController 容器转场
- 自定义容器类ViewController
- 自定义视图控制器容器
- 自定义换行容器
- 自定义ExpandableListView容器
- 自定义容器顺序
- 第2章 运算符&表达式&数据类型
- 创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。 要求:自己设计函数的参数,返回值。
- 初学者(一)Dictionary,ConcurrentDictionary,SortedDictionary
- 插入排序
- AngularJS输入内容到公告窗,敏感字以*代替
- 自定义可拖拽的父容器
- 数据库的基本构成和原理-2
- 684. Redundant Connection
- codeforces F.Forbidden Indices后缀数组+LCP
- 搜索页面实现总结
- int *和int[]共同点和区别
- 手把手教你搭建FastDFS集群(下)
- 基本数据类型的隐式转换
- JAVA SE — Day 05