目前 尾部视差效果上拉有些许抖动,还请大神帮忙看下是什么原因
/** * Created by IT小蔡 on 2017-3-29. */public class ParallaxListView extends ListView { private ImageView headImageView; private ImageView footImageView; private int maxHeight; private int orignalHeight; private int footOrignalHeight; private int maxFootHeight; private boolean isHeaderImageFlag; private boolean isFooterImageFlag; public ParallaxListView(Context context) { this(context, null); } public ParallaxListView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ParallaxListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setHeadImageView(final ImageView headImageView) { this.headImageView = headImageView; headImageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { headImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this); orignalHeight = headImageView.getHeight(); Log.e(TAG, "orignalHeight:" + orignalHeight); //获取图片原始高度 int intrinsicHeight = headImageView.getDrawable().getIntrinsicHeight(); Log.e(TAG, "intrinsicHeight:" + intrinsicHeight); maxHeight = orignalHeight > intrinsicHeight ? orignalHeight * 2 : intrinsicHeight; } }); } ; public void setFootImageView(final ImageView footImageView) { this.footImageView = footImageView; footImageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { // TODO Auto-generated method stub footImageView.getViewTreeObserver().removeOnPreDrawListener(this); footOrignalHeight = footImageView.getHeight(); Log.e(TAG, "footOrignalHeight:" + footOrignalHeight); //获取图片原始高度 int footIntrinsicHeight = footImageView.getDrawable().getIntrinsicHeight(); Log.e(TAG, "footIntrinsicHeight:" + footIntrinsicHeight); maxFootHeight = footOrignalHeight > footIntrinsicHeight ? footOrignalHeight * 2 : footIntrinsicHeight; return true; } }); } ; /** * @param deltaX 继续滑动X轴方向的距离 * @param deltaY 继续滑动Y轴方向的距离 负值,顶部到头,正,底部到头 * @param scrollX * @param scrollY * @param scrollRangeX * @param scrollRangeY * @param maxOverScrollX X轴方向可以滚动的最大距离 * @param maxOverScrollY Y轴方向可以滚动的最大距离 * @param isTouchEvent true:手指拖动滑动 ,false:fling靠惯性滑动 * @return */ @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {// Log.e(TAG, "deltaY:" + deltaY + " scrollY:" + scrollY + " scrollRangeY:" + scrollRangeY + " maxOverScrollY:" + maxOverScrollY + " isTouchEvent" + isTouchEvent); if (deltaY < 0 && isTouchEvent) { isHeaderImageFlag = true;//头部图片发生变化 //顶部到头,并且手指拖动 int newHeight = headImageView.getHeight() - deltaY/2; if (newHeight > maxHeight) { newHeight = maxHeight; } headImageView.getLayoutParams().height = newHeight; headImageView.requestLayout(); } if(deltaY >0 && isTouchEvent){ isFooterImageFlag = true; //底部到头,并且手指拖动 int newFootHeight = footImageView.getHeight() + deltaY; if (newFootHeight > maxFootHeight) { newFootHeight = maxFootHeight; } footImageView.getLayoutParams().height = newFootHeight; footImageView.requestLayout(); } return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: if (isHeaderImageFlag) { isHeaderImageFlag = false; restoreHeadImg(headImageView, orignalHeight); } if(isFooterImageFlag){ isFooterImageFlag = false; restoreHeadImg(footImageView,footOrignalHeight); } break; } return super.onTouchEvent(ev); } private void restoreHeadImg(final ImageView imageView, int orignalHeight) { ValueAnimator animator = ValueAnimator.ofInt(imageView.getHeight(), orignalHeight); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { //获取动画的值,设置给imageview int animatedValue = (Integer) animator.getAnimatedValue(); imageView.getLayoutParams().height = animatedValue; imageView.requestLayout();//使ImageView的布局参数生效 } }); animator.setDuration(400); animator.start(); }}/** * Created