1. 程式人生 > >實現滑動的七種方法

實現滑動的七種方法

週末,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>
  1. 下面是我們在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);

  1. offsetLeftAndRight與offsetTopAndBottom
  offsetLeftAndRight(offsetX);
  offsetTopAndBottom(offsetY);
  1. 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);
  1. 使用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();
  1. 使用ViewDragHelper,
    support-v4庫中提供專門處理滑動的工具類,後邊會專門介紹。