Android开发避免不了类似于下图的View滑动处理, 所以掌握滑动处理, 是每一个Android developer最base的技能。
1.layout()
该方法用于放置View的位置确定View的大小
@Override
public boolean onTouchEvent(MotionEvent event) {
// 获取手指x、y坐标
int x = (int) event.getX();
int y = (int) event.getY();
int lastX = 0;
int lastY = 0;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
// 计算x、y偏移量
int offsetX = x - lastX;
int offsetY = y - lastY;
// 调用layout()方法重新摆放
layout(getLeft()+offsetX, getTop()+offsetY,
getRight() + offsetX, getBottom() + offsetY);
break;
}
return true;
}
相信很多人对get()和getRaw有疑问, 在这里解释一下:
// 触摸点相对于其所在组件坐标系的坐标
event.getX();
event.getY();
// 触摸点相对于屏幕默认坐标系的坐标
event.getRawX();
event.getRawY();
还是不明白的话, 看下图:
坐标系
再补上一个知识点, onTouchEvent事件return解释:
public boolean onTouchEvent(MotionEvent event)
当前的View把事件进行了拦截,则事件则会被传递到该方法中
return false:
表明没有消费该事件, 事件将会以冒泡的方式一直被传递到上层的view或Activity中的onTouchEvent事件处理。
如果最上层的view或Activity中的onTouchEvent还是返回false, 则该事件将消失。
接下来来的一系列事件都将会直接被上层的onTouchEvent方法捕获。
return true:
表明消费了该事件, 事件到此结束。
return super.onTouchEvent(event):
默认是fase。
简单的理解就是:
如果处理该事件, 则为true, 否则为false。
2.offsetLeftAndRight()与offsetTopAndBottom()
抵消左和右, 抵消上和下
case MotionEvent.ACTION_MOVE:
// 计算x、y偏移量
int offsetX = x - lastX;
int offsetY = y - lastY;
// 对left和right进行偏移
offsetLeftAndRight(offsetX);
// 对top和bottom进行偏移
offsetTopAndBottom(offsetY);
break;
3.LayoutParams(改变布局参数)
LayoutParams主要保存了View的布局参数, 其中包括位置, 所以可以通过改变布局参数来达到改变位置的效果
case MotionEvent.ACTION_MOVE:
// 计算x、y偏移量
int offsetX = x - lastX;
int offsetY = y - lastY;
// 获取布局参数
LayoutParams layoutParams = (LayoutParams) getLayoutParams();
// 左边距
layoutParams.leftMargin = getLeft() + offsetX;
// 上边距
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
break;
注意:
还可以是LinearLayout.LayoutParams、 RelativeLayout.LayoutParams......等等, 因父控件而定, 除此之外还可以使用ViewGroup.MarginLayoutParams来实现
case MotionEvent.ACTION_MOVE:
// 计算x、y偏移量
int offsetX = x - lastX;
int offsetY = y - lastY;
// 获取边界布局参数
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
// 左边距
layoutParams.leftMargin = getLeft() + offsetX;
// 上边距
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
break;
4.动画
/**
* @param fx 开始x坐标
* @param fy 开始y坐标
* @param tx 目标x坐标
* @param ty 目标y坐标
*/
private void setAnim(float fx, float fy, float tx, float ty) {
// 开启硬件加速
setLayerType(LAYER_TYPE_HARDWARE, null);
TranslateAnimation translateAnimation = new TranslateAnimation(
fx, tx, fy, ty);
translateAnimation.setDuration(500);
startAnimation(translateAnimation);
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
clearAnimation();
// 关闭硬件加速
setLayerType(LAYER_TYPE_NONE, null);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
5.scollTo()与scollBy()
这两个方法没有时间写具体的例子测试, 所以不敢随便的写忽悠你们, 这个等后续更新。
6.Scroller
这个方法没有时间写具体的例子测试, 所以不敢随便的写忽悠你们, 这个等后续更新。
7.ViewDragHelper
这个类非常牛逼, 但我还没有时间写测试, 待更新。
给大家介绍下, 这是我微信, 欢迎来讨论、 交流技术。
网友评论