package com.bigkoo.pickerview.view;  
 | 
  
 | 
import android.app.Activity;  
 | 
import android.app.Dialog;  
 | 
import android.content.Context;  
 | 
import android.content.DialogInterface;  
 | 
import android.graphics.Color;  
 | 
import android.view.Gravity;  
 | 
import android.view.KeyEvent;  
 | 
import android.view.LayoutInflater;  
 | 
import android.view.MotionEvent;  
 | 
import android.view.View;  
 | 
import android.view.ViewGroup;  
 | 
import android.view.Window;  
 | 
import android.view.animation.Animation;  
 | 
import android.view.animation.AnimationUtils;  
 | 
import android.widget.FrameLayout;  
 | 
  
 | 
import com.bigkoo.pickerview.R;  
 | 
import com.bigkoo.pickerview.configure.PickerOptions;  
 | 
import com.bigkoo.pickerview.listener.OnDismissListener;  
 | 
import com.bigkoo.pickerview.utils.PickerViewAnimateUtil;  
 | 
  
 | 
/**  
 | 
 * Created by Sai on 15/11/22.  
 | 
 * 精仿iOSPickerViewController控件  
 | 
 */  
 | 
public class BasePickerView {  
 | 
  
 | 
    private Context context;  
 | 
    protected ViewGroup contentContainer;  
 | 
    private ViewGroup rootView;//附加View 的 根View  
 | 
    private ViewGroup dialogView;//附加Dialog 的 根View  
 | 
  
 | 
    protected PickerOptions mPickerOptions;  
 | 
    private OnDismissListener onDismissListener;  
 | 
    private boolean dismissing;  
 | 
  
 | 
    private Animation outAnim;  
 | 
    private Animation inAnim;  
 | 
    private boolean isShowing;  
 | 
  
 | 
    protected int animGravity = Gravity.BOTTOM;  
 | 
  
 | 
    private Dialog mDialog;  
 | 
    protected View clickView;//是通过哪个View弹出的  
 | 
    private boolean isAnim = true;  
 | 
  
 | 
    public BasePickerView(Context context) {  
 | 
        this.context = context;  
 | 
    }  
 | 
  
 | 
  
