实现Popup的效果的Dialog(Activity不变暗)

大家都知道,我们弹框实现可以由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();
}

整体就这些,看起来有点多,但是实现还是很简单的。如有不妥,不吝赐教。谢谢

猜你喜欢

转载自blog.csdn.net/github_36787585/article/details/82385538