欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android編程滑動效果之Gallery仿圖像集瀏覽實現(xiàn)方法

 更新時間:2016年02月12日 11:28:07   作者:陽光島主  
這篇文章主要介紹了Android編程滑動效果之Gallery仿圖像集瀏覽實現(xiàn)方法,結(jié)合實例形式詳細分析了Gallery瀏覽圖片的原理、步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下

本文實例講述了Android編程滑動效果之Gallery仿圖像集瀏覽實現(xiàn)方法。分享給大家供大家參考,具體如下:

Android系統(tǒng)自帶一個Gallery瀏覽圖片的應(yīng)用,通過手指拖動時能夠非常流暢的顯示圖片,用戶交互和體驗都很好。

本示例就是通過Gallery和自定義的View,模仿實現(xiàn)一個仿Gallery圖像集的圖片瀏覽效果。效果圖如下:

1、基本原理

在 Activity 中實現(xiàn) OnGestureListener 的接口 onFling() 手勢事件,通過自定義的 View 繪制draw() 圖片

2、Activity

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

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

接著實現(xiàn)接口OnGestureListener 的 onScroll()方法,給繼承自View的 FlingView 的handleScroll()成員方法傳遞滑動參數(shù),獲取滑動的x軸距離

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

接著實現(xiàn)接口OnGestureListener 的 OnFling()方法,給繼承自View的 FlingView 的onFling()成員方法傳遞滑動參數(shù),獲取手勢的速度

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

3、FlingView

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

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());
}

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

@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);
    }
  }
}

在滑動圖片結(jié)束后,需要做滑動動畫后的處理,重新設(shè)置當前圖片和當前圖片的上一張和下一張的狀態(tài),為下次滑動做準備

@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();
}

4、手勢坐標介紹

本示例中,用到了OnGestureListener接口的onScroll()和OnFling()方法,涉及到了Android系統(tǒng)坐標及觸摸MotionEvent e1和e2、速度velocityX、velocityY等值
Android屏幕坐標系如下圖(左)

(1)MotionEvent中 e1是手指第一次按上屏幕的起點,e2是抬起手指離開屏幕的終點,根據(jù)上圖Android屏幕坐標系可知:
手指向右滑動,終點(e2)在起點(e1)的右側(cè),有e2.getX() - e1.getX() 大于0
手指向左滑動,終點(e2)在起點(e1)的左側(cè),有e2.getX() - e1.getX() 小于0
手指向下滑動,終點(e2)在起點(e1)的下側(cè),有e2.getY() - e1.getY() 大于0
手指向上滑動,終點(e2)在起點(e1)的上側(cè),有e2.getY() - e1.getY() 小于0

(2)onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
distanceX,是前后兩次call的X距離,不是e2與e1的水平距離
distanceX,是前后兩次call的Y距離,不是e2與e1的垂直距離
具體數(shù)值的方向,請詳見上圖(中)

(3)onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
velocityX,是X軸的每秒速度
velocityY,是Y軸的每秒速度
具體數(shù)值的方向,請詳見上圖(右)
仔細觀察可以發(fā)現(xiàn):velocityX、velocityY的方向與distanceX、distanceY方向正好相反

更多OnGestureListener接口函數(shù)介紹

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)動畫技巧匯總》、《Android開發(fā)入門與進階教程》及《Android控件用法總結(jié)》。

希望本文所述對大家Android程序設(shè)計有所幫助。

相關(guān)文章

最新評論