Android实现背景图下拉回弹效果
生活随笔
收集整理的這篇文章主要介紹了
Android实现背景图下拉回弹效果
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android實(shí)現(xiàn)背景圖下拉回彈效果
效果
實(shí)現(xiàn)
public class HeadZoomScrollView extends NestedScrollView {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,默認(rèn)為第一個(gè)子viewprivate View zoomView;public void setZoomView(View zoomView) {this.zoomView = zoomView;}//滑動(dòng)放大系數(shù),系數(shù)越大,滑動(dòng)時(shí)放大程度越大private float mScaleRatio = 0.4f;public void setmScaleRatio(float mScaleRatio) {this.mScaleRatio = mScaleRatio;}//最大的放大倍數(shù)private float mScaleTimes = 2f;public void setmScaleTimes(int mScaleTimes) {this.mScaleTimes = mScaleTimes;}//回彈時(shí)間系數(shù),系數(shù)越小,回彈越快private float mReplyRatio = 0.5f;public void setmReplyRatio(float mReplyRatio) {this.mReplyRatio = mReplyRatio;}//滾動(dòng)觸發(fā)子view橫向放大的方法private float moveDistance = 300.0f;public void setMoveDistance(float moveDistance) {this.moveDistance = moveDistance;}//是否橫向拉伸,默認(rèn)為trueprivate boolean isTransverse = true;public void setTransverse(boolean isTransverse) {this.isTransverse = isTransverse;}@Overrideprotected void onFinishInflate() {super.onFinishInflate();//不可過度滾動(dòng),否則上移后下拉會(huì)出現(xiàn)部分空白的情況setOverScrollMode(OVER_SCROLL_NEVER);//獲得默認(rèn)第一個(gè)viewif (getChildAt(0) != null && getChildAt(0) instanceof ViewGroup && zoomView == null) {ViewGroup vg = (ViewGroup) getChildAt(0);if (vg.getChildCount() > 0) {zoomView = vg.getChildAt(0);}}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (zoomViewWidth <= 0 || zoomViewHeight <= 0) {zoomViewWidth = zoomView.getMeasuredWidth();zoomViewHeight = zoomView.getMeasuredHeight();}switch (ev.getAction()) {case MotionEvent.ACTION_UP://手指離開后恢復(fù)圖片mScaling = false;replyImage();break;case MotionEvent.ACTION_MOVE:if (!mScaling) {if (getScrollY() == 0) {y = ev.getY();// 滾動(dòng)到頂部時(shí)記錄位置,否則正常返回} else {break;}}int distance = (int) ((ev.getY() - y) * mScaleRatio); // 滾動(dòng)距離乘以一個(gè)系數(shù)if (distance < 0) { // 當(dāng)前位置比記錄位置要小,正常返回break;}// 處理放大mScaling = true;setZoom(distance);return true; // 返回true表示已經(jīng)完成觸摸事件,不再處理}return super.onTouchEvent(ev);}//拉伸效果public void setZoom(float zoom) {if (zoomViewWidth <= 0 || zoomViewHeight <= 0) {return;}ViewGroup.LayoutParams lp = zoomView.getLayoutParams();if (isTransverse) {if (zoom <= moveDistance) {lp.width = (int) (zoomViewWidth);} else {lp.width = (int) (zoomViewWidth + zoom);if (onZoomListener != null) {onZoomListener.onZoom(zoom);}}} else {lp.width = (int) (zoomViewWidth);}lp.height = (int) (zoomViewHeight * ((zoomViewWidth + zoom) / zoomViewWidth));((MarginLayoutParams) lp).setMargins(-(lp.width - zoomViewWidth) / 2, 0, 0, 0);zoomView.setLayoutParams(lp);}private OnZoomListener onZoomListener;public interface OnZoomListener {void onZoom(float zoom);}public void setOnZoomListener(OnZoomListener onZoomListener){this.onZoomListener = onZoomListener;}//回彈動(dòng)畫private void replyImage() {float distance = 0f;if(isTransverse){distance = zoomView.getMeasuredWidth() - zoomViewWidth;}else{distance = zoomView.getMeasuredHeight() - zoomViewHeight;}ValueAnimator valueAnimator = ValueAnimator.ofFloat(distance, 0f).setDuration((long) (distance * mReplyRatio));valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {setZoom((Float) animation.getAnimatedValue());}});valueAnimator.start();}} <com.lwj.test.common.view.HeadZoomScrollViewandroid:id="@+id/scroll_view"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_show"android:layout_width="match_parent"android:layout_height="200dp"android:layout_weight="1"android:src="@drawable/ic_my_background"/><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:text="數(shù)據(jù)1"/><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:text="數(shù)據(jù)2"/><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:text="數(shù)據(jù)3"/><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:text="數(shù)據(jù)4"/><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:text="數(shù)據(jù)5"/><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:text="數(shù)據(jù)6"/></LinearLayout> </com.lwj.test.common.view.HeadZoomScrollView> setZoomView(View view); // 設(shè)置要放大的view,默認(rèn)為第一個(gè)子view setmScaleRatio(float mScaleRatio); // 設(shè)置滑動(dòng)放大系數(shù),系數(shù)越大,滑動(dòng)時(shí),放大程度越大 setmScaleTimes(int mScaleTimes); // 設(shè)置最大的放大倍數(shù) setmReplyRatio(float mReplyRatio); //回彈時(shí)間系數(shù),系數(shù)越小,回彈越快 setMoveDistance(float moveDistance); // 設(shè)置放大時(shí)移動(dòng)的距離 setTransverse(boolean isTransverse); // 設(shè)置是否進(jìn)行橫向拉伸 setOnZoomListener(OnZoomListener onZoomListener);// 設(shè)置滑動(dòng)距離監(jiān)聽總結(jié)
以上是生活随笔為你收集整理的Android实现背景图下拉回弹效果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据技术Hadoop的介绍
- 下一篇: pageoffice 骑缝章_JAVA调