亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android仿QQ好友詳情頁下拉頂部圖片縮放效果

 更新時(shí)間:2019年01月16日 11:07:59   作者:king32918  
這篇文章主要為大家詳細(xì)介紹了Android仿QQ好友詳情頁下拉頂部圖片縮放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

今天已經(jīng)是這個(gè)星期連續(xù)加班的第四天了,趁著現(xiàn)在后臺(tái)在處理邏輯問題,將前幾天寫的一個(gè)小例子整理下來。

效果圖

效果分析

1 向下滑動(dòng),頭部的圖片隨著手指滑動(dòng)不斷變大
2 向上滑動(dòng),不斷的向上移動(dòng)圖片,直到圖片不可見
3 當(dāng)頂部圖片不可見時(shí),向上滑動(dòng),滑動(dòng)ListView

實(shí)現(xiàn)思路

1 由于這個(gè)View分上下兩部分,垂直排列,可以通過繼承LinearLayout實(shí)現(xiàn)::自定義一個(gè)DragImageView,該View繼承LinearLayout

public DragImageView(Context context, AttributeSet attrs) {
 super(context, attrs);
 // 默認(rèn)該View垂直排列
 setOrientation(LinearLayout.VERTICAL);
 // 用于配合處理該View的慣性滑動(dòng)
 mScroller = new OverScroller(context);
 mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
 mMaximumVelocity = ViewConfiguration.get(context)
    .getScaledMaximumFlingVelocity();
 mMinimumVelocity = ViewConfiguration.get(context)
    .getScaledMinimumFlingVelocity();
 }

2 onMeasure中設(shè)置內(nèi)容視圖的高度

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 LayoutParams params = (LayoutParams) getChildAt(1).getLayoutParams();
 // 頭部可以全部隱藏,所以內(nèi)容視圖的高度即為該控件的高度
 params.height = getMeasuredHeight();
}

3 設(shè)置ImageView的ScaleType屬性

@Override
protected void onFinishInflate() {
 super.onFinishInflate();
 imageView = (ImageView) getChildAt(0);
 // 隨著手指滑動(dòng),圖片不斷放大(寬高都大于或者等于ImageView的大?。?,并居中顯示:
 // 根據(jù)上邊的分析,CENTER_CROP:可以使用均衡的縮放圖像(保持圖像原始比例),使圖片的兩個(gè)坐標(biāo)(寬、高)都大于等于 相應(yīng)的視圖坐標(biāo)(負(fù)的內(nèi)邊距),圖像則位于視圖的中央
 imageView.setScaleType(ScaleType.CENTER_CROP);
 listView = (ListView) getChildAt(1);
}

4 事件攔截

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
  downX = (int) ev.getX();
  downY = (int) ev.getY();
 }
 if (ev.getAction() == MotionEvent.ACTION_MOVE) {
  int currentX = (int) ev.getX();
  int currentY = (int) ev.getY();
  // 確保是垂直滑動(dòng)
  if (Math.abs(currentY - downY) > Math.abs(currentX - downX)) {
   View childView = listView.getChildAt(listView
     .getFirstVisiblePosition());
   // 有兩種情況需要攔截:
   // 1 圖片沒有完全隱藏
   // 2 圖片完全隱藏,但是向下滑動(dòng),并且ListView滑動(dòng)到頂部
   if (getScrollY() != imageHeight
     || (getScrollY() == imageHeight && currentY - downY > 0
       && childView != null && childView.getTop() == 0)) {
    initVelocityTrackerIfNotExists();
    mVelocityTracker.addMovement(ev);
    return true;
   }
  }

 }
 if (ev.getAction() == MotionEvent.ACTION_UP) {
  recycleVelocityTracker();
 }
 return super.onInterceptTouchEvent(ev);
}

5 onTouchEvent的ACTION_MOVE處理

if (ev.getAction() == MotionEvent.ACTION_MOVE) {
  int currentX = (int) ev.getX();
  int currentY = (int) ev.getY();
  int deltyX = currentX - downX;
  int deltyY = currentY - downY;
  if (Math.abs(deltyY) > Math.abs(deltyX)) {
   if (deltyY > 0) {
    if (getScrollY() > 0) {
     if (getScrollY() - deltyY < 0) {
      scrollBy(0, -getScrollY());
      return true;
     }
     // 當(dāng)圖片沒有完全顯示,并且向下滑動(dòng)時(shí),繼續(xù)整個(gè)view使圖片可見
     scrollBy(0, -deltyY);
    } else {
    // 當(dāng)圖片完全顯示,并且向下滑動(dòng)時(shí),則不斷的放大圖片(通過改變ImageView)的高度
     LayoutParams layoutParams = (LayoutParams) getChildAt(0)
       .getLayoutParams();
     layoutParams.height = layoutParams.height + deltyY / 2;
     getChildAt(0).setLayoutParams(layoutParams);
    }
   } else {
   // 當(dāng)圖片還處于放大狀態(tài),并且向上滑動(dòng)時(shí),繼續(xù)不斷的縮小圖片的高度,使圖片縮小
    if (getChildAt(1).getTop() > imageHeight) {
     LayoutParams layoutParams = (LayoutParams) getChildAt(0)
       .getLayoutParams();
     layoutParams.height = layoutParams.height + deltyY / 2;
     getChildAt(0).setLayoutParams(layoutParams);
    } else {
    // 當(dāng)圖片處于正常狀態(tài),并且向上滑動(dòng)時(shí),移動(dòng)整個(gè)View,縮小圖片的可見范圍
     if (getScrollY() - deltyY > imageHeight) {
      scrollBy(0, imageHeight - getScrollY());
      return true;
     }
     scrollBy(0, -deltyY);
    }
   }
   downY = currentY;
   downX = currentX;
   return true;
  }
 }

