1.View的結(jié)構(gòu)
Paste_Image.png
2.View的位置參數(shù)
Paste_Image.png
left,top,right,bottom是相對父view的位置參數(shù)憎账,獲得參數(shù)的方法是getLeft()
getX()和getY()返回的是相對于當前view左上角的位置金刁,getRawX和getRawY是相對于屏幕的。
Paste_Image.png
MotionEvent
對于View殖告,可以使用setOnTouchListener()方法來監(jiān)聽touch events而不需要繼承現(xiàn)有的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 類
- 如需監(jiān)測所有的手勢负蠕,則實現(xiàn) GestureDetector.OnGestureListener 接口和 GestureDetector.OnDoubleTapListener 接口。
- 若只需監(jiān)測部分手勢倦畅,則繼承 GestureDetector.SimpleOnGestureListener 類遮糖。
GestureDetectorCompat detector = new GestureDetectorCompat(getContext(),new listener());
/**實現(xiàn)**/
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
實現(xiàn)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方法來實現(xiàn)滑動
- 通過動畫實現(xiàn)滑動
- 通過改變view的LayoutParams實現(xiàn)滑動
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();
//使用屬性動畫實現(xiàn)移動
ObjectAnimator.ofFloat(layout,"translationX", 0,100).setDuration(1000).start();
最后一種
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) layout.getLayoutParams();
params.width+= 1000 ;
params.leftMargin+=1000;
layout.requestLayout();
優(yōu)缺點:
Paste_Image.png