PS:本文不講解動畫實現view的滑動,主要講通過onTouchEvent進行滑動。
1.採用View.setX,setY進行重新佈局
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
tv.setX(event.getRawX()-startX);
tv.setY(event.getRawY()-startY);
break;
}
return true;
}
});
2.採用View.layout()進行重新佈局
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
int offSetX= (int) (event.getX()-startX);
int offSetY= (int) (event.getY()-startY);
tv.layout(tv.getLeft()+offSetX,tv.getTop()+offSetY,tv.getRight()+offSetX,tv.getBottom()+offSetY);
break;
}
return true;
}
});
3.採用View.offsetLeftAndRight(),offsetTopAndBottom進行重新佈局,參數爲偏移量–跟layout()較相似
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
int offSetX= (int) (event.getX()-startX);
int offSetY= (int) (event.getY()-startY);
//同時對left和right進行偏移
tv.offsetLeftAndRight(offSetX);
//同時對top和bottom進行偏移
tv.offsetTopAndBottom(offSetY);
break;
}
return true;
}
});
4.通過設置LayoutParams的margin數值達到滑動
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
int offSetX= (int) (event.getX()-startX);
int offSetY= (int) (event.getY()-startY);
CoordinatorLayout.LayoutParams params= (CoordinatorLayout.LayoutParams) tv.getLayoutParams();
params.leftMargin=tv.getLeft()+offSetX;
params.topMargin=tv.getTop()+offSetY;
tv.setLayoutParams(params);
break;
}
return true;
}
});
5.通過scrollBy或scrollTo
tv.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();
startY=event.getY();
break;
case MotionEvent.ACTION_MOVE:
int offSetX= (int) (event.getX()-startX);
int offSetY= (int) (event.getY()-startY);
/**
* scrollBy表示移動的增量,scrollTo表示移動到哪個座標
* textview的scrollBy移動的是textview的content文本,而viewgroup的scrollBy移動的是內部所有子view,scrollTo同理
* scrollBy內的移動增量offSetX,offSetX若爲正,則content將向相反的方向移動,反之也是。
*/
((ViewGroup)tv.getParent()).scrollBy(-offSetX,-offSetY);
break;
}
return true;
}
});
效果圖(採用的方法五):