Android5.x新特性之ViewDragHelper拖动控件(3种方案)
来源:互联网 发布:那个是广联达计软件呀 编辑:程序博客网 时间:2024/05/21 14:59
+++++++++++++++++++++++++++++++方法1++++++++++++++++++++++++++++++++++++
activity_main.xml布局文件
<RelativeLayout 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" tools:context=".MainActivity" > <com.example.draghelper.CustomView android:layout_width="match_parent" android:layout_height="match_parent" > <View android:layout_width="100dp" android:layout_height="100dp" android:background="#FFFF0000" /> </com.example.draghelper.CustomView></RelativeLayout>
CustomView 代码注释很详细了
package com.example.draghelper;import android.content.Context;import android.support.v4.widget.ViewDragHelper;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Toast;public class CustomView extends LinearLayout {private ViewDragHelper mDragHelper;private Context context;/**************************************************** * 三个构造器 */public CustomView(Context context) {super(context);this.context = context;init();}public CustomView(Context context, AttributeSet attrs) {super(context, attrs);this.context = context;init();}public CustomView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);this.context = context;init();}/** * @params ViewGroup forParent 一个ViewGroup, 也就是ViewDragHelper将要用来拖拽谁下面的子view * @params float sensitivity 灵敏度,一般1.0f即可 * @params Callback cb 一个回调,用来处理拖动到位置 */private void init() {mDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragCallback());}/** *表示尝试捕获子view,这里一定要返回true, 返回true表示允许。 *child 尝试捕获的view *@param int pointerId 指示器id? 这里可以决定哪个子view可以拖动 */private class ViewDragCallback extends ViewDragHelper.Callback {@Overridepublic boolean tryCaptureView(View view, int pointerId) {return true;}/******************************************************************** * 这两个方法分别用来处理x方向和y方向的拖动的,返回值该child现在的位置。 * @param View child 被拖动到view * @param int left 移动到达的x轴的距离 * @param int dx 建议的移动的x距离 * clampViewPositionHorizontal的第二个参数是指当前拖动子view应该到达的x坐标。 * 所以按照常理这个方法原封返回第二个参数就可以了,但为了让被拖动的view遇到边界之后就不在拖动,对返回的值做了更多的考虑 */@Overridepublic int clampViewPositionHorizontal(View child, int left, int dx) {Toast.makeText(context, "left = " + left + ", dx = " + dx, 0).show();// 两个if主要是为了让viewViewGroup里if (getPaddingLeft() > left) {return getPaddingLeft();}if (getWidth() - child.getWidth() < left) {return getWidth() - child.getWidth();}return left;}/** * 处理竖直方向上的拖动 * * @param View * child 被拖动到view * @param int top 移动到达的y轴的距离 * @param int dy 建议的移动的y距离 */@Overridepublic int clampViewPositionVertical(View child, int top, int dy) {// 两个if主要是为了让viewViewGroup里if (getPaddingTop() > top) {return getPaddingTop();}if (getHeight() - child.getHeight() < top) {return getHeight() - child.getHeight();}return top;}/** * 当拖拽到状态改变时回调 * * @params 新的状态 */@Overridepublic void onViewDragStateChanged(int state) {switch (state) {case ViewDragHelper.STATE_DRAGGING: // 正在被拖动break;case ViewDragHelper.STATE_IDLE: // view没有被拖拽break;case ViewDragHelper.STATE_SETTLING: // fling完毕后被放置到一个位置break;}super.onViewDragStateChanged(state);}}/**************************************************************** * 一但返回True(代表事件在当前的viewGroup中会被处理) */@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {switch (ev.getAction()) {/** * 比如当你的手指在屏幕上拖动一个listView或者一个ScrollView而不是去按上面的按钮时会触发这个事件 */case MotionEvent.ACTION_UP:case MotionEvent.ACTION_DOWN:mDragHelper.cancel(); // 类似onTouch的ACTION_UP事件,清除break;}/** * 是否应该打断该MotionEvent的传递 */return mDragHelper.shouldInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {/** * 处理拦截到的事件 这个方法会在返回前分发事件 */mDragHelper.processTouchEvent(event);/** * return true 表示消费了事件。 */return true;}}
+++++++++++++++++++++++++++++++方法2++++++++++++++++++++++++++++++++++++
DragLayout
package com.example.demo;import android.content.Context;import android.support.v4.widget.ViewDragHelper;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.RelativeLayout;public class DragLayout extends RelativeLayout {private final ViewDragHelper mDragHelper;final ViewDragHelper.Callback mDragCallBack = new ViewDragHelper.Callback() {@Overridepublic int clampViewPositionHorizontal(View child, int left, int dx) {return left;};@Overridepublic int clampViewPositionVertical(View child, int top, int dy) {return top;};@Overridepublic void onViewPositionChanged(View changedView, int left, int top,int dx, int dy) {invalidate();}/** * 通过DragHelperCallback的tryCaptureView方法的返回值可以决定一个parentview中哪个子view可以拖动 */@Overridepublic boolean tryCaptureView(View arg0, int arg1) {return true;}};public DragLayout(Context context, AttributeSet attrs) {super(context, attrs);mDragHelper = ViewDragHelper.create(this, 1.0f, mDragCallBack);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return mDragHelper.shouldInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {mDragHelper.processTouchEvent(event);return true;}}
++++++++++++++++++++方法3++++++++++++++++++++++++
http://blog.csdn.net/u013210620/article/details/46378231
0 0
- Android5.x新特性之ViewDragHelper拖动控件(3种方案)
- Android5.x新特性之RecyclerGridView
- Android5.x新特性之RecyclerViewHorizontal、Vertical
- Android5.X新特性
- Android5.x新特性之 Toolbar和Theme的使用
- Android5.x新特性之CardView立体卡片--阴影、圆角
- Android5.x新特性之ViewOutlineProvider轮廓、阴影---setClipToOutline裁剪
- Android5.x新特性之 Toolbar和Theme的使用
- Android5.x新特性之 Toolbar和Theme的使用
- Android5.x新特性之 Toolbar和Theme的使用
- Android5.x新特性之 Toolbar和Theme的使用
- Android5.x 新控件之RecyclerView,CardView,Palette的使用
- Android5.x 新控件之RecyclerView,CardView,Palette的使用
- Android5.x 新控件之RecyclerView使用总结
- Android5.x 新控件之RecyclerView,CardView,Palette的使用
- Android5.x 新控件之RecyclerView,CardView,Palette的使用
- Android5.x新特性属性介绍
- ViewDragHelper之拖动加载(类似淘宝)
- C#去除数组重复的元素
- 总结自己在项目中遇到的问题
- 数据结构实验之图论六:村村通公路
- Android NDK学习之五、Application.mk简介
- node.js开发小项目的全过程 2 初识目录结构
- Android5.x新特性之ViewDragHelper拖动控件(3种方案)
- Android命令monkey测试
- 严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderLi
- Adaptec HBA和RAID 的兼容性报告中又添新成员—— HGST Helium HDD
- C#比较字符串
- leetcode Best Time to Buy and Sell Stock with Cooldown
- Android NDK学习之六、C++ 支持
- java报“非法字符: \65279 ”错误的解决方法
- CCBPM医院办公流程案例二