您的位置:首页 > 其它

view基础知识介绍(一)

2016-06-21 17:02 309 查看
view基础知识介绍

view是一种界面层的控件的一种抽象 分为view和viewGroup viewGroup继承自view 也就是说view本身可以是单个控件 也可以是一个控件组 例如:一个view中可以包含view和viewGroup viewGroup中又可以包括view和viewGroup 以此类推

view的位置参数

view的位置主要由四个参数决定 left right top bottom 其中left为view的左侧横坐标 right为view右侧横坐标 top为view上边纵坐标 bottom为view下边纵坐标 这些坐标的位置都是相对坐标 相对于view的父控件而言 那么 view的width=right-left height=bottom-top 同时 这四个参数android也提供了对应的get方法

此外 还有x y translateX translateY x和y表示view左上角的坐标 translateX和translateY表示view左上角相对于父控件的偏移量 默认值为0 其中x=left+translateX y=top+translateY view在平移过程中left和top是不会发生改变的 改变的是x y translateX和translateY这四个参数。

MotionEvent(动作事件)

指手指在解除屏幕之后的一系列事件 其中典型的事件类型有 ACTION_DOWN 手指刚接触屏幕 ACTION_MOVE 手指在屏幕上移动 ACTION_UP 手指从屏幕上松开的一瞬间 例如:单击事件有ACTION_DOWN和ACTION_UP组成 滑动事件由一个ACTION_DOWN 多个ACTION_MOVE 和一个ACTION_UP组成 通过MotionEvent对象我们还可以获取到该事件发生时的x和y坐标 系统提供了两组方法

getX/getY getRawX/getRawY


前一组方法获取的是相对于该view的坐标 后一组方法获取的是相对于屏幕左上角的坐标

TouchSlop

指的是能够被系统识别的最小的滑动距离 也就是说 当手指在屏幕上滑动的距离小于这个距离时 系统不认为你是在进行滑动操作 这是一个常量 和设备有关 可以通过以下方法获得

ViewConfiguration.get(getContext()).getScaledTouchSlop()


我们可以利用这个常量做一些相对应的过滤操作

VelocityTracker 速度追踪

用于跟踪手指在滑动过程中的速度 包括水平和竖直方向的速度 使用方式如下

VeloCityTracker velocityTracker = VeloCityTracker.obtain();
velocityTracker.addMotionEvent(event);

velocityTracker.computeCurrentVelocity(1000); //参数值为测量的时间
int xVelocity = velocityTracker.getXVelocity();
int yVelocity = velocityTracker.getYVelocity();

velocityTracker.clear();
velocityTracker.recycle();//当不需要计算时 需要调用这两个方法来重置并回收内存


需要注意的是 在获取速度之前必须先指定计算时间 同时 获取的速度为指定时间内手指划过的像素值

GestrueDetector 手势检测

用于辅助检测用户的单击 滑动 长按 双击等行为 使用方法如下

GestrueDector mGestrueDetector = new GestrueDetector(this);
//解决长按屏幕后无法滑动的现象
mGestrueDetector.setIsLongpressEnable(false);

//接管view的onTouchEvent方法 在onTouchEvent中添加如下实现
boolean consume = mGestrueDetector.onTouchEvent(event);
return consume;


具体例子如下:

/**
* 用以说明GestrueDetector(手势检测)的详细用法的说明
*/
public class GestrueDetectorView extends View implements GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{

//我们在该类中实现了onGesrueListener和onDoubleTopListener 并构建了GestrueDetector对象
private final GestureDetector mGestureDetector = new GestureDetector(this);

public GestrueDetectorView(Context context) {
super(context);

}

/**
* 在veiw的onTouchEvent方法中 用GestrueDetector的onTouchEvent方法来接管view的事件处理 并返回对应结果
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean consume = mGestureDetector.onTouchEvent(event);
return consume;
}

//以下三个方法的触发顺序:onDown->onShowPress->onLongPress

/**
* 属于onGestrueListener接口 该方法由一个ACTION_DOWN触发
*
* 用户按下屏幕就会触发
* @param e
* @return
*/
@Override
public boolean onDown(MotionEvent e) {
return false;
}

/**
* 属于onGestrueListener接口 该方法由一个ACTION_DOWN触发 不同的是 该方法强调的是尚未松开或者拖动状态
*
* 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行
* @param e
*/
@Override
public void onShowPress(MotionEvent e) {

}

/**
* 属于onGestrueListener接口 该方法由一个ACTION_UP触发 单击行为
*
* 触发顺序:
* 点击一下非常快的(不滑动)Touchup:
* onDown->onSingleTapUp->onSingleTapConfirmed
* 点击一下稍微慢点的(不滑动)Touchup:
* onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
*
* @param e
* @return
*/
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}

/**
* 属于onGestrueListener接口 该方法由一个ACTION_DOWN和多个ACTION_MOVE触发 指拖动行为 手指还没有离开屏幕
*
* 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法       在ACTION_MOVE动作发生时就会触发
* 滑屏:手指触动屏幕后,稍微滑动后立即松开
* onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
* 拖动
* onDown------》onScroll----》onScroll------》onFiling
*
* @param e1 ACTION_DOWN的MotionEvent
* @param e2 最后一次ACTION_MOVE的MotionEvent
* @param distanceX 相对于上次调用该方法时所滑动的x坐标距离
* @param distanceY 相对于上次调用该方法时所滑动的y坐标距离
* @return
*/
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}

/**
* 属于onGestrueListener接口 用户长按屏幕时触发该方法
*
* 长按触摸屏,超过一定时长,就会触发这个事件
* @param e
*/
@Override
public void onLongPress(MotionEvent e) {

}

/**
* 属于onGestrueListener接口 该方法由一个ACTION_DOWN和多个ACTION_MOVE以及一个ACTION_UP调用
* 属于快速滑动操作
*
* 滑屏,用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
*
* @param e1 第1个ACTION_DOWN MotionEvent
* @param e2 最后一个ACTION_MOVE MotionEvent
* @param velocityX X轴上的移动速度,像素/秒
* @param velocityY Y轴上的移动速度,像素/秒
* @return
*/
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}

/**
* 属于onDoubleTapListener接口 该方法区别于onSingleTapUp 该方法是一个严格的单击行为 如果触发了该方法 那么只能是一个单击
* 而不可能是双击中的一次单击
* 当用户执行单机操作时 系统会首先执行onDown onSingleTapUp 然后在等待一段时间之后
* 确定该次点击不是双击操作之后 执行该方法
* @param e
* @return
*/
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}

/**
* 属于onDoubleTapListener接口 在触发onDown onSingleTapUp方法之后 再次点击会触发该方法
*
* 在第二下点击时,先触发OnDoubleTap,然后再触发OnDown(第二次点击)
* 其次在触发OnDoubleTap以后,就开始触发onDoubleTapEvent了
*
* @param e
* @return
*/
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}

/**
* 属于onDoubleTapListener接口 该方法会在onDoubleTap方法之后被触发 包括双击之间的按下 滑动和抬起等操作
* @param e
* @return
*/
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
}


参考资料:Android开发艺术探索
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: