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;
            }
        });
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android View进阶之RecyclerView 实现滑动删除和拖拽功能

前言 从Android 5.0开始,谷歌推出了新的控件RecyclerView,相对于早它之前的ListView,优点多多,功能强大,也给我们的开发着提供了极大的便利,今天自己学习一...

Android拖拽的控件

  • 2015年07月09日 11:55
  • 1.69MB
  • 下载

Android拖拽交换控件

  • 2012年07月02日 17:15
  • 293KB
  • 下载

Android开发之QQ黏性控件(QQ消息未读提醒,在固定范围内,拖拽回弹,超出范围,松手消失)

Android开发之QQ黏性控件(QQ消息未读提醒,在固定范围内,拖拽回弹,超出范围,松手消失) 自腾讯手机QQ新版推出后,想必大家都发现了,QQ的未读消息提醒,效果真的很炫酷,即在固定范围内,拖拽未...

Android 图片拖拽、放大缩小的自定义控件

需求:像相册中的图片跟随手指缩放

Android基础控件——RecyclerView实现拖拽排序侧滑删除效果

RecyclerView实现拖拽排序侧滑删除效果 事先说明: RecyclerView是ListView的升级版,使用起来比ListView更规范,而且功能和动画可以自己添加,极容易扩展,本章效果...

Android控件拖拽功能的实现

下面是一个Android拖拽功能的实现demo,zhu

Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现

Android高级控件(六)——自定义ListView高仿一个QQ可拖拽列表的实现 我们做一些好友列表或者商品列表的时候,居多的需求可能就是需要列表拖拽了,而我们选择了ListView,也是因为使...

Android 仿QQ未读消息拖拽删除粘性控件效果

效果图: 分析  一 : 1、应用的地方:如未读数据的清除等 2、这个控件要实现哪些功能呢? 1)拖拽超出范围时,断开了,此时我们松手,图标消失 2)拖拽超出范围时,断开了,此时我们把图标移动回去...

Android 拖拽自定义控件的原理与实现

说到拖拽控件的使用,大家
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android进阶-控件的拖拽
举报原因:
原因补充:

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