最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Android 快速使用正則表達式,校驗身份證號的實例

    Android 快速使用正則表達式,校驗身份證號的實例

    下面小編就為大家分享一篇Android 快速使用正則表達式,校驗身份證號的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • android studio 的下拉菜單Spinner使用詳解

    android studio 的下拉菜單Spinner使用詳解

    這篇文章主要介紹了android studio 的下拉菜單Spinner使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-12-12
  • Android 中 Swipe、Scroll 和 Fling 的區(qū)別解析

    Android 中 Swipe、Scroll 和 Fling 的區(qū)別解

    Swipe、Scroll和Fling是Android中常見的觸摸手勢,它們在用戶體驗和技術(shù)實現(xiàn)上各有特點,Swipe用于快速切換,Scroll用于連續(xù)滾動,Fling用于實現(xiàn)慣性滾動,開發(fā)者可以根據(jù)需求選擇合適的手勢類型,并結(jié)合GestureDetector等工具實現(xiàn)各種交互效果,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Android仿微信多人音視頻通話界面

    Android仿微信多人音視頻通話界面

    這篇文章主要為大家詳細介紹了Android仿微信多人音視頻通話界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Android中點擊隱藏軟鍵盤最佳方法

    Android中點擊隱藏軟鍵盤最佳方法

    本文介紹了Android中點擊隱藏軟鍵盤最佳方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù)

    Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù)

    這篇文章主要介紹了Kotlin實現(xiàn)在類里面創(chuàng)建main函數(shù),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • android獲取屏幕寬高與獲取控件寬高(三種方法)

    android獲取屏幕寬高與獲取控件寬高(三種方法)

    本文主要介紹了android獲取屏幕寬高與獲取控件寬高的方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • Android編程實現(xiàn)TextView垂直自動滾動功能【附demo源碼下載】

    Android編程實現(xiàn)TextView垂直自動滾動功能【附demo源碼下載】

    這篇文章主要介紹了Android編程實現(xiàn)TextView垂直自動滾動功能,詳細分析了Android TextView垂直自動滾動功能的實現(xiàn)步驟與布局、功能相關(guān)技巧,并附帶了demo源碼供讀者下載,需要的朋友可以參考下
    2017-02-02
  • Android實現(xiàn)Android?APP自動更新功能

    Android實現(xiàn)Android?APP自動更新功能

    在移動應(yīng)用的全生命周期中,版本迭代和用戶更新體驗至關(guān)重要,傳統(tǒng)的做法是依賴?Google?Play?商店強制推送更新,但在某些場景下,我們需要更即時地控制更新流程,所以本文給大家介紹了Android實現(xiàn)Android?APP自動更新功能,需要的朋友可以參考下
    2025-04-04
  • Android處理圖像數(shù)據(jù)轉(zhuǎn)換的各種方法

    Android處理圖像數(shù)據(jù)轉(zhuǎn)換的各種方法

    這篇文章主要介紹了Android處理圖像數(shù)據(jù)轉(zhuǎn)換的各種方法,本文講解了RGB值轉(zhuǎn)Bitmap、Color值轉(zhuǎn)Bitmap、字節(jié)數(shù)組轉(zhuǎn)Bitmap、讀取文件轉(zhuǎn)Bitmap、讀取資源轉(zhuǎn)Bitmap、輸入流轉(zhuǎn)Bitmap等內(nèi)容,需要的朋友可以參考下
    2015-01-01

最新評論

玉田县| 宜宾市| 霍州市| 长阳| 三都| 通海县| 井研县| 柘荣县| 虹口区| 北安市| 邓州市| 彭州市| 连云港市| 牡丹江市| 柳江县| 贵阳市| 寻甸| 宾川县| 视频| 凌云县| 浙江省| 即墨市| 买车| 安泽县| 肇庆市| 浑源县| 铜鼓县| 蒙阴县| 资阳市| 乌拉特后旗| 高淳县| 崇义县| 怀集县| 茂名市| 乡宁县| 永靖县| 阜平县| 阿拉善盟| 雷山县| 喀什市| 镇平县|