中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android中怎么利用ScrollView實現下拉放大頭部圖片

發布時間:2021-06-29 15:39:52 來源:億速云 閱讀:124 作者:Leah 欄目:移動開發

今天就跟大家聊聊有關android中怎么利用ScrollView實現下拉放大頭部圖片,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

public class HeadZoomScrollView extends ScrollView {

 public HeadZoomScrollView(Context context) {
  super(context);
 }

 public HeadZoomScrollView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 public HeadZoomScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
 }

 // 用于記錄下拉位置
 private float y = 0f;
 // zoomView原本的寬高
 private int zoomViewWidth = 0;
 private int zoomViewHeight = 0;

 // 是否正在放大
 private boolean mScaling = false;

 // 放大的view,默認為第一個子view
 private View zoomView;
 public void setZoomView(View zoomView) {
  this.zoomView = zoomView;
 }

 // 滑動放大系數,系數越大,滑動時放大程度越大
 private float mScaleRatio = 0.4f;
 public void setmScaleRatio(float mScaleRatio) {
  this.mScaleRatio = mScaleRatio;
 }

 // 最大的放大倍數
 private float mScaleTimes = 2f;
 public void setmScaleTimes(int mScaleTimes) {
  this.mScaleTimes = mScaleTimes;
 }

 // 回彈時間系數,系數越小,回彈越快
 private float mReplyRatio = 0.5f;
 public void setmReplyRatio(float mReplyRatio) {
  this.mReplyRatio = mReplyRatio;
 }

 @Override
 protected void onFinishInflate() {
  super.onFinishInflate();
//  不可過度滾動,否則上移后下拉會出現部分空白的情況
  setOverScrollMode(OVER_SCROLL_NEVER);
//  獲得默認第一個view
  if (getChildAt(0) != null && getChildAt(0) instanceof ViewGroup && zoomView == null) {
   ViewGroup vg = (ViewGroup) getChildAt(0);
   if (vg.getChildCount() > 0) {
    zoomView = vg.getChildAt(0);
   }
  }
 }

 @Override
 public boolean onTouchEvent(MotionEvent ev) {
  if (zoomViewWidth <= 0 || zoomViewHeight <=0) {
   zoomViewWidth = zoomView.getMeasuredWidth();
   zoomViewHeight = zoomView.getMeasuredHeight();
  }
  if (zoomView == null || zoomViewWidth <= 0 || zoomViewHeight <= 0) {
   return super.onTouchEvent(ev);
  }
  switch (ev.getAction()) {
   case MotionEvent.ACTION_MOVE:
    if (!mScaling) {
     if (getScrollY() == 0) {
      y = ev.getY();//滑動到頂部時,記錄位置
     } else {
      break;
     }
    }
    int distance = (int) ((ev.getY() - y)*mScaleRatio);
    if (distance < 0) break;//若往下滑動
    mScaling = true;
    setZoom(distance);
    return true;
   case MotionEvent.ACTION_UP:
    mScaling = false;
    replyView();
    break;
  }
  return super.onTouchEvent(ev);
 }

 /**放大view*/
 private void setZoom(float s) {
  float scaleTimes = (float) ((zoomViewWidth+s)/(zoomViewWidth*1.0));
//  如超過最大放大倍數,直接返回
  if (scaleTimes > mScaleTimes) return;

  ViewGroup.LayoutParams layoutParams = zoomView.getLayoutParams();
  layoutParams.width = (int) (zoomViewWidth + s);
  layoutParams.height = (int)(zoomViewHeight*((zoomViewWidth+s)/zoomViewWidth));
//  設置控件水平居中
  ((MarginLayoutParams) layoutParams).setMargins(-(layoutParams.width - zoomViewWidth) / 2, 0, 0, 0);
  zoomView.setLayoutParams(layoutParams);
 }

 /**回彈*/
 private void replyView() {
  final float distance = zoomView.getMeasuredWidth() - zoomViewWidth;
  // 設置動畫
  ValueAnimator anim = ObjectAnimator.ofFloat(distance, 0.0F).setDuration((long) (distance * mReplyRatio));
  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
    setZoom((Float) animation.getAnimatedValue());
   }
  });
  anim.start();
 }

 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  super.onScrollChanged(l, t, oldl, oldt);
  if (onScrollListener!=null) onScrollListener.onScroll(l,t,oldl,oldt);
 }

 private OnScrollListener onScrollListener;
 public void setOnScrollListener(OnScrollListener onScrollListener) {
  this.onScrollListener = onScrollListener;
 }

 /**滑動監聽*/
 public interface OnScrollListener{
  void onScroll(int scrollX,int scrollY,int oldScrollX, int oldScrollY);
 }


}

看完上述內容,你們對android中怎么利用ScrollView實現下拉放大頭部圖片有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

航空| 巫溪县| 永顺县| 赤峰市| 西和县| 黎平县| 甘肃省| 南宫市| 油尖旺区| 东光县| 朝阳区| 离岛区| 嘉祥县| 商南县| 察雅县| 前郭尔| 海淀区| 台北县| 科技| 高雄市| 芷江| 平舆县| 柘城县| 定陶县| 苏州市| 桑日县| 永安市| 阿鲁科尔沁旗| 永春县| 紫云| 南漳县| 阿克陶县| 秭归县| 安徽省| 澄迈县| 托克托县| 武山县| 营口市| 广安市| 湘西| 和田县|