91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

榕江县| 临邑县| 桂东县| 霍州市| 会同县| 忻城县| 大渡口区| 苍南县| 光泽县| 新民市| 绥阳县| 县级市| 象州县| 宝坻区| 万宁市| 宁陕县| 上饶县| 凤庆县| 宜黄县| 资中县| 大兴区| 襄汾县| 海淀区| 马鞍山市| 广昌县| 章丘市| 怀柔区| 吉安市| 夏邑县| 鄢陵县| 新营市| 新沂市| 博罗县| 昭觉县| 雅安市| 虞城县| 镇赉县| 健康| 大方县| 阳江市| 张家口市|