2 ljuns ljuns 于 2017.01.04 13:08 提问

android view 的滑动疑惑
 public class DragView extends View {

    private int lastX;
    private int lastY;

    public DragView(Context context) {
        super(context);
        ininView();
    }

    public DragView(Context context, AttributeSet attrs) {
        super(context, attrs);
        ininView();
    }

    public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        ininView();
    }

    private void ininView() {
        // 给View设置背景颜色,便于观察
        setBackgroundColor(Color.BLUE);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 记录触摸点坐标
                lastX = x;
                lastY = y;
                break;

            case MotionEvent.ACTION_MOVE:
                // 计算偏移量
                int offSetX = x - lastX;
                int offSetY = y - lastY;

                // 在当前坐标增加偏移量
                layout(getLeft() + offSetX,
                        getTop() + offSetY,
                        getRight() + offSetX,
                        getBottom() + offSetY);
               break;
        }
        return true;
    }
}

代码如上,问题:移动 view 的时候为什么会有偏移量?
我的理解: 既然 getX() 和 getY() 获取的是相对于 view 自己左上角的坐标,如果我手指放在 view 的中间拖动 view,不管 view 的位置在哪里 getX() 和 getY() 获取的值是不变的,那么偏移量应该是0才对

2个回答

qq_36208852
qq_36208852   2017.01.04 15:22

拖动view,偏移量就已经有了,只是你没发觉把

u013147734
u013147734   2017.01.04 15:23

getX()是相对自己的坐标,而layout却是相对父控件的坐标...

如果偏移量是0,那么你根本检测不到MotionEvent.ACTION_MOVE方法,当然是系统先收到MOVE事件,你再调用layout.
当然我觉得你这么调用layout会有问题的,依据了两个不同相对物,如果你想通过自己的event事件移动自己,还是使用event.getRawX好吧

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android——View的事件体系(一)View的滑动
主要介绍内容: View的基础知识 View的位置参数 MotionEvent 和 TouchSlope VelocityTracker、GestureDetector 和 Scroller View的滑动 使用scrollTo/scrollBy 使用动画 改变布局参数 各种滑动方式的对比 弹性滑动 使用Scroller 通过动画 使用延时策略 View的事件分发机制 点击事件的传递规则 事
Android View体系(二)实现View滑动的六种方法
View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理。其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统记下触摸点的坐标,手指移动时系统记下移动后的触摸的坐标并算出偏移量,并通过偏移量来修改View的坐标。
Android 实现 View 滑动的七种方法
记录下系统提供的 View 滑动的 API 方法。不管采用哪一种方式,本质的思想基本上都是一致的,当触摸 View 的时候,记录下当前触摸点的坐标,当手指移动的时候,记录移动后的触摸点坐标,从而获取相对上一次坐标点的偏移量,通过偏移量来修改 View 的坐标,这样不断重复,从而实现滑动过程。 layout 方法 @Override public boolean onTouchEvent(M
Android学习笔记-使用layout方法使View随手指的滑动而滑动
看AndroidHero 这本书时,有一个例子是关于移动View使用view的layout方法来移动,对于触摸事件的处理在这里记录一下 1.思路在View的onTouchEvent方法中对MotionEvent中的坐标进行记录,记录按下的时候记录,在移动的时候计算他们的偏移量,调用layout()对view的位置进行重绘制2.对坐标的处理 1.可以通过event.getX()来获取相对父View的坐
Android 实现View滑动几种方式
layout 在ACTION_MOVE中通过获取x、y的偏移量动态布局view,并禁止向父控件传递事件: @Override public boolean onTouchEvent(MotionEvent event) { int x = (int) event.getX(); int y = (int) event.getY();
View的滑动及一个跟手滑动的效果
在Android开发中,经常会遇到一个view需要它能够支持滑动的需求。 安卓中,实现view的滑动可以通过三种方式: 1. 通过View本身提供的scrollTo和scrollBy方法; 2. 通过给View添加平移动画来实现平移效果; 3. 通过改变View的LayoutParams使得View重新布局;
[Android] 滑动 View 的原理及处理
转自:http://blog.qiji.tech/archives/6758 [Android] 滑动 View 的原理及处理,滑动效果的产生 滑动一个 View ,其实就是移动一个 View,本质上是对 View 的坐标位置进行不停的改变。那么要实现这个效果,就必须要监听用户的触摸事件,根据传入的事件类型和坐标,动态且不断的改变 View 的坐标。 以下Demo 在 githu
Android--自定义View滑动的六种方法
概述由于移动平台屏幕尺寸大小的限制,为了给用户呈现更好的页面内容,我们需要通过滑动来实现一些页面内容的显示和隐藏操作。自定义View的方法 View.layout()方法 改变view的布局参数LayoutParams View.offsetLeftAndRight()和View.offsetTopAndBottom()方法 属性动画ObjectAnimator.ofFloat()方法 使用View
View的滑动之瞬间滑动与弹性滑动
View的滑动之瞬间滑动与弹性滑动
Android 自定义View 实现手势监听,左右滑动,上下滑动
package com.example.administrator.myapplication; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.Mo