5 onTouchEvent的ACTION_UP處理

if (ev.getAction() == MotionEvent.ACTION_UP) {
 // 當(dāng)圖片處于放大狀態(tài)時(shí)松手,使圖片緩慢的縮回到原來的狀態(tài)
 if (getChildAt(1).getTop() > imageHeight) {
  isAnimating = true;
  ValueAnimator valueAnimator = ValueAnimator.ofInt(getChildAt(1)
    .getTop(), imageHeight);
  valueAnimator.setDuration(300);
  valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
    int value = (Integer) animation.getAnimatedValue();
    LayoutParams layoutParams = (LayoutParams) getChildAt(0)
      .getLayoutParams();
    layoutParams.height = value;
    getChildAt(0).setLayoutParams(layoutParams);
   }
  });
  valueAnimator.addListener(new AnimatorListenerAdapter() {
   @Override
   public void onAnimationEnd(Animator animation) {
    super.onAnimationEnd(animation);
    isAnimating = false;
   }
  });
  valueAnimator.start();
 }
 // 當(dāng)現(xiàn)在圖片處于正常狀態(tài),并且圖片沒有完全隱藏,并且松手時(shí)滑動(dòng)的速度大于可慣性滑動(dòng)的最小值,讓View產(chǎn)生慣性滑動(dòng)效果
 if (getChildAt(1).getTop() == imageHeight
   && getScrollY() != imageHeight) {
  mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
  int velocityY = (int) mVelocityTracker.getYVelocity();
  if (Math.abs(velocityY) > mMinimumVelocity) {
   fling(-velocityY);
  }
  recycleVelocityTracker();
 }

總結(jié)

這里主要有兩個(gè)學(xué)習(xí)的點(diǎn)

1 圖片縮放的處理,事件的攔截

2 View的慣性滑動(dòng):主要是結(jié)合OverScroller的使用

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android截屏分享功能

    Android截屏分享功能

    最近項(xiàng)目經(jīng)理交給我一個(gè)任務(wù),要求實(shí)現(xiàn)android截屏功能,包括Android截屏獲取圖片、將圖片保存到本地、通知系統(tǒng)相冊(cè)更新、通過微信、QQ、微博分享截屏圖片。小編把實(shí)現(xiàn)思路分享到腳本之家平臺(tái),需要的朋友參考下
    2017-12-12
  • Android用過TextView實(shí)現(xiàn)跑馬燈效果的示例

    Android用過TextView實(shí)現(xiàn)跑馬燈效果的示例

    本篇文章主要介紹了Android用過TextView實(shí)現(xiàn)跑馬燈效果的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Android自定義控件實(shí)現(xiàn)UC瀏覽器語音搜索效果

    Android自定義控件實(shí)現(xiàn)UC瀏覽器語音搜索效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)UC瀏覽器語音搜索效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • kotlin android extensions 插件實(shí)現(xiàn)示例詳解

    kotlin android extensions 插件實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了kotlin android extensions 插件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 安卓11適配攻略搶先看

    安卓11適配攻略搶先看

    這篇文章主要介紹了安卓11適配攻略搶先看,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Android編程之防止反編譯的實(shí)現(xiàn)方法

    Android編程之防止反編譯的實(shí)現(xiàn)方法

    這篇文章主要介紹了Android編程之防止反編譯的實(shí)現(xiàn)方法,涉及Android針對(duì)運(yùn)行環(huán)境、簽名及程序相關(guān)信息的獲取與判定技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Android打造流暢九宮格抽獎(jiǎng)活動(dòng)效果

    Android打造流暢九宮格抽獎(jiǎng)活動(dòng)效果

    抽獎(jiǎng)活動(dòng)有很多種形式,轉(zhuǎn)盤抽獎(jiǎng),九宮格抽獎(jiǎng),刮刮卡抽獎(jiǎng),這篇文章主要為大家詳細(xì)介紹了如何打造流暢九宮格抽獎(jiǎng)活動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android Studio 自定義Debug變量視圖的方法

    Android Studio 自定義Debug變量視圖的方法

    這篇文章主要介紹了Android Studio 自定義Debug變量視圖的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Android手機(jī)使用Fiddler方法介紹

    Android手機(jī)使用Fiddler方法介紹

    這篇文章主要為大家詳細(xì)介紹了Android手機(jī)使用Fiddler方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android gradle插件打印時(shí)間戳的方法詳解

    Android gradle插件打印時(shí)間戳的方法詳解

    這篇文章主要給大家介紹了關(guān)于Android gradle插件打印時(shí)間戳的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09

最新評(píng)論