昨天复习了自定义View,在看到自定义ViewGroup的时候,用到了scrollBy()
方法,然后趁着自己还有点印象,今天顺便把滑动机制给复习了,笔记大多在书上,这里只记录代码,源码放在我的GitHub上
获取坐标值的各种方法
- View提供的获取坐标的方法(被点击的View的坐标)
get + Top、Right、Bottom、Left()
方法,是得到View到父布局的距离 - MotionEvent()提供的方法(点击位置的坐标)
get + X、Y()
方法,是视图坐标
get + RawX、RawY()
方法,是绝对坐标
【注】绝对坐标使用时,在MotionEvent.ACTION_MOVE
时,最后需要多一步lastX = (int) event.getRawX();
处理
实现滑动的七种方法
前5种方法- layout方法
//layout方法——视图坐标
/*
@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 super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}*/
//layout方法——绝对坐标
/*
@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//记录触摸点坐标
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = rawX - lastX;
int offsetY = rawY - lastY;
layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
}
// return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}*/
- offsetLeftAndRight和offsetTopAndBottom方法
/*@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//记录触摸点坐标
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = rawX - lastX;
int offsetY = rawY - lastY;
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
}
// return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}*/
- LayoutParams
/*@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;
//根据自己布局中的布局类型选择
RelativeLayout.LayoutParams layoutParams =
(RelativeLayout.LayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
break;
}
// return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}
*/
//ViewGroup.MarginLayoutParams
/*@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;
ViewGroup.MarginLayoutParams layoutParams =
(ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
break;
}
// return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}*/
- scrollBy和scrollTo
//scrollBy
/*@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;
((View)getParent()).scrollBy(-offsetX,-offsetY);
// scrollBy(offsetX,offsetY);
break;
}
// return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}*/
//scrollTo
/*@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getRawX();
int rawY = (int) event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//记录触摸点坐标
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = rawX - lastX;
int offsetY = rawY - lastY;
((View)getParent()).scrollTo(-offsetX,-offsetY);
break;
}
// return super.onTouchEvent(event);//若为这一句,就相当于当前View表示自己处理不了这个触摸事件,而要交给自己的上层去处理
//所以,这里返回true,表示自己能处理这个事件
return true;
}*/
-
Scroller方法
Scroller方法 - 属性动画
-
ViewDragHelper
ViewDragHelper
网友评论