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

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

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

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

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

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

1、基本原理

在 Activity 中實(shí)現(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);
}

接著實(shí)現(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;
}

接著實(shí)現(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());
}

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

@Override
public void draw(Canvas canvas) {
  Paint paint = new Paint();
  Rect rect = new Rect();
  canvas.drawColor(Color.BLACK);
  // 繪制當(dāng)前圖片
  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è)置當(dāng)前圖片和當(dāng)前圖片的上一張和下一張的狀態(tài),為下次滑動做準(zhǔn)備

@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、手勢坐標(biāo)介紹

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

(1)MotionEvent中 e1是手指第一次按上屏幕的起點(diǎn),e2是抬起手指離開屏幕的終點(diǎn),根據(jù)上圖Android屏幕坐標(biāo)系可知:
手指向右滑動,終點(diǎn)(e2)在起點(diǎn)(e1)的右側(cè),有e2.getX() - e1.getX() 大于0
手指向左滑動,終點(diǎn)(e2)在起點(diǎn)(e1)的左側(cè),有e2.getX() - e1.getX() 小于0
手指向下滑動,終點(diǎn)(e2)在起點(diǎn)(e1)的下側(cè),有e2.getY() - e1.getY() 大于0
手指向上滑動,終點(diǎn)(e2)在起點(diǎn)(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ù)值的方向,請?jiān)斠娚蠄D(中)

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

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

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

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

相關(guān)文章

  • Android 快速使用正則表達(dá)式,校驗(yàn)身份證號的實(shí)例

    Android 快速使用正則表達(dá)式,校驗(yàn)身份證號的實(shí)例

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

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

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

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

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

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

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

    Android中點(diǎn)擊隱藏軟鍵盤最佳方法

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

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

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

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

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

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

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

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

    在移動應(yīng)用的全生命周期中,版本迭代和用戶更新體驗(yàn)至關(guān)重要,傳統(tǒng)的做法是依賴?Google?Play?商店強(qiáng)制推送更新,但在某些場景下,我們需要更即時地控制更新流程,所以本文給大家介紹了Android實(shí)現(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

最新評論

大足县| 大邑县| 重庆市| 昌江| 邹平县| 凤翔县| 沂源县| 永寿县| 墨江| 交口县| 通渭县| 成武县| 法库县| 海盐县| 明水县| 饶河县| 灵璧县| 区。| 疏附县| 白银市| 工布江达县| 临城县| 宁晋县| 临邑县| 和静县| 安溪县| 永善县| 荆门市| 多伦县| 温州市| 健康| 子长县| 成武县| 遵义市| 新源县| 阜新市| 德格县| 广丰县| 怀柔区| 化州市| 宁城县|