读Android群英传第五章

本文深入探讨了Android坐标系的获取方式、触控事件处理、以及实现滑动操作的七种方法,包括通过调用layout方法、使用offsetLeftAndRight与offsetTopAndBottom、LayoutParams布局参数、ScrollTo和ScrollBy、Scroller类、属性动画和ViewDragHelper等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Scroll 分析

5.1.1 Android的坐标系 如何获取Android坐标系点的位置?
通过系统提供的getLocationOnScreen(int location[]);

5.1.2 getX()、getY()、getRawX()、getRawY()
getRawX()、getRawY()主要是获取在android坐标系的坐标 getX()、getY()主要是获取在视图坐标系的坐标

5.1.3 触控事件–MotionEvent

(1) MotionEvent 中封装的一些常用的时间常量

// 单点触摸按下动作
public static final int ACTION_DOWN = 0;
// 单点触摸离开动作
public static final int ACTION_UP = 1;
// 触摸点移动动作
public static final int ACTION_MOVE = 2;
// 触摸动作取消
public static final int ACTION_CANCEL = 3;
// 触摸动作超出边界
public static final int     ACTION_OUTSIDE = 4;
// 多点触摸按下动作
public static final int ACTION_POINTER_DOWN = 5;
// 多点离开动作
public static final int ACTION_POINTER_UP = 6;

(2) 一般情况下在onTouchEvent(MotionEvent e)的固定模板

public boolean onTouchEvent(MotionEvent e){

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

    switch(e.getAction()){
        case MotionEvent.ACTION_DOWN:
        break;
        case MotionEvent.ACTION_MOVE:
        break;
        case MotionEvent.ACTION_UP:
        break;
        default:
        break;
    }

    return true;
}

(3) View 提供的 getTop()、getBottom、getLeft()、getRight()
这些方法表示的含义:该View到父View的上下左右的距离

5.2 实现滑动的七种方法

第一种:通过调用layout方法
其中书中有俩个例子,刚开始没敲代码时看的不是很明白后来发现使用getRawX()、getRawY()需要每次MOVE的时候进行初始化而在使用 getX()、getY()确不需要是因为getX()和getY()的坐标系也是在随着滑动在改变,然而getRawX()和getRawY()的坐标系是固定的。

第二种:通过offsetLeftAndRight(offsetX)与offsetTopAndBottom(offsetY)
其中offsetX和offsetY分别是左右和上下的偏移量

第三种:通过LayoutParams布局参数
其中我们需要主要的是如果该View的父View是哪个ViewGroup,那我们的LayoutParams就对应着父View的LayoutParams
比如我们的父View是LinearLayout那么我们的LayoutParams就是LinearLayout.LayoutParams。
获取LayoutParams对象:通过getLayoutParams()方法
示例:
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)getLayoutParams();
params.leftMargin = getLeft() + offsetX;
params.topMargin = getTop() +offsetY;
setLayoutParams(params);

第四种:通过ScrollTo()和ScrollBy() 我们需要注意的是这个移动的参照物是画布,移动的是手机屏幕,即屏幕在画布上移动。所以在我们使用这俩个方法的时候发现手指移动,方块移动的方向是相反的。结局办法就是 设置成相反值。

第五种:通过Scroller
由于通过ScrollTo()和ScrollBy()这些方法使View移动是瞬间的,没有什么过渡效果,给人一种很突兀的感觉。
然而Scroller就可以实现平滑的移动。
使用示例:
重写computeScroll()

public void computeScroll(){
    super.computeScroll();

    // 判断Scroller是否执行完毕
    if(mScroller.computeScrollOffset()){
                       ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
        invalidate();
    }
}

在我们需要使用平滑移动的事件中使用Scrller类的startScroll()开启平滑移动过程。
public void startScroll(int StartX, int StartY, int dx, int dy, int duration);
public void startScroll(int StartX, int StartY, int dx, int dy);

case MotionEvent.ACTION_UP:
View viewGroup = (View)getParent();
mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-offsetX,-offsetY);
invalidate();
break;

第六种:属性动画

第七种:通过ViewDragHelper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值