 | 
    protected void initViews() {  
 | 
  
 | 
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(  
 | 
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM);  
 | 
  
 | 
        LayoutInflater layoutInflater = LayoutInflater.from(context);  
 | 
        if (isDialog()) {  
 | 
            //如果是对话框模式  
 | 
            dialogView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, null, false);  
 | 
            //设置界面的背景为透明  
 | 
            dialogView.setBackgroundColor(Color.TRANSPARENT);  
 | 
            //这个是真正要加载选择器的父布局  
 | 
            contentContainer = (ViewGroup) dialogView.findViewById(R.id.content_container);  
 | 
            //设置对话框 默认左右间距屏幕30  
 | 
            params.leftMargin = 30;  
 | 
            params.rightMargin = 30;  
 | 
            contentContainer.setLayoutParams(params);  
 | 
            //创建对话框  
 | 
            createDialog();  
 | 
            //给背景设置点击事件,这样当点击内容以外的地方会关闭界面  
 | 
            dialogView.setOnClickListener(new View.OnClickListener() {  
 | 
                @Override  
 | 
                public void onClick(View view) {  
 | 
                    dismiss();  
 | 
                }  
 | 
            });  
 | 
        } else {  
 | 
            //如果只是要显示在屏幕的下方  
 | 
            //decorView是activity的根View,包含 contentView 和 titleView  
 | 
            if (mPickerOptions.decorView == null) {  
 | 
                mPickerOptions.decorView = (ViewGroup) ((Activity) context).getWindow().getDecorView();  
 | 
            }  
 | 
            //将控件添加到decorView中  
 | 
            rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, mPickerOptions.decorView, false);  
 | 
            rootView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));  
 | 
            if (mPickerOptions.outSideColor != -1) {  
 | 
                rootView.setBackgroundColor(mPickerOptions.outSideColor);  
 | 
            }  
 | 
            //这个是真正要加载时间选取器的父布局  
 | 
            contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container);  
 | 
            contentContainer.setLayoutParams(params);  
 | 
        }  
 | 
        setKeyBackCancelable(true);  
 | 
    }  
 | 
  
 | 
    protected void initAnim() {  
 | 
        inAnim = getInAnimation();  
 | 
        outAnim = getOutAnimation();  
 | 
    }  
 | 
  
 | 
    protected void initEvents() {  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * @param v      (是通过哪个View弹出的)  
 | 
     * @param isAnim 是否显示动画效果  
 | 
     */  
 | 
    public void show(View v, boolean isAnim) {  
 | 
        this.clickView = v;  
 | 
        this.isAnim = isAnim;  
 | 
        show();  
 | 
    }  
 | 
  
 | 
    public void show(boolean isAnim) {  
 | 
        show(null, isAnim);  
 | 
    }  
 | 
  
 | 
    public void show(View v) {  
 | 
        this.clickView = v;  
 | 
        show();  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 添加View到根视图  
 | 
     */  
 | 
    public void show() {  
 | 
        if (isDialog()) {  
 | 
            showDialog();  
 | 
        } else {  
 | 
            if (isShowing()) {  
 | 
                return;  
 | 
            }  
 | 
            isShowing = true;  
 | 
            onAttached(rootView);  
 | 
            rootView.requestFocus();  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * show的时候调用  
 | 
     *  
 | 
     * @param view 这个View  
 | 
     */  
 | 
    private void onAttached(View view) {  
 | 
        mPickerOptions.decorView.addView(view);  
 | 
        if (isAnim) {  
 | 
            contentContainer.startAnimation(inAnim);  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * 检测该View是不是已经添加到根视图  
 | 
     *  
 | 
     * @return 如果视图已经存在该View返回true  
 | 
     */  
 | 
    public boolean isShowing() {  
 | 
        if (isDialog()) {  
 | 
            return false;  
 | 
        } else {  
 | 
            return rootView.getParent() != null || isShowing;  
 | 
        }  
 | 
  
 | 
    }  
 | 
  
 | 
    public void dismiss() {  
 | 
        if (isDialog()) {  
 | 
            dismissDialog();  
 | 
        } else {  
 | 
            if (dismissing) {  
 | 
                return;  
 | 
            }  
 | 
  
 | 
            if (isAnim) {  
 | 
                //消失动画  
 | 
                outAnim.setAnimationListener(new Animation.AnimationListener() {  
 | 
                    @Override  
 | 
                    public void onAnimationStart(Animation animation) {  
 | 
  
 | 
                    }  
 | 
  
 | 
                    @Override  
 | 
                    public void onAnimationEnd(Animation animation) {  
 | 
                        dismissImmediately();  
 | 
                    }  
 | 
  
 | 
                    @Override  
 | 
                    public void onAnimationRepeat(Animation animation) {  
 | 
  
 | 
                    }  
 | 
                });  
 | 
                contentContainer.startAnimation(outAnim);  
 | 
            } else {  
 | 
                dismissImmediately();  
 | 
            }  
 | 
            dismissing = true;  
 | 
        }  
 | 
  
 | 
  
 | 
    }  
 | 
  
 | 
    public void dismissImmediately() {  
 | 
  
 | 
        mPickerOptions.decorView.post(new Runnable() {  
 | 
            @Override  
 | 
            public void run() {  
 | 
                //从根视图移除  
 | 
                mPickerOptions.decorView.removeView(rootView);  
 | 
                isShowing = false;  
 | 
                dismissing = false;  
 | 
                if (onDismissListener != null) {  
 | 
                    onDismissListener.onDismiss(BasePickerView.this);  
 | 
                }  
 | 
            }  
 | 
        });  
 | 
  
 | 
  
 | 
    }  
 | 
  
 | 
    private Animation getInAnimation() {  
 | 
        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, true);  
 | 
        return AnimationUtils.loadAnimation(context, res);  
 | 
    }  
 | 
  
 | 
    private Animation getOutAnimation() {  
 | 
        int res = PickerViewAnimateUtil.getAnimationResource(this.animGravity, false);  
 | 
        return AnimationUtils.loadAnimation(context, res);  
 | 
    }  
 | 
  
 | 
    public BasePickerView setOnDismissListener(OnDismissListener onDismissListener) {  
 | 
        this.onDismissListener = onDismissListener;  
 | 
        return this;  
 | 
    }  
 | 
  
 | 
    public void setKeyBackCancelable(boolean isCancelable) {  
 | 
  
 | 
        ViewGroup View;  
 | 
        if (isDialog()) {  
 | 
            View = dialogView;  
 | 
        } else {  
 | 
            View = rootView;  
 | 
        }  
 | 
  
 | 
        View.setFocusable(isCancelable);  
 | 
        View.setFocusableInTouchMode(isCancelable);  
 | 
        if (isCancelable) {  
 | 
            View.setOnKeyListener(onKeyBackListener);  
 | 
        } else {  
 | 
            View.setOnKeyListener(null);  
 | 
        }  
 | 
    }  
 | 
  
 | 
    private View.OnKeyListener onKeyBackListener = new View.OnKeyListener() {  
 | 
        @Override  
 | 
        public boolean onKey(View v, int keyCode, KeyEvent event) {  
 | 
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == MotionEvent.ACTION_DOWN && isShowing()) {  
 | 
                dismiss();  
 | 
                return true;  
 | 
            }  
 | 
            return false;  
 | 
        }  
 | 
    };  
 | 
  
 | 
    protected BasePickerView setOutSideCancelable(boolean isCancelable) {  
 | 
  
 | 
        if (rootView != null) {  
 | 
            View view = rootView.findViewById(R.id.outmost_container);  
 | 
  
 | 
            if (isCancelable) {  
 | 
                view.setOnTouchListener(onCancelableTouchListener);  
 | 
            } else {  
 | 
                view.setOnTouchListener(null);  
 | 
            }  
 | 
        }  
 | 
  
 | 
        return this;  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 设置对话框模式是否可以点击外部取消  
 | 
     */  
 | 
    public void setDialogOutSideCancelable() {  
 | 
        if (mDialog != null) {  
 | 
            mDialog.setCancelable(mPickerOptions.cancelable);  
 | 
        }  
 | 
    }  
 | 
  
 | 
  
 | 
    /**  
 | 
     * Called when the user touch on black overlay, in order to dismiss the dialog.  
 | 
     */  
 | 
    private final View.OnTouchListener onCancelableTouchListener = new View.OnTouchListener() {  
 | 
        @Override  
 | 
        public boolean onTouch(View v, MotionEvent event) {  
 | 
            if (event.getAction() == MotionEvent.ACTION_DOWN) {  
 | 
                dismiss();  
 | 
            }  
 | 
            return false;  
 | 
        }  
 | 
    };  
 | 
  
 | 
    public View findViewById(int id) {  
 | 
        return contentContainer.findViewById(id);  
 | 
    }  
 | 
  
 | 
    public void createDialog() {  
 | 
        if (dialogView != null) {  
 | 
            mDialog = new Dialog(context, R.style.custom_dialog2);  
 | 
            mDialog.setCancelable(mPickerOptions.cancelable);//不能点外面取消,也不能点back取消  
 | 
            mDialog.setContentView(dialogView);  
 | 
  
 | 
            Window dialogWindow = mDialog.getWindow();  
 | 
            if (dialogWindow != null) {  
 | 
                dialogWindow.setWindowAnimations(R.style.picker_view_scale_anim);  
 | 
                dialogWindow.setGravity(Gravity.CENTER);//可以改成Bottom  
 | 
            }  
 | 
  
 | 
            mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {  
 | 
                @Override  
 | 
                public void onDismiss(DialogInterface dialog) {  
 | 
                    if (onDismissListener != null) {  
 | 
                        onDismissListener.onDismiss(BasePickerView.this);  
 | 
                    }  
 | 
                }  
 | 
            });  
 | 
        }  
 | 
    }  
 | 
  
 | 
    private void showDialog() {  
 | 
        if (mDialog != null) {  
 | 
            mDialog.show();  
 | 
        }  
 | 
    }  
 | 
  
 | 
    private void dismissDialog() {  
 | 
        if (mDialog != null) {  
 | 
            mDialog.dismiss();  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public ViewGroup getDialogContainerLayout() {  
 | 
        return contentContainer;  
 | 
    }  
 | 
  
 | 
  
 | 
    public Dialog getDialog() {  
 | 
        return mDialog;  
 | 
    }  
 | 
  
 | 
  
 | 
    public boolean isDialog() {  
 | 
        return false;  
 | 
    }  
 | 
  
 | 
}  
 |