Android中View的事件体系(1)——坐标体系与移动

view基础知识

1、view的位置参数

view的位置主要由四个参数决定,分别是top、left、right、bottom决定,其中(top,left)是左上角的坐标,(right,botttom)是右下角的坐标,这些坐标都是相对于view的父容器来说的,是一种相对坐标。
view的宽高

width = right - left;
height = bottom - top;

从view中获取这四个参数

left = getLeft();
right = getRight();
top = getTop;
bottom = getBottom();

android3.0以后,view增加了额外的参数:x、y、translationX、translationY,其中x和y是view左上角的坐标,translationX和translationY是View左上角相对于容器的偏移量,这几个坐标也是相对坐标。,换算关系如下:

x = left + translationX;
y = top + translationY;

所以,view在平移的过程中,top和left始终是最初时候左上角坐标,并一直保持不变。

2、屏幕移动相关

2.1、MotionEvent

常用的屏幕触摸监听的类,包含ACTION_DOWN、ACTION_MOVE、ACTION_MOVE三种事件监听方法。
可以通过getX/getY方法来获得当前点击事件的相对坐标,通过getRawX/getRawY方法获取当前点击事件的绝对坐标。

2.2、TouchSlop

这个类一般用于获取系统的最小滑动距离,可以通过这个距离来判断手指是否在屏幕上滑动,获取的方法如下:

ViewConfiguration.get(getContext()).etScaledTouchSlop();

2.3、VelocityTracker

用于速度追踪的类,可以追踪水平方向和竖直方向上的速度,一般分为如下两个步骤获取:

//计算当前速度
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
//获取各个方向上的速度
velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
//计算完成后回收内存
velocityTracker.clear();
velocityTracker.recycle();

2.4、GestureDetector

手势检测类,常用来辅助检查用户的单击、滑动、长按、双击等行为,最常用的是检测用户的双击行为。

2.5、Scroller

一般用于View的弹性滑动的实现。然而Scroller本身无法让view弹性滑动,需要和View的ComputeScroller配合使用才能共同完成这个功能。示例代码如下:

Scroller scroller = new Scroller(mContext);
//缓慢滑动到指定的位置
private void smothScrollTo(int destX,int destY){
    int scrollX = getScrollX();
    int delta = destX - scrollX;
    mScroller.startScroll(scrollX,0,delta,0,1000);
    invalidate();
}

@Override
public void computeScroll(){
    if(mScroller.computeScrollOffset()){
        scrollTo(mScroller.etCurrX(),mScroller.getCurrY());
        postInvalidate();
    }
}
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值