package com.flyco.dialog.widget.popup.base; import android.content.Context; import android.view.Gravity; import android.view.View; import android.widget.LinearLayout; import com.flyco.dialog.R; import com.flyco.dialog.utils.StatusBarUtils; import com.flyco.dialog.widget.internal.InternalBasePopup; public abstract class BasePopup<T extends BasePopup<T>> extends InternalBasePopup<T> { protected View mWrappedView; protected LinearLayout mLlContent; protected boolean mAlignCenter; public BasePopup(Context context) { super(context); mWrappedView = onCreatePopupView(); gravity(Gravity.BOTTOM); } public abstract View onCreatePopupView(); @Override public View onCreateView() { View inflate = View.inflate(mContext, R.layout.popup_base, null); mLlContent = (LinearLayout) inflate.findViewById(R.id.ll_content); mLlContent.addView(mWrappedView); //让mOnCreateView充满父控件,防止ViewHelper.setXY导致点击事件无效 inflate.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); return inflate; } public T offset(float xOffset, float yOffset) { mXOffset = xOffset; mYOffset = yOffset; return (T) this; } /** align center of pop and anchorView(弹窗与anchorView中心对齐) */ public T alignCenter(boolean alignCenter) { mAlignCenter = alignCenter; return (T) this; } @Override public T anchorView(View anchorView) { if (anchorView != null) { mAnchorView = anchorView; int[] location = new int[2]; mAnchorView.getLocationOnScreen(location); mX = location[0]; if (mGravity == Gravity.TOP) { mY = location[1] - StatusBarUtils.getHeight(mContext); } else { mY = location[1] - StatusBarUtils.getHeight(mContext) + anchorView.getHeight(); } } return (T) this; } /** At this time, we can get view size in dialog(可以获得对话框内视图大小) */ @Override public void onLayoutObtain() { int x = mX; int y = mY; if (mGravity == Gravity.TOP) { y = mY - mLlContent.getHeight(); } if (mAlignCenter) { x = mX + mAnchorView.getWidth() / 2 - mLlContent.getWidth() / 2; } x = getX(x); y = getY(y); x = getX(x + dp2px(mXOffset)); y = getY(y + dp2px(mYOffset)); mLlContent.setX(x); mLlContent.setY(y); } private int getX(int x) { if (x < 0) { x = 0; } if (x + mLlContent.getWidth() > mDisplayMetrics.widthPixels) { x = mDisplayMetrics.widthPixels - mLlContent.getWidth(); } return x; } private int getY(int y) { if (y < 0) { y = 0; } if (y + mLlContent.getHeight() > mMaxHeight) { y = (int) (mMaxHeight - mLlContent.getHeight()); } return y; } }