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);
}
}