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.configure.PickerOptions;
|
import com.bigkoo.pickerview.listener.OnDismissListener;
|
import com.bigkoo.pickerview.utils.PickerViewAnimateUtil;
|
import com.example.pickerviewlibrary.R;
|
|
/**
|
* 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;
|
}
|
|
}
|