package com.kuanzhai.driver.utils.EasePopup;
|
|
import android.content.Context;
|
import android.graphics.drawable.ColorDrawable;
|
import android.os.Build;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.widget.PopupWindow;
|
|
/**
|
* Created by CaostGrace on 2018/6/21 13:14
|
*
|
* @project_name: ChatApp
|
* @package_name: com.cdwh.chatApp.ui.widget
|
* @class_name: CommonPopupWindow
|
* @github: https://github.com/CaostGrace
|
* @简书: http://www.jianshu.com/u/b252a19d88f3
|
* @content:
|
*/
|
public abstract class CommonPopupWindow {
|
protected Context context;
|
protected View contentView;
|
public PopupWindow mInstance;
|
|
public CommonPopupWindow(Context c, int layoutRes, int w, int h) {
|
context=c;
|
contentView= LayoutInflater.from(c).inflate(layoutRes, null, false);
|
|
initView();
|
initEvent();
|
|
mInstance=new PopupWindow(contentView, w, h, true);
|
|
initWindow();
|
}
|
|
public View getContentView() { return contentView; }
|
public PopupWindow getPopupWindow() { return mInstance; }
|
|
protected abstract void initView();
|
protected abstract void initEvent();
|
protected void initWindow() {
|
mInstance.setBackgroundDrawable(new ColorDrawable(0xff000000));
|
mInstance.setOutsideTouchable(true);
|
mInstance.setTouchable(true);
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
mInstance.setElevation(10.0f);
|
}
|
}
|
|
public void showBashOfAnchor(View anchor, LayoutGravity layoutGravity, int xmerge, int ymerge) {
|
int[] offset=layoutGravity.getOffset(anchor, mInstance);
|
mInstance.showAsDropDown(anchor, offset[0]+xmerge, offset[1]+ymerge);
|
}
|
|
public void showAsDropDown(View anchor, int xoff, int yoff) {
|
mInstance.showAsDropDown(anchor, xoff, yoff);
|
}
|
public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) {
|
mInstance.showAsDropDown(anchor, xoff, yoff,gravity);
|
}
|
|
public void showAtLocation(View parent, int gravity, int x, int y) {
|
mInstance.showAtLocation(parent, gravity, x, y);
|
}
|
|
public static class LayoutGravity {
|
private int layoutGravity;
|
// waring, don't change the order of these constants!
|
public static final int ALIGN_LEFT=0x1;
|
public static final int ALIGN_ABOVE=0x2;
|
public static final int ALIGN_RIGHT=0x4;
|
public static final int ALIGN_BOTTOM=0x8;
|
public static final int TO_LEFT=0x10;
|
public static final int TO_ABOVE=0x20;
|
public static final int TO_RIGHT=0x40;
|
public static final int TO_BOTTOM=0x80;
|
public static final int CENTER_HORI=0x100;
|
public static final int CENTER_VERT=0x200;
|
|
public LayoutGravity(int gravity) {
|
layoutGravity=gravity;
|
}
|
|
public int getLayoutGravity() { return layoutGravity; }
|
public void setLayoutGravity(int gravity) { layoutGravity=gravity; }
|
|
public void setHoriGravity(int gravity) {
|
layoutGravity&=(0x2+0x8+0x20+0x80+0x200);
|
layoutGravity|=gravity;
|
}
|
public void setVertGravity(int gravity) {
|
layoutGravity&=(0x1+0x4+0x10+0x40+0x100);
|
layoutGravity|=gravity;
|
}
|
|
public boolean isParamFit(int param) {
|
return (layoutGravity & param) > 0;
|
}
|
|
public int getHoriParam() {
|
for(int i=0x1; i<=0x100; i=i<<2)
|
if(isParamFit(i))
|
return i;
|
return ALIGN_LEFT;
|
}
|
|
public int getVertParam() {
|
for(int i=0x2; i<=0x200; i=i<<2)
|
if(isParamFit(i))
|
return i;
|
return TO_BOTTOM;
|
}
|
|
public int[] getOffset(View anchor, PopupWindow window) {
|
int anchWidth=anchor.getWidth();
|
int anchHeight=anchor.getHeight();
|
|
int winWidth=window.getWidth();
|
int winHeight=window.getHeight();
|
View view=window.getContentView();
|
if(winWidth<=0)
|
winWidth=view.getWidth();
|
if(winHeight<=0)
|
winHeight=view.getHeight();
|
|
int xoff=0;
|
int yoff=0;
|
|
switch (getHoriParam()) {
|
case ALIGN_LEFT:
|
xoff=0; break;
|
case ALIGN_RIGHT:
|
xoff=anchWidth-winWidth; break;
|
case TO_LEFT:
|
xoff=-winWidth; break;
|
case TO_RIGHT:
|
xoff=anchWidth; break;
|
case CENTER_HORI:
|
xoff=(anchWidth-winWidth)/2; break;
|
default:break;
|
}
|
switch (getVertParam()) {
|
case ALIGN_ABOVE:
|
yoff=-anchHeight; break;
|
case ALIGN_BOTTOM:
|
yoff=-winHeight; break;
|
case TO_ABOVE:
|
yoff=-anchHeight-winHeight; break;
|
case TO_BOTTOM:
|
yoff=0; break;
|
case CENTER_VERT:
|
yoff=(-winHeight-anchHeight)/2; break;
|
default:break;
|
}
|
return new int[]{ xoff, yoff };
|
}
|
}
|
}
|