package com.qtfreet.musicuu.ui.view;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;
import com.nineoldandroids.view.ViewHelper;
/**
* Created by MarioStudio on 2016/8/1.
*/
public class CustomRelativeLayout extends RelativeLayout {
private float height;
private boolean mShowing;
public CustomRelativeLayout(Context context) {
super(context);
initCustomRelativeLayout(context);
}
public CustomRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initCustomRelativeLayout(context);
}
public CustomRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initCustomRelativeLayout(context);
}
private void initCustomRelativeLayout(Context context) {
height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 240, context.getResources().getDisplayMetrics());
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
setOnTouchListener(new CustomRelativeLayoutTouchListener());
doShow();
}
private class CustomRelativeLayoutTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
doDismiss();
break;
}
return true;
}
}
public void show() {
doShow();
}
public void dismiss() {
doDismiss();
}
private void doShow() {
setVisibility(View.INVISIBLE);
ValueAnimator animator01 = ValueAnimator.ofFloat(1.0f, 0.0f);
animator01.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
doUpdate((Float) animation.getAnimatedValue());
}
});
animator01.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
View child = getChildAt(0);
ViewHelper.setTranslationY(child, height);
setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mShowing = false;
}
});
ValueAnimator animator02 = ValueAnimator.ofObject(new ArgbEvaluator(), Color.TRANSPARENT, Color.parseColor("#A0000000"));
animator02.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setBackgroundColor((Integer) animation.getAnimatedValue());
}
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(animator01).with(animator02);
animatorSet.setDuration(360);
animatorSet.start();
}
private void doDismiss() {
ValueAnimator animator01 = ValueAnimator.ofFloat(0.0f, 1.0f);
animator01.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
doUpdate((Float) animation.getAnimatedValue());
}
});
animator01.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
View child = getChildAt(0);
ViewHelper.setTranslationY(child, 0);
setVisibility(View.VISIBLE);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mShowing = false;
setVisibility(View.GONE);
}
});
ValueAnimator animator02 = ValueAnimator.ofObject(new ArgbEvaluator(), Color.parseColor("#A0000000"), Color.TRANSPARENT);
animator02.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
setBackgroundColor((Integer) animation.getAnimatedValue());
}
});
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(animator01).with(animator02);
animatorSet.setDuration(360);
animatorSet.start();
}
private void doUpdate(float value) {
View child = getChildAt(0);
ViewHelper.setTranslationY(child, value * height);
}
public boolean isShowing() {
return mShowing;
}
}