package com.stardust.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import com.stardust.scriptdroid.R;
/**
* Created by Stardust on 2017/1/24.
*/
public class SlidingUpPanel extends FrameLayout {
private static final long DEFAULT_ANIMATION_DURATION = 300;
private Animation mSlideUpAnimation, mSlideDownAnimation;
private View mShadow;
private boolean mShowing = false;
private FrameLayout mContentContainer;
public SlidingUpPanel(Context context) {
super(context);
init();
}
public SlidingUpPanel(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SlidingUpPanel(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SlidingUpPanel(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public void show() {
setVisibility(VISIBLE);
setClickable(true);
mContentContainer.startAnimation(mSlideUpAnimation);
mShowing = true;
}
public void dismiss() {
mContentContainer.startAnimation(mSlideDownAnimation);
postDelayed(new Runnable() {
@Override
public void run() {
SlidingUpPanel.this.setVisibility(GONE);
}
}, mSlideDownAnimation.getDuration());
mShowing = false;
}
public void setAnimationDuration(long animationDuration) {
mSlideUpAnimation.setDuration(animationDuration);
mSlideDownAnimation.setDuration(animationDuration / 2);
}
public boolean isShowing() {
return mShowing;
}
private void init() {
LayoutInflater.from(getContext()).inflate(R.layout.sliding_up_panel, this, true);
initShadow();
initAnimation();
setVisibility(GONE);
mContentContainer = (FrameLayout) findViewById(R.id.content_container);
}
private void initAnimation() {
mSlideUpAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_up);
mSlideDownAnimation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_down);
setAnimationDuration(DEFAULT_ANIMATION_DURATION);
}
private void initShadow() {
mShadow = findViewById(R.id.shadow);
mShadow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SlidingUpPanel.this.dismiss();
}
});
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP && isShowing()) {
dismiss();
}
return super.onInterceptTouchEvent(ev);
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if (mContentContainer != null)
mContentContainer.addView(child, index, params);
else
super.addView(child, index, params);
}
}