vue做企业网站,搞外贸一般是干什么的,湖南做旅游网站哪家最好,sql网站发布流程背景在很多项目中我们都会用到ScrollView这个控件#xff0c;因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容。但是ScrollView滑动时效果感觉太死板了#xff0c;这个时候我们如果给它添加一个回弹的动画效果#xff0c;会让界面交互更加舒服#xff0c;提升用…背景在很多项目中我们都会用到ScrollView这个控件因为ScrollView能够在屏幕内容多时下上滑动以适配加载的内容。但是ScrollView滑动时效果感觉太死板了这个时候我们如果给它添加一个回弹的动画效果会让界面交互更加舒服提升用户体验效果。自定义ScrollView1、创建一个类继承ScrollView并重写相应的构造函数public class ZoomInScrollView extends ScrollView {public ZoomInScrollView(Context context) {this(context, null);}public ZoomInScrollView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ZoomInScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}}2、获取默认第一个子View即我们的头部mHeaderViewOverrideprotected void onFinishInflate() {super.onFinishInflate();// 设置不可过度滚动否则上移后下拉会出现部分空白的情况setOverScrollMode(OVER_SCROLL_NEVER);View child getChildAt(0);if (child ! null child instanceof ViewGroup) {// 获取默认第一个子ViewViewGroup vg (ViewGroup) getChildAt(0);if (vg.getChildAt(0) ! null) {mHeaderView vg.getChildAt(0);}}}3、获取头部View的长和宽Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mHeaderWidth mHeaderView.getMeasuredWidth();mHeaderHeight mHeaderView.getMeasuredHeight();}4、设置上下滑动标记Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {currentX ev.getX();currentY ev.getY();switch (ev.getAction()) {case MotionEvent.ACTION_MOVE:distanceX currentX - lastX;distanceY currentY - lastY;if (Math.abs(distanceX) Math.abs(distanceY) Math.abs(distanceY) 12) {upDownSlide true;}break;}lastX currentX;lastY currentY;if (upDownSlide mHeaderView ! null) {commOnTouchEvent(ev);}return super.dispatchTouchEvent(ev);}5、监听触摸事件private void commOnTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_UP:// 手指离开后头部恢复图片mIsPulling false;replyView();clear();break;case MotionEvent.ACTION_MOVE:if (!mIsPulling) {// 第一次下拉if (getScrollY() 0) {// 滚动到顶部时记录位置否则正常返回mLastY (int) ev.getY();} else {break;}}int distance (int) ((ev.getY() - mLastY) * mScaleRatio);// 当前位置比记录位置要小时正常返回if (distance 0) {break;}mIsPulling true;setZoom(distance);break;}}6、头部缩放private void setZoom(float s) {float scaleTimes (float) ((mHeaderWidth s) / (mHeaderWidth * 1.0));// 如超过最大放大倍数则直接返回if (scaleTimes mScaleTimes) {return;}ViewGroup.LayoutParams layoutParams mHeaderView.getLayoutParams();layoutParams.width (int) (mHeaderWidth s);layoutParams.height (int) (mHeaderHeight * ((mHeaderWidth s) / mHeaderWidth));// 设置控件水平居中((MarginLayoutParams) layoutParams).setMargins(-(layoutParams.width - mHeaderWidth) / 2, 0, 0, 0);mHeaderView.setLayoutParams(layoutParams);}7、回弹动画private void replyView() {final float distance mHeaderView.getMeasuredWidth() - mHeaderWidth;// 设置动画ValueAnimator anim ObjectAnimator.ofFloat(distance, 0.0F).setDuration((long) (distance * mReplyRatio));anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {Overridepublic void onAnimationUpdate(ValueAnimator animation) {setZoom((Float) animation.getAnimatedValue());}});anim.start();}通过以上方式就可以简单的实现我们想要的效果了项目地址 ☞ 传送门以上就是本文的全部内容希望对大家的学习有所帮助也希望大家多多支持脚本之家。