package com.com.mr_wrong.ViewDraghelper; import android.content.Context; import android.support.v4.view.ViewCompat; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; /** * Created by Mr_Wrong on 15/9/10. */ public class MyYoutobelayout extends ViewGroup { private ViewDragHelper mDragHelper; private int mTop; private int mDragRange; private View mHeaderView, mDescView; private float mDragOffset; public MyYoutobelayout(Context context, AttributeSet attrs) { super(context, attrs); mDragHelper = ViewDragHelper.create(this, 1f, new DragHelperCallBack()); } @Override protected void onFinishInflate() { super.onFinishInflate(); mHeaderView = getChildAt(0); mDescView = getChildAt(1); } private class DragHelperCallBack extends android.support.v4.widget.ViewDragHelper.Callback { @Override public boolean tryCaptureView(View child, int pointerId) { return mHeaderView == child; } @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { super.onViewPositionChanged(changedView, left, top, dx, dy); mTop = top; mDragOffset = (float) top / mDragRange; mHeaderView.setPivotX(mHeaderView.getWidth()); mHeaderView.setPivotY(mHeaderView.getHeight()); mHeaderView.setScaleX(1 - mDragOffset / 2); mHeaderView.setScaleY(1 - mDragOffset / 3); mDescView.setAlpha(1 - mDragOffset); requestLayout(); } @Override public int getViewVerticalDragRange(View child) { return mDragRange; } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { int top = getPaddingTop(); if(yvel>0||(yvel==0&&mDragOffset>0.5f)){ top+=mDragRange; } mDragHelper.settleCapturedViewAt(releasedChild.getLeft(),top); invalidate(); } @Override public int clampViewPositionVertical(View child, int top, int dy) { int topbound = getPaddingTop(); int bottombound = getHeight() - mHeaderView.getHeight(); int newtop = Math.min(Math.max(top, topbound), bottombound); return newtop; } } @Override public void computeScroll() { if(mDragHelper.continueSettling(true)){ ViewCompat.postInvalidateOnAnimation(this); } super.computeScroll(); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return mDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { mDragHelper.processTouchEvent(event); return true; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { measureChildren(widthMeasureSpec, heightMeasureSpec); int maxWidth = MeasureSpec.getSize(widthMeasureSpec); int maxHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, 0), resolveSizeAndState(maxHeight, heightMeasureSpec, 0)); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mDragRange = getHeight() - mHeaderView.getHeight(); mHeaderView.layout(0, mTop, r, mTop + mHeaderView.getMeasuredHeight()); mDescView.layout(0, mTop + mHeaderView.getMeasuredHeight(), r, mTop + b); } }