大家都知道,我们弹框实现可以由Dialog 弹框,Window弹框,Activity伪弹框三种方式实现,有时候一些特殊要求,但是那都不是什么事儿,看效果:
可能大家会选择用Popwindow去做,哈哈,换个思路,dialog轻松实现:
/**
* 仿Popup单选对话框
* Created by J.query on 17/4/9.
*/
public class ReportePopupDialog extends android.app.Dialog {
private Context context;
private TextView titleTv;
private TextView rightTv;
private TextView leftTv;
private View line;
private TextView closeTv;
public ReportePopupDialog(Context context) {
this(context, false);
}
/**
* @param context
* @param b 是否隐藏right btn
*/
public ReportePopupDialog(Context context, boolean b) {
this(context, R.style.SelectDialog);
this.context = context;
initViews(b);
}
public ReportePopupDialog(Context context, int themeResId) {
super(context, themeResId);
}
private void initViews(boolean b) {
LayoutInflater layoutInflater = LayoutInflater.from(context);
View view = layoutInflater.inflate(R.layout.layout_popup_dialog_select, null);
titleTv = (TextView) view.findViewById(R.id.tv_title);
line = view.findViewById(R.id.line);
closeTv = (TextView) view.findViewById(R.id.tv_close);
rightTv = (TextView) view.findViewById(R.id.tv_right);
leftTv = (TextView) view.findViewById(R.id.tv_left);
if (b) {
line.setVisibility(View.GONE);
rightTv.setVisibility(View.GONE);
leftTv.setBackgroundResource(R.drawable.actionsheet_bottom_selector);
}
//关闭弹框
closeTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
leftTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
if (listener != null)
listener.leftClick();
}
});
rightTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
if (listener != null)
listener.rightClick();
}
});
setContentView(view);
//设置Activity不变暗
setWindowLayoutParam();
}
private void setWindowLayoutParam() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.width = DisplayUtils.getScreenWidth(context) * 2 / 3;
lp.dimAmount = 0f;
lp.y = DisplayUtils.getScreenWidth(context) * 1 / 3;
lp.alpha = 0.6f;
getWindow().setAttributes(lp);
//动画
getWindow().setWindowAnimations(R.style.TopPopAnim);
}
public ReportePopupDialog setTitle(String s) {
if (titleTv != null)
titleTv.setText(s);
return this;
}
public void setLeftAndRightButtonText(String left, String right) {
if (leftTv != null) {
leftTv.setText(left);
}
if (rightTv != null) {
rightTv.setText(right);
}
}
public void setLeftAndRightText(String left, String right) {
line.setVisibility(View.VISIBLE);
if (leftTv != null) {
leftTv.setVisibility(View.VISIBLE);
leftTv.setText(left);
}
if (rightTv != null) {
rightTv.setVisibility(View.VISIBLE);
rightTv.setText(right);
}
}
public void showDialog() {
if (!isShowing()) {
show();
}
}
public SelectDialogListener listener;
public ReportePopupDialog setListener(SelectDialogListener listener) {
this.listener = listener;
return this;
}
}
SelectDialogListener
/** * @author J.query * @date 2017/5/26 * @email [email protected] */ public interface SelectDialogListener { void leftClick(); void rightClick(); }
R.layout.layout_popup_dialog_select.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:clickable="true"
android:drawableRight="@drawable/close"
android:id="@+id/tv_close"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_20"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:gravity="center"
android:padding="14dp"
android:textColor="@color/c_55"
android:textSize="16dp" />
<TextView
android:visibility="gone"
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:gravity="center"
android:padding="14dp"
android:text="Do you really want to quit?"
android:textColor="@color/c_55"
android:textSize="16dp" />
<View style="@style/horizontal_line" />
<LinearLayout
android:background="@drawable/circle_pop_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_left"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/dialog_btn_select_left"
android:clickable="true"
android:gravity="center"
android:padding="10dp"
android:text="@string/sure"
android:textColor="@color/c_ff"
android:textSize="14dp" />
<View
android:id="@+id/line"
style="@style/vertical_line" />
<TextView
android:id="@+id/tv_right"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/dialog_btn_select_right"
android:clickable="true"
android:gravity="center"
android:padding="10dp"
android:text="@string/cancel"
android:textColor="@color/c_ff"
android:textSize="14dp" />
</LinearLayout>
</LinearLayout>
//@style/horizontal_line
<style name="horizontal_line">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">1px</item>
<item name="android:background">@color/c_e5</item>
</style>
circle_pop_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#404040"/>
<corners android:radius="4dp"/>
</shape>
dialog_btn_select_right.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="150" android:exitFadeDuration="150">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/color_title" />
<corners android:bottomLeftRadius="10dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="@color/color_purple" />
<corners android:bottomLeftRadius="10dp" />
</shape>
</item>
</selector>
dialog_btn_select_left.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="150" android:exitFadeDuration="150">
<item android:state_pressed="true">
<shape android:shape="rectangle">
<solid android:color="@color/color_title" />
<corners android:bottomRightRadius="10dp" />
</shape>
</item>
<item>
<shape android:shape="rectangle">
<solid android:color="@color/color_purple" />
<corners android:bottomRightRadius="10dp" />
</shape>
</item>
</selector>
actionsheet_bottom_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape>
<solid android:color="@color/color_title" />
<corners android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp" />
</shape>
</item>
<item>
<shape>
<solid android:color="@color/color_purple" />
<corners android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp" />
</shape>
</item>
</selector>
//动画效果 R.style.TopPopAnim
<style name="TopPopAnim" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/top_in</item>
<item name="android:windowExitAnimation">@anim/top_out</item>
</style>
<style name="BottomPopAnim" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/bottom_in</item>
<item name="android:windowExitAnimation">@anim/bottom_out</item>
</style>
top_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="100%"
android:fromYScale="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="0"
android:toXScale="0"
android:toYScale="0"
/>
<alpha
android:duration="@android:integer/config_shortAnimTime"
android:fromAlpha="1"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0"
/>
</set>
top_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="0"
android:fromYScale="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="0"
android:toXScale="100%"
android:toYScale="100%"
/>
<alpha
android:duration="@android:integer/config_shortAnimTime"
android:fromAlpha="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1"
/>
</set>
bottom_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="0"
android:fromYScale="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="100%"
android:toXScale="100%"
android:toYScale="100%"
/>
<alpha
android:duration="@android:integer/config_shortAnimTime"
android:fromAlpha="0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1"
/>
</set>
bottom_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="@android:integer/config_shortAnimTime"
android:fromXScale="100%"
android:fromYScale="100%"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="100%"
android:toXScale="0"
android:toYScale="0"
/>
<alpha
android:duration="@android:integer/config_shortAnimTime"
android:fromAlpha="1"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="0"
/>
</set>
在Activity使用方法:
/**
* 考勤选择提示框
*/
protected void reportedSelectDialog(String title, String left, String right) {
if (mReportePopupDialog == null) {
mReportePopupDialog = new ReportePopupDialog(this, true);
mReportePopupDialog.setListener(new SelectDialogListener() {
@Override
public void leftClick() {
startActivity(PictureSelectorMainActivity.class);
}
@Override
public void rightClick() {
startActivity(ReportedActivity.class);
}
});
mReportePopupDialog.setCanceledOnTouchOutside(false);
mReportePopupDialog.setCancelable(false);
mReportePopupDialog.setTitle(title);
mReportePopupDialog.setLeftAndRightText(left, right);
}
mReportePopupDialog.showDialog();
}
整体就这些,看起来有点多,但是实现还是很简单的。如有不妥,不吝赐教。谢谢