package com.steven.babyiyo.component; import android.content.Context; import android.content.res.TypedArray; import android.os.SystemClock; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ScrollView; import com.steven.babyiyo.R; public class PullToZoomScrollView extends PullToZoomBase<ScrollView> { private static final String TAG = PullToZoomScrollView.class.getSimpleName(); private boolean isCustomHeaderHeight = false;//�Զ���header�߶�֮����ܵ���zoomView���첻��ȷ private FrameLayout mHeaderContainer; private LinearLayout mRootContainer; private View mContentView; private int mHeaderHeight; private ScalingRunnable mScalingRunnable; private OnScrollViewChangedListener onScrollViewChangedListener; private static final Interpolator sInterpolator = new Interpolator() { public float getInterpolation(float paramAnonymousFloat) { float f = paramAnonymousFloat - 1.0F; return 1.0F + f * (f * (f * (f * f))); } }; public PullToZoomScrollView(Context context) { this(context, null); } public PullToZoomScrollView(Context context, AttributeSet attrs) { super(context, attrs); mScalingRunnable = new ScalingRunnable(); ((InternalScrollView) mRootView).setOnScrollViewChangedListener(new OnScrollViewChangedListener() { @Override public void onInternalScrollChanged(int left, int top, int oldLeft, int oldTop) { Log.i("==控件里面的监听",top+""); if (onScrollViewChangedListener != null) { onScrollViewChangedListener.onInternalScrollChanged(left, top, oldLeft, oldTop); Log.i("==控件里li面的监听",top+""); } if (isPullToZoomEnabled() && isParallax()) { Log.d(TAG, "onScrollChanged --> getScrollY() = " + mRootView.getScrollY()); float f = mHeaderHeight - mHeaderContainer.getBottom() + mRootView.getScrollY(); Log.d(TAG, "onScrollChanged --> f = " + f); if ((f > 0.0F) && (f < mHeaderHeight)) { int i = (int) (0.65D * f); mHeaderContainer.scrollTo(0, -i); } else if (mHeaderContainer.getScrollY() != 0) { mHeaderContainer.scrollTo(0, 0); } } } }); } @Override protected void pullHeaderToZoom(int newScrollValue) { Log.d(TAG, "pullHeaderToZoom --> newScrollValue = " + newScrollValue); Log.d(TAG, "pullHeaderToZoom --> mHeaderHeight = " + mHeaderHeight); if (mScalingRunnable != null && !mScalingRunnable.isFinished()) { mScalingRunnable.abortAnimation(); } ViewGroup.LayoutParams localLayoutParams = mHeaderContainer.getLayoutParams(); localLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight; mHeaderContainer.setLayoutParams(localLayoutParams); if (isCustomHeaderHeight) { ViewGroup.LayoutParams zoomLayoutParams = mZoomView.getLayoutParams(); zoomLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight; mZoomView.setLayoutParams(zoomLayoutParams); } } /** * �Ƿ���ʾheaderView * * @param isHideHeader true: show false: hide */ @Override public void setHideHeader(boolean isHideHeader) { if (isHideHeader != isHideHeader() && mHeaderContainer != null) { super.setHideHeader(isHideHeader); if (isHideHeader) { mHeaderContainer.setVisibility(GONE); } else { mHeaderContainer.setVisibility(VISIBLE); } } } @Override public void setHeaderView(View headerView) { if (headerView != null) { mHeaderView = headerView; updateHeaderView(); } } @Override public void setZoomView(View zoomView) { if (zoomView != null) { mZoomView = zoomView; updateHeaderView(); } } /** * ����HeaderView ���Ƴ�-->�����zoomView��HeaderView -->Ȼ����ӵ�listView��head */ private void updateHeaderView() { if (mHeaderContainer != null) { mHeaderContainer.removeAllViews(); if (mZoomView != null) { mHeaderContainer.addView(mZoomView); } if (mHeaderView != null) { mHeaderContainer.addView(mHeaderView); } } } public void setScrollContentView(View contentView) { if (contentView != null) { if (mContentView != null) { mRootContainer.removeView(mContentView); } mContentView = contentView; mRootContainer.addView(mContentView); } } @Override protected ScrollView createRootView(Context context, AttributeSet attrs) { ScrollView scrollView = new InternalScrollView(context, attrs); scrollView.setId(R.id.scrollview); return scrollView; } @Override protected void smoothScrollToTop() { Log.d(TAG, "smoothScrollToTop --> "); mScalingRunnable.startAnimation(200L); } @Override protected boolean isReadyForPullDown() { return mRootView.getScrollY() == 0; } @Override public void handleStyledAttributes(TypedArray a) { mRootContainer = new LinearLayout(getContext()); mRootContainer.setOrientation(LinearLayout.VERTICAL); mHeaderContainer = new FrameLayout(getContext()); if (mZoomView != null) { mHeaderContainer.addView(mZoomView); } if (mHeaderView != null) { mHeaderContainer.addView(mHeaderView); } int contentViewResId = a.getResourceId(R.styleable.PullToZoomView_contentView, 0); if (contentViewResId > 0) { LayoutInflater mLayoutInflater = LayoutInflater.from(getContext()); mContentView = mLayoutInflater.inflate(contentViewResId, null, false); } mRootContainer.addView(mHeaderContainer); if (mContentView != null) { mRootContainer.addView(mContentView); } mRootContainer.setClipChildren(false); mHeaderContainer.setClipChildren(false); mRootView.addView(mRootContainer); } /** * ����HeaderView�߶� * * @param width �� * @param height �� */ public void setHeaderViewSize(int width, int height) { if (mHeaderContainer != null) { Object localObject = mHeaderContainer.getLayoutParams(); if (localObject == null) { localObject = new ViewGroup.LayoutParams(width, height); } ((ViewGroup.LayoutParams) localObject).width = width; ((ViewGroup.LayoutParams) localObject).height = height; mHeaderContainer.setLayoutParams((ViewGroup.LayoutParams) localObject); mHeaderHeight = height; isCustomHeaderHeight = true; } } /** * ����HeaderView LayoutParams * * @param layoutParams LayoutParams */ public void setHeaderLayoutParams(LinearLayout.LayoutParams layoutParams) { if (mHeaderContainer != null) { mHeaderContainer.setLayoutParams(layoutParams); mHeaderHeight = layoutParams.height; isCustomHeaderHeight = true; } } protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2, int paramInt3, int paramInt4) { super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4); Log.d(TAG, "onLayout --> "); if (mHeaderHeight == 0 && mZoomView != null) { mHeaderHeight = mHeaderContainer.getHeight(); } } class ScalingRunnable implements Runnable { protected long mDuration; protected boolean mIsFinished = true; protected float mScale; protected long mStartTime; ScalingRunnable() { } public void abortAnimation() { mIsFinished = true; } public boolean isFinished() { return mIsFinished; } public void run() { if (mZoomView != null) { float f2; ViewGroup.LayoutParams localLayoutParams; if ((!mIsFinished) && (mScale > 1.0D)) { float f1 = ((float) SystemClock.currentThreadTimeMillis() - (float) mStartTime) / (float) mDuration; f2 = mScale - (mScale - 1.0F) * PullToZoomScrollView.sInterpolator.getInterpolation(f1); localLayoutParams = mHeaderContainer.getLayoutParams(); Log.d(TAG, "ScalingRunnable --> f2 = " + f2); if (f2 > 1.0F) { localLayoutParams.height = ((int) (f2 * mHeaderHeight)); mHeaderContainer.setLayoutParams(localLayoutParams); if (isCustomHeaderHeight) { ViewGroup.LayoutParams zoomLayoutParams; zoomLayoutParams = mZoomView.getLayoutParams(); zoomLayoutParams.height = ((int) (f2 * mHeaderHeight)); mZoomView.setLayoutParams(zoomLayoutParams); } post(this); return; } mIsFinished = true; } } } public void startAnimation(long paramLong) { if (mZoomView != null) { mStartTime = SystemClock.currentThreadTimeMillis(); mDuration = paramLong; mScale = ((float) (mHeaderContainer.getBottom()) / mHeaderHeight); mIsFinished = false; post(this); } } } protected class InternalScrollView extends ScrollView { private OnScrollViewChangedListener onScrollViewChangedListener; public InternalScrollView(Context context) { this(context, null); } public InternalScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setOnScrollViewChangedListener(OnScrollViewChangedListener onScrollViewChangedListener) { this.onScrollViewChangedListener = onScrollViewChangedListener; } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (onScrollViewChangedListener != null) { onScrollViewChangedListener.onInternalScrollChanged(l, t, oldl, oldt); } } } public interface OnScrollViewChangedListener { public void onInternalScrollChanged(int left, int top, int oldLeft, int oldTop); } public interface OnScrollViewChangedListeners { public void onInternalScrollChangeds(int left, int top, int oldLeft, int oldTop); } @Override protected boolean isReadyForPullUp() { // TODO Auto-generated method stub return false; } @Override protected void onZoomRelease(float initMotionY, float lastMotionY) { // TODO Auto-generated method stub } public void setOnScrollViewChangedListener(OnScrollViewChangedListener onScrollViewChangedListener) { this.onScrollViewChangedListener = onScrollViewChangedListener; } }