1.View的结构
2.View的位置参数
left,top,right,bottom是相对父view的位置参数,获得参数的方法是getLeft()
getX()和getY()返回的是相对于当前view左上角的位置,getRawX和getRawY是相对于屏幕的。
MotionEvent
对于View,可以使用setOnTouchListener()方法来监听touch events而不需要继承现有的View
View myView = findViewById(R.id.my_view);
myView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return true;
}
TouchSlop
最小的滑动距离,获得方法
ViewConfiguration.get(getContext()).getScaledTouchSlop();
VelocityTracker
计算滑动速度
//在View的onTouchEvent方法中
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMoveMent(event);
//时间间隔设为100ms
tracker.computeCurrentVelocity(100);
int Vx = (int)velocityTracker.getXVelocity();
int Vy = (int)VelocityTracker.getYVelocity();
//不再使用的时候,需要清除并回收
velocityTracker.clear();
velocityTracker.recycle();
GestureDetector
手势检测,包含单机,双击,长按滑动等
使用方法:
- 实例化 GestureDetectorCompat 类
- 如需监测所有的手势,则实现 GestureDetector.OnGestureListener 接口和 GestureDetector.OnDoubleTapListener 接口。
- 若只需监测部分手势,则继承 GestureDetector.SimpleOnGestureListener 类。
GestureDetectorCompat detector = new GestureDetectorCompat(getContext(),new listener());
/**实现**/
class listener extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onSingleTapUp(MotionEvent e) {
return super.onSingleTapUp(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return super.onFling(e1, e2, velocityX, velocityY);
}
}
Scroller
实现view的弹性滑动,使用方法
Scroller scroller = new Scroller(getContext());
/**
* 滑动到指定地方
* @param destX
* @param destY
*/
private void smoothScrollTo(int destX,int destY){
int scrollX = getScrollX();
int dx = destX - scrollX;
//startX,startY,dx,dy,duration
scroller.startScroll(scrollX,0,dx,0,100);
invalidate();
}
@Override
public void computeScroll() {
if(scroller.computeScrollOffset()){
//smoothScrollTo
scrollTo(scroller.getCurrX(),scroller.getCurrY());
postInvalidate();
}
}
学习资料:
View的滑动
- 通过view的scrollTo和scrollBy方法来实现滑动
- 通过动画实现滑动
- 通过改变view的LayoutParams实现滑动
SrollTo/ScrollBy
ScrollTo(x,y)是相对于初始位置,ScrollBy(x,y)是相对于当前位置。
getScrollX和getScrollY获得的值,x左滑动为正,y上滑动为正。
动画
使用View动画或者属性动画,View动画只能移动影响不能移动view,所以最好使用属性动画。
//view动画
<?xml version= "1.0" encoding= "utf-8" ?>
<set xmlns:android= "http://schemas.android.com/apk/res/android"
android:fillAfter= "true"
>
<translate
android:fromXDelta= "0"
android:fromYDelta= "0"
android:toXDelta= "500"
android:toYDelta= "1000"
android:duration= "10000"
android:interpolator= "@android:anim/linear_interpolator"
/>
</set>
Animation animation = AnimationUtils.loadAnimation(this ,R.anim.translate);
layout.setAnimation(animation);
animation.start();
//使用属性动画实现移动
ObjectAnimator.ofFloat(layout,"translationX", 0,100).setDuration(1000).start();
最后一种
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) layout.getLayoutParams();
params.width+= 1000 ;
params.leftMargin+=1000;
layout.requestLayout();
优缺点: