Android 關於手指拖動onScroll、onFling...[gallery]

來源:互聯網
上載者:User

Android系統內建一個Gallery瀏覽圖片的應用,通過手指拖動時能夠非常流暢的顯示圖片,使用者互動和體驗都很好。


本樣本就是通過Gallery和自訂的View,模仿實現一個仿Gallery映像集的圖片瀏覽效果。如下:

 


1、基本原理

在 Activity 中實現 OnGestureListener 的介面 onFling() 手勢事件,通過自訂的 View 繪製draw() 圖片


2、Activity

Activity中,通過onTouchEvent() 註冊 myGesture.onTouchEvent(event)


[java]
 @Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_UP: 
        flingView.onFling(0);           // 手指抬起後,重設滑動距離offsetX = 0 
        break; 
    } 
 
    return myGesture.onTouchEvent(event); 

接著實現介面OnGestureListener 的 onScroll()方法,給繼承自View的 FlingView 的handleScroll()成員方法傳遞滑動參數,擷取滑動的x軸距離


[java]
 @Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
    flingView.handleScroll(-1 * (int) distanceX); 
    return true; 


接著實現介面OnGestureListener 的 OnFling()方法,給繼承自View的 FlingView 的onFling()成員方法傳遞滑動參數,擷取手勢的速度


[java]
@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
    flingView.onFling((int) - velocityX); 
    return true; 


3、FlingView

FlingView中,擷取來自Activity中的手勢速度


[java]
public void onFling(int paramFloat1) { 
    if (offsetX > GalleryDemoActivity.deviceScreenWidth / 5) { 
        if (fBitmap != null) { 
            isFling = true; 
            isFlingRight = true; 
        } 
    } else if (offsetX < -GalleryDemoActivity.deviceScreenWidth / 5) { 
        if (nBitmap != null) { 
            isFling = true; 
            isFlingLeft = true; 
        } 
    } 
    // 開始動畫效果 
    startAnimation(new MyAnimation()); 

在滑動過程中,通過實現View的Draw()方法繪製圖片,注意:此時需要同時繪製當前圖片(擷取焦點)和下一張圖片(即將擷取焦點)共兩張圖片


[java]
 @Override 
public void draw(Canvas canvas) { 
    Paint paint = new Paint(); 
    Rect rect = new Rect(); 
    canvas.drawColor(Color.BLACK); 
 
    // 繪製當前圖片 
    if (bitmap != null) { 
        int left = offsetX; 
        int top = offsetY; 
        int right = offsetX + GalleryDemoActivity.deviceScreenWidth; 
        int bottom = offsetY + GalleryDemoActivity.deviceScreenHeight; 
        rect.set(left, top, right, bottom); 
        canvas.drawBitmap(bitmap, null, rect, paint); 
    } 
     
    // 繪製下一張圖片 
    if (offsetX < 0) {           // 向左滑動 
        if (nBitmap != null) { 
            int left = GalleryDemoActivity.deviceScreenWidth + 15 + offsetX; 
            int top = 0; 
            int right = left + GalleryDemoActivity.deviceScreenWidth; 
            int bottom = GalleryDemoActivity.deviceScreenHeight; 
            rect.set(left, top, right, bottom); 
            canvas.drawBitmap(nBitmap, null, rect, paint); 
        } 
    } else if (offsetX > 0) {        // 向右滑動 
        if (fBitmap != null) { 
            int left = -GalleryDemoActivity.deviceScreenWidth - 15 + offsetX; 
            int top = 0; 
            int right = left + GalleryDemoActivity.deviceScreenWidth; 
            int bottom = GalleryDemoActivity.deviceScreenHeight; 
            rect.set(left, top, right, bottom); 
            canvas.drawBitmap(fBitmap, null, rect, paint); 
        } 
    } 

在滑動圖片結束後,需要做滑動動畫後的處理,重新設定當前圖片和當前圖片的上一張和下一張的狀態,為下次滑動做準備

 

[java]
@Override 
protected void onAnimationEnd() { 
    if (isFlingRight) {         // 向右滑動,position減1 
        nBitmap = bitmap; 
        bitmap = fBitmap; 
        fBitmap = null; 
        postion = postion - 1; 
    } else if (isFlingLeft) {       // 向左滑動,position加1 
        fBitmap = bitmap; 
        bitmap = nBitmap; 
        nBitmap = null; 
        postion = postion + 1; 
    } 
     
    isFlingRight = false;            
    isFlingLeft = false; 
    isFling = false; 
    offsetX = 0; 
    if (fBitmap == null && offsetX == 0) {          // 如果前一張圖片為空白(向右滑),則重設前一張圖片(position - 1) 
        if (postion > 0) { 
            fBitmap = getBitmap(postion - 1); 
        } 
 
    } else if (nBitmap == null && offsetX == 0) {       // 如果後一張圖片為空白(向左滑),則重設後一張圖片(position + 1) 
        if (postion < bitmaps.length - 1) { 
            nBitmap = getBitmap(postion + 1); 
        } 
    } 
    clearAnimation();            

 


 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.