實現滑動的七種方法
阿新 • • 發佈:2019-01-29
週末,android群英傳與Android開發藝術探索兩本書到了,確實是適合android進階的好書, 以後書中學到的覺得不錯的內容會寫在這個模組。
今天介紹滑動的七種方式
基本思想:
當手指按下時,記下當前座標 lastX, lastY
當手指移動時,記下 當前座標 currentX, currentY
計算差值 offsetX = currentX - lastX, offsetY = currentY - lastY
android群英傳中介紹了七種方式,看下面的例子。
1.定義出自己的控制元件,在MainActivity中直接引用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/image1"
tools:context=".MainActivity">
<mytest.jiang.wei.myapplication .DragView
android:background="@android:color/holo_red_dark"
android:layout_width="100dp"
android:layout_height="100dp" />
</RelativeLayout>
- 下面是我們在onTouchEvent事件中計算偏移量並處理滑動
@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;
break;
}
return true;
}
在MotionEvent.ACTION_MOVE case塊中處理滑動
1.使用layout方法
layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
- offsetLeftAndRight與offsetTopAndBottom
offsetLeftAndRight(offsetX);
offsetTopAndBottom(offsetY);
- LayoutParams
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin = getLeft() + offsetX;
layoutParams.topMargin = getTop() + offsetY;
setLayoutParams(layoutParams);
/** 前三種方式實際都是改變子控制元件的佈局引數, 最始呼叫父控制元件的onLayout方法重新為子控制元件佈局*******/
4.scrollTo 與scrollBy
這裡要注意,
1.scrollTo與scrollBy移動的控制的子元素,我們要移動當前view,就要呼叫父控制元件的方法。
2. 實際上是移動父控制元件,所以 要讓偏移量取反才能看到移動 子控制元件的效果
((View)getParent()).scrollBy(-offsetX, -offsetY);
- 使用Scroller
Scroller類是sdk為我們提供 的模擬滑動的工具類,我們可以利用他實現平滑移動的效果
1. 在構造方法中例項化一個Scroller
mScroller = new Scroller(context);
2. 重寫computeScroll方法,實現模擬滑動
@Override
public void computeScroll() {
// 判斷是否完成滑動, 已完成則會返回false
if (mScroller.computeScrollOffset()) {
((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}
3.在MotionEvent.ACTION_UP case塊中開啟模擬滑動
case MotionEvent.ACTION_UP:
//這裡因為每次滑動的都是父控制元件, 開始滑動位置為0, 所開始 位置 是 0+parent.getScrollX() , 0+parent.getScrollY(), 偏移量為負 滑動的值 回到原點
mScroller.startScroll(parent.getScrollX(), parent.getScrollY(), -parent.getScrollX(), -parent.getScrollY());
invalidate();
break;
6.使用動畫
使用動畫可以更新輕鬆的實現讓控制元件回到原位置的平移效果
/**
* 6.使用動畫
*/
ObjectAnimator animX = ObjectAnimator//
.ofFloat(this, "translationX", parent.getScrollX());
ObjectAnimator animY = ObjectAnimator//
.ofFloat(this, "translationY", parent.getScrollY());
AnimatorSet animSet = new AnimatorSet();
animSet.playTogether(animX, animY);
animSet.start();
- 使用ViewDragHelper,
support-v4庫中提供專門處理滑動的工具類,後邊會專門介紹。