package com.flyco.dialog.widget.popup.base;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.flyco.animation.BounceEnter.BounceLeftEnter;
import com.flyco.animation.FadeExit.FadeExit;
import com.flyco.dialog.R;
import com.flyco.dialog.utils.CornerUtils;
import com.flyco.dialog.utils.StatusBarUtils;
import com.flyco.dialog.view.TriangleView;
import com.flyco.dialog.widget.internal.InternalBasePopup;
/**
* Use dialog to realize bubble style popup(利用Dialog实现泡泡样式的弹窗)
* thanks https://github.com/michaelye/EasyDialog
*/
public abstract class BaseBubblePopup<T extends BaseBubblePopup<T>> extends InternalBasePopup<T> {
protected View mWrappedView;
protected LinearLayout mLlContent;
protected TriangleView mTriangleView;
protected RelativeLayout.LayoutParams mLayoutParams;
protected int mBubbleColor;
protected int mCornerRadius;
protected int mMarginLeft;
protected int mMarginRight;
protected int triangleWidth;
protected int triangleHeight;
private RelativeLayout.LayoutParams mTriangleLayoutParams;
public BaseBubblePopup(Context context) {
super(context);
mWrappedView = onCreateBubbleView();
init();
}
public BaseBubblePopup(Context context, View wrappedView) {
super(context);
mWrappedView = wrappedView;
init();
}
private void init() {
showAnim(new BounceLeftEnter());
dismissAnim(new FadeExit());
dimEnabled(false);
bubbleColor(Color.parseColor("#BB000000"));
cornerRadius(5);
margin(8, 8);
gravity(Gravity.TOP);
triangleWidth(24);
triangleHeight(12);
}
public abstract View onCreateBubbleView();
@Override
public View onCreateView() {
View inflate = View.inflate(mContext, R.layout.popup_bubble, null);
mLlContent = (LinearLayout) inflate.findViewById(R.id.ll_content);
mTriangleView = (TriangleView) inflate.findViewById(R.id.triangle_view);
mLlContent.addView(mWrappedView);
mLayoutParams = (RelativeLayout.LayoutParams) mLlContent.getLayoutParams();
mTriangleLayoutParams = (RelativeLayout.LayoutParams) mTriangleView.getLayoutParams();
//让mOnCreateView充满父控件,防止ViewHelper.setXY导致点击事件无效
inflate.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
return inflate;
}
@Override
public void setUiBeforShow() {
mLlContent.setBackgroundDrawable(
CornerUtils.cornerDrawable(mBubbleColor, mCornerRadius));
mLayoutParams.setMargins(mMarginLeft, 0, mMarginRight, 0);
mLlContent.setLayoutParams(mLayoutParams);
mTriangleView.setColor(mBubbleColor);
mTriangleView.setGravity(mGravity == Gravity.TOP ? Gravity.BOTTOM : Gravity.TOP);
mTriangleLayoutParams.width = triangleWidth;
mTriangleLayoutParams.height = triangleHeight;
mTriangleView.setLayoutParams(mTriangleLayoutParams);
}
@Override
public void onLayoutObtain() {
mTriangleView.setX(mX - mTriangleView.getWidth() / 2);
if (mGravity == Gravity.TOP) {
int y = mY - mTriangleView.getHeight();
mTriangleView.setY(y);
mLlContent.setY(y - mLlContent.getHeight());
} else {
mTriangleView.setY(mY);
mLlContent.setY(mY + mTriangleView.getHeight());
}
/**
* mX--->三角形中心距离屏幕左边距离
* mDisplayMetrics.widthPixels - mX--->三角形中心距离屏幕右边距离
*/
int availableLeft = mX - mLayoutParams.leftMargin;//左侧最大可用距离
int availableRight = mDisplayMetrics.widthPixels - mX - mLayoutParams.rightMargin;//右侧最大可用距离
int x = 0;
int contentWidth = mLlContent.getWidth();
if (contentWidth / 2 <= availableLeft && contentWidth / 2 <= availableRight) {
x = mX - contentWidth / 2;
} else {
if (availableLeft <= availableRight) {//三角形在屏幕中心的左边
x = mLayoutParams.leftMargin;
} else {//三角形在屏幕中心的右边
x = mDisplayMetrics.widthPixels - (contentWidth + mLayoutParams.rightMargin);
}
}
mLlContent.setX(x);
}
@Override
public T anchorView(View anchorView) {
if (anchorView != null) {
mAnchorView = anchorView;
int[] location = new int[2];
mAnchorView.getLocationOnScreen(location);
mX = location[0] + anchorView.getWidth() / 2;
if (mGravity == Gravity.TOP) {
mY = location[1] - StatusBarUtils.getHeight(mContext)
- dp2px(1);
} else {
mY = location[1] - StatusBarUtils.getHeight(mContext)
+ anchorView.getHeight() + dp2px(1);
}
}
return (T) this;
}
public T bubbleColor(int bubbleColor) {
mBubbleColor = bubbleColor;
return (T) this;
}
public T cornerRadius(float cornerRadius) {
mCornerRadius = dp2px(cornerRadius);
return (T) this;
}
public T margin(float marginLeft, float marginRight) {
mMarginLeft = dp2px(marginLeft);
mMarginRight = dp2px(marginRight);
return (T) this;
}
public T triangleWidth(float width) {
triangleWidth = dp2px(width);
return (T) this;
}
public T triangleHeight(float height) {
triangleHeight = dp2px(height);
return (T) this;
}
}