Android进阶-控件的拖拽

原创 2015年11月19日 20:23:24

Android进阶-控件的拖拽

需求:使控件可以再屏幕上自由拖拽。

思路:
- 可以在 View.setOnTouchListener()中监听控件的触摸事件,在触摸事件中我们应做以下处理
- 记下控件的起始坐标 (ACTION_DOWN)
- 计算控件的移动偏移量 (ACTION_MOVE)
- 更新控件的位置 (ACTION_MOVE)
- 使用View.layout()
- 重新初始化控件起始坐标,以便下次更新

示例代码要点:

  1. View.layout()并不可以在Activity的onCreate()方法中调用

这是因为Android系统在绘制界面时要经过3个过程: onMeasure(), onLayout(), onDraw()
可以联想到View.layout()是在onLayout()时调用的. Activity的onCreate()方法可定是在这三个方法之前调用的
如果你在onCrate()方法中就给控件设置了布局参数, 到后面这三个方法调用时也会被覆盖吧(我猜的)
所以View.layout()不能再onCreate()方法中调用

  1. 那么如何在onCreate()方法中设置控件的布局位置呢?(就类似于代码布局了)

    其实很简单,我们只需在android系统绘制界面之前,改一下布局参数就可以了,
    即调用View.setLayoutParams(layoutParams);// 重新设置位置,

  2. 上面两点与下面代码并没什么关系,下面代码应注意

    1. ivDrag.layout(l, t, r, b); 的4个参数, 分别代表

    l:屏幕左边界到控件左边界的距离
    t:屏幕上边界到控件上边界的距离
    r:屏幕左边界到控件右边界的距离
    b:屏幕上边界到控件下边界的距离

  3. 在使用ivDrag.layout(l, t, r, b);动态更新控件位置时,不要忘记判断与屏幕边界的问题
    例如:控件右边界不能超出屏幕右边界。如果超出, 控件的显示可能会和实际有差别
  4. 控件位置更新完之后,应重新初始化,控件的坐标起点
  5. rawX代表在屏幕坐标系下的X坐标
public class DragViewActivity extends Activity {


    private ImageView ivDrag;

    private int startX;
    private int startY;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drag_view);
        ivDrag = (ImageView) findViewById(R.id.iv_drag);

        // 设置触摸监听
        ivDrag.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // 初始化起点坐标
                    startX = (int) event.getRawX();
                    startY = (int) event.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    int endX = (int) event.getRawX();
                    int endY = (int) event.getRawY();

                    // 计算移动偏移量
                    int dx = endX - startX;
                    int dy = endY - startY;

                    // 更新左上右下距离
                    int l = ivDrag.getLeft() + dx;
                    int r = ivDrag.getRight() + dx;
                    int t = ivDrag.getTop() + dy;
                    int b = ivDrag.getBottom() + dy;

                    // 判断是否超出屏幕边界, 注意状态栏的高度
                    if (l < 0 || r > winWidth || t < 0 || b > winHeight - 20) {
                        break;
                    }

                    // 更新界面
                    ivDrag.layout(l, t, r, b);

                    // 重新初始化起点坐标
                    startX = (int) event.getRawX();
                    startY = (int) event.getRawY();
                    break;
                case MotionEvent.ACTION_UP:
                    break;
                default:
                    break;
                }
                return true;
            }
        });
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android5.x新特性之ViewDragHelper拖动控件(3种方案)

+++++++++++++++++++++++++++++++方法1++++++++++++++++++++++++++++++++++++ activity_main.xml布局文件 ...
  • u013210620
  • u013210620
  • 2015年11月27日 18:14
  • 1010

Android-满屏幕拖动的控件

今天做个有意思的效果吧,控件的拖拽,先看一下模拟器运行: 也就是,用户可以随心所欲的拖动控件,布局文件很简单就是一个Button控件: xml version="1.0...
  • SuperCopa
  • SuperCopa
  • 2016年08月22日 11:12
  • 3074

Android - 开发实例(10):让控件变得可拖拽

其实要实现拖拽的控件是非常简单的事情,和让控件支持点击一样简单!我们只需要对View类的 onDragEvent() dispatchDragEvent() setOnDragListener(...
  • LyL_Studio
  • LyL_Studio
  • 2014年03月25日 10:58
  • 1777

安卓UI控件拖拽的几种方法

上一篇简单的讲解了安卓listview控件的一些简单的用法,这一次我们按照群英传的思路看一看安卓UI控件拖拽的实现方法。 安卓控件的拖拽(这里用词可能不太专业)可归纳为一下几个动作:1.普通拖拽,改变...
  • u010921701
  • u010921701
  • 2016年05月10日 16:27
  • 1612

控件拖拽置换位置

简单的一个控件拖拽交换位置Demo,有些场景下会用到,关于此类功能网上有很多例子,而且Google官方API中也有相应的接口,对这种业务需求进行了一定逻辑封装。这里没有采用官方接口,单纯的从触摸事件入...
  • apple_zdl
  • apple_zdl
  • 2015年08月12日 16:59
  • 2539

可在屏幕上随意拖动的控件

源码下载地址:1.首先新建一个工具类MoveViewUtils,创建一个静态方法setMoveView(Context context, final View view)来设置要移动的控件,在方法中给...
  • qq_20489601
  • qq_20489601
  • 2016年08月01日 11:30
  • 327

Android自定义View(五)ViewDragHelper完全解析 自定义ViewGroup神器

转自:http://blog.csdn.net/lmj623565791/article/details/46858663 一、概述 在自定义ViewGroup中,很多效果都包含用户手指去...
  • TokgoLiang
  • TokgoLiang
  • 2016年01月08日 11:00
  • 283

使控件可拖拽

/** * 监听控件移动状态 * @param view 控件 */ private void iniListener(final View view) { ...
  • github_36615485
  • github_36615485
  • 2016年11月28日 00:55
  • 220

Android实现控件拖动效果

今天实现一个控件的拖动效果,效果图如下: 不多说,下面说下实现步骤: 1.将布局文件创建: 这是包裹的内容 android:id="@+id...
  • kururunga
  • kururunga
  • 2016年11月27日 14:09
  • 369

Android自定义可长按 可点击不可拖动的SeekBar

项目中遇见一个奇怪的需求 就是SeekBar不可点击 ,可长按 和拉着拖拽点拖动。一开始想着很简单嘛。屏蔽吊点击事件,SeekBar自带长按事件,差不多就搞定了,然而是我太天真啊,SeekBar自带的...
  • yangbo437993234
  • yangbo437993234
  • 2016年05月26日 14:12
  • 5932
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-控件的拖拽
举报原因:
原因补充:

(最多只允许输入30个字)