package com.hdl.widget.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.hdl.widgetxm.R; 
 | 
import com.hdl.widget.pickerview.configure.PickerOptions; 
 | 
import com.hdl.widget.pickerview.listener.OnDismissListener; 
 | 
import com.hdl.widget.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.hdl_widget_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.hdl_widget_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; 
 | 
    } 
 | 
  
 | 
} 
 |