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.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import com.bigkoo.pickerview.R; import com.bigkoo.pickerview.listener.OnDismissListener; import com.bigkoo.pickerview.utils.PickerViewAnimateUtil; /** * Created by Sai on 15/11/22. * 精仿iOSPickerViewController控件 */ public class BasePickerView { private final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM ); private Context context; protected ViewGroup contentContainer; public ViewGroup decorView;//显示pickerview的根View,默认是activity的根view private ViewGroup rootView;//附加View 的 根View private ViewGroup dialogView;//附加Dialog 的 根View protected int pickerview_timebtn_nor = 0xFF057dff; protected int pickerview_timebtn_pre = 0xFFc2daf5; protected int pickerview_bg_topbar = 0xFFf5f5f5; protected int pickerview_topbar_title = 0xFF000000; protected int bgColor_default = 0xFFFFFFFF; private OnDismissListener onDismissListener; private boolean dismissing; private Animation outAnim; private Animation inAnim; private boolean isShowing; private int gravity = Gravity.BOTTOM; private Dialog mDialog; private boolean cancelable;//是否能取消 protected View clickView;//是通过哪个View弹出的 private boolean isAnim = true; public BasePickerView(Context context) { this.context = context; /*initViews(); init(); initEvents();*/ } protected void initViews(int backgroudId) { 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 this.params.leftMargin = 30; this.params.rightMargin = 30; contentContainer.setLayoutParams(this.params); //创建对话框 createDialog(); //给背景设置点击事件,这样当点击内容以外的地方会关闭界面 dialogView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dismiss(); } }); } else { //如果只是要显示在屏幕的下方 //decorView是activity的根View if (decorView == null) { decorView = (ViewGroup) ((Activity) context).getWindow().getDecorView().findViewById(android.R.id.content); } //将控件添加到decorView中 rootView = (ViewGroup) layoutInflater.inflate(R.layout.layout_basepickerview, decorView, false); rootView.setLayoutParams(new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT )); if (backgroudId != 0) { rootView.setBackgroundColor(backgroudId); } // rootView.setBackgroundColor(ContextCompat.getColor(context,backgroudId)); //这个是真正要加载时间选取器的父布局 contentContainer = (ViewGroup) rootView.findViewById(R.id.content_container); contentContainer.setLayoutParams(params); } setKeyBackCancelable(true); } protected void init() { 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) { this.isAnim = isAnim; show(); } 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) { 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() { decorView.post(new Runnable() { @Override public void run() { //从根视图移除 decorView.removeView(rootView); isShowing = false; dismissing = false; if (onDismissListener != null) { onDismissListener.onDismiss(BasePickerView.this); } } }); } public Animation getInAnimation() { int res = PickerViewAnimateUtil.getAnimationResource(this.gravity, true); return AnimationUtils.loadAnimation(context, res); } public Animation getOutAnimation() { int res = PickerViewAnimateUtil.getAnimationResource(this.gravity, 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; } /** * 设置对话框模式是否可以点击外部取消 * * @param cancelable */ public void setDialogOutSideCancelable(boolean cancelable) { this.cancelable = 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(cancelable);//不能点外面取消,也不 能点back取消 mDialog.setContentView(dialogView); mDialog.getWindow().setWindowAnimations(R.style.pickerview_dialogAnim); mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { if (onDismissListener != null) { onDismissListener.onDismiss(BasePickerView.this); } } }); } } public void showDialog() { if (mDialog != null) { mDialog.show(); } } public void dismissDialog() { if (mDialog != null) { mDialog.dismiss(); } } public boolean isDialog() { return false; } }