androdi简单的密码输入对话框(Dialog)

来源:互联网 发布:算法是一个什么的集合 编辑:程序博客网 时间:2024/05/21 14:53

加入:

compile 'com.flyco.dialog:FlycoDialog_Lib:1.3.2@aar'
Dialog代码:

package com.influx.kalyke.component;/** * Created by lj on 2017/9/6. */import android.content.Context;import android.graphics.Color;import android.view.Gravity;import android.view.View;import android.widget.LinearLayout;import com.flyco.dialog.utils.CornerUtils;import com.flyco.dialog.widget.internal.BaseAlertDialog;import android.content.Context;import android.graphics.Color;import android.view.Gravity;import android.view.View;import android.widget.LinearLayout;import com.flyco.dialog.utils.CornerUtils;import com.flyco.dialog.widget.internal.BaseAlertDialog;@SuppressWarnings("deprecation")public class PassWordDialog extends BaseAlertDialog<PassWordDialog> {    /** title underline */    private View mVLineTitle;    /** vertical line between btns */    private View mVLineVertical;    /** vertical line between btns */    private View mVLineVertical2;    /** horizontal line above btns */    private View mVLineHorizontal;    /** title underline color(标题下划线颜色) */    private int mTitleLineColor = Color.parseColor("#61AEDC");    /** title underline height(标题下划线高度) */    private float mTitleLineHeight = 1f;    /** btn divider line color(对话框之间的分割线颜色(水平+垂直)) */    private int mDividerColor = Color.parseColor("#DCDCDC");    public static final int STYLE_ONE = 0;    public static final int STYLE_TWO = 1;    private int mStyle = STYLE_ONE;    private PasswordInputView passwordInputView;    public PassWordDialog(Context context) {        super(context);        /** default value*/        mTitleTextColor = Color.parseColor("#61AEDC");        mTitleTextSize = 22f;        mContentTextColor = Color.parseColor("#383838");        mContentTextSize = 17f;        mLeftBtnTextColor = Color.parseColor("#8a000000");        mRightBtnTextColor = Color.parseColor("#8a000000");        mMiddleBtnTextColor = Color.parseColor("#8a000000");        /** default value*/        passwordInputView=new PasswordInputView(context,null);    }    private String getContentText(){        return passwordInputView.getText()==null?"":passwordInputView.getText().toString();    }    @Override    public View onCreateView() {        /** title */        mTvTitle.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,                LinearLayout.LayoutParams.WRAP_CONTENT));        mLlContainer.addView(mTvTitle);        /** title underline */        mVLineTitle = new View(mContext);        mLlContainer.addView(mVLineTitle);        /** content *///        mTvContent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,//                LinearLayout.LayoutParams.WRAP_CONTENT));        LinearLayout.LayoutParams la=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,                LinearLayout.LayoutParams.WRAP_CONTENT);        la.setMargins(5,10,5,10);        passwordInputView.setLayoutParams(la);        mLlContainer.addView(passwordInputView);        mVLineHorizontal = new View(mContext);        mVLineHorizontal.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 1));        mLlContainer.addView(mVLineHorizontal);        /** btns */        mTvBtnLeft.setLayoutParams(new LinearLayout.LayoutParams(0, dp2px(45), 1));        mLlBtns.addView(mTvBtnLeft);        mVLineVertical = new View(mContext);        mVLineVertical.setLayoutParams(new LinearLayout.LayoutParams(1, LinearLayout.LayoutParams.MATCH_PARENT));        mLlBtns.addView(mVLineVertical);        mTvBtnMiddle.setLayoutParams(new LinearLayout.LayoutParams(0, dp2px(45), 1));        mLlBtns.addView(mTvBtnMiddle);        mVLineVertical2 = new View(mContext);        mVLineVertical2.setLayoutParams(new LinearLayout.LayoutParams(1, LinearLayout.LayoutParams.MATCH_PARENT));        mLlBtns.addView(mVLineVertical2);        mTvBtnRight.setLayoutParams(new LinearLayout.LayoutParams(0, dp2px(45), 1));        mLlBtns.addView(mTvBtnRight);        mLlContainer.addView(mLlBtns);        return mLlContainer;    }    @Override    public void setUiBeforShow() {        super.setUiBeforShow();        /** title */        if (mStyle == STYLE_ONE) {            mTvTitle.setMinHeight(dp2px(48));            mTvTitle.setGravity(Gravity.CENTER_VERTICAL);            mTvTitle.setPadding(dp2px(15), dp2px(5), dp2px(0), dp2px(5));            mTvTitle.setVisibility(mIsTitleShow ? View.VISIBLE : View.GONE);        } else if (mStyle == STYLE_TWO) {            mTvTitle.setGravity(Gravity.CENTER);            mTvTitle.setPadding(dp2px(0), dp2px(15), dp2px(0), dp2px(0));        }        /** title underline */        mVLineTitle.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,                dp2px(mTitleLineHeight)));        mVLineTitle.setBackgroundColor(mTitleLineColor);        mVLineTitle.setVisibility(mIsTitleShow && mStyle == STYLE_ONE ? View.VISIBLE : View.GONE);        /** content */        if (mStyle == STYLE_ONE) {            mTvContent.setPadding(dp2px(15), dp2px(10), dp2px(15), dp2px(10));            mTvContent.setMinHeight(dp2px(68));            mTvContent.setGravity(mContentGravity);        } else if (mStyle == STYLE_TWO) {            mTvContent.setPadding(dp2px(15), dp2px(7), dp2px(15), dp2px(20));            mTvContent.setMinHeight(dp2px(56));            mTvContent.setGravity(Gravity.CENTER);        }        /** btns */        mVLineHorizontal.setBackgroundColor(mDividerColor);        mVLineVertical.setBackgroundColor(mDividerColor);        mVLineVertical2.setBackgroundColor(mDividerColor);        if (mBtnNum == 1) {            mTvBtnLeft.setVisibility(View.GONE);            mTvBtnRight.setVisibility(View.GONE);            mVLineVertical.setVisibility(View.GONE);            mVLineVertical2.setVisibility(View.GONE);        } else if (mBtnNum == 2) {            mTvBtnMiddle.setVisibility(View.GONE);            mVLineVertical.setVisibility(View.GONE);        }        /**set background color and corner radius */        float radius = dp2px(mCornerRadius);        mLlContainer.setBackgroundDrawable(CornerUtils.cornerDrawable(mBgColor, radius));        mTvBtnLeft.setBackgroundDrawable(CornerUtils.btnSelector(radius, mBgColor, mBtnPressColor, 0));        mTvBtnRight.setBackgroundDrawable(CornerUtils.btnSelector(radius, mBgColor, mBtnPressColor, 1));        mTvBtnMiddle.setBackgroundDrawable(CornerUtils.btnSelector(mBtnNum == 1 ? radius : 0, mBgColor, mBtnPressColor, -1));    }    // --->属性设置    /** set style(设置style) */    public PassWordDialog style(int style) {        this.mStyle = style;        return this;    }    /** set title underline color(设置标题下划线颜色) */    public PassWordDialog titleLineColor(int titleLineColor) {        this.mTitleLineColor = titleLineColor;        return this;    }    /** set title underline height(设置标题下划线高度) */    public PassWordDialog titleLineHeight(float titleLineHeight_DP) {        this.mTitleLineHeight = titleLineHeight_DP;        return this;    }    /** set divider color between btns(设置btn分割线的颜色) */    public PassWordDialog dividerColor(int dividerColor) {        this.mDividerColor = dividerColor;        return this;    }}
输入框:

package com.influx.kalyke.component;/** * Created by lj on 2017/9/1. */import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.text.InputFilter;import android.text.InputType;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.TypedValue;import android.widget.EditText;import com.influx.kalyke.R;import static android.graphics.Paint.ANTI_ALIAS_FLAG;/** * Desc: * User: tiansj */public class PasswordInputView extends EditText {    private static final int defaultContMargin = 5;    private static final int defaultSplitLineWidth = 3;    private int borderColor = 0xFFCCCCCC;    private float borderWidth = 5;    private float borderRadius = 3;    private int passwordLength = 4;    private int passwordColor = 0xFF000000;    private float passwordWidth = 8;    private float passwordRadius = 3;    private Paint passwordPaint = new Paint(ANTI_ALIAS_FLAG);    private Paint borderPaint = new Paint(ANTI_ALIAS_FLAG);    private int textLength;    public PasswordInputView(Context context, AttributeSet attrs) {        super(context, attrs);        DisplayMetrics dm = getResources().getDisplayMetrics();        borderWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, borderWidth, dm);        borderRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, borderRadius, dm);        passwordLength = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, passwordLength, dm);        passwordWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, passwordWidth, dm);        passwordRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, passwordRadius, dm);        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordInputView, 0, 0);        borderColor = a.getColor(R.styleable.PasswordInputView_pivBorderColor, borderColor);        borderWidth = a.getDimension(R.styleable.PasswordInputView_pivBorderWidth, borderWidth);        borderRadius = a.getDimension(R.styleable.PasswordInputView_pivBorderRadius, borderRadius);        passwordLength = a.getInt(R.styleable.PasswordInputView_pivPasswordLength, passwordLength);        passwordColor = a.getColor(R.styleable.PasswordInputView_pivPasswordColor, passwordColor);        passwordWidth = a.getDimension(R.styleable.PasswordInputView_pivPasswordWidth, passwordWidth);        passwordRadius = a.getDimension(R.styleable.PasswordInputView_pivPasswordRadius, passwordRadius);        a.recycle();        borderPaint.setStrokeWidth(borderWidth);        borderPaint.setColor(borderColor);        passwordPaint.setStrokeWidth(passwordWidth);        passwordPaint.setStyle(Paint.Style.FILL);        passwordPaint.setColor(passwordColor);        this.setInputType(InputType.TYPE_CLASS_NUMBER);        this.setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)});    }    @Override    protected void onDraw(Canvas canvas) {        int width = getWidth();        int height = getHeight();        // 外边框        RectF rect = new RectF(0, 0, width, height);        borderPaint.setColor(borderColor);        canvas.drawRoundRect(rect, borderRadius, borderRadius, borderPaint);        // 内容区        RectF rectIn = new RectF(rect.left + defaultContMargin, rect.top + defaultContMargin,                rect.right - defaultContMargin, rect.bottom - defaultContMargin);        borderPaint.setColor(Color.WHITE);        canvas.drawRoundRect(rectIn, borderRadius, borderRadius, borderPaint);        // 分割线        borderPaint.setColor(borderColor);        borderPaint.setStrokeWidth(defaultSplitLineWidth);        for (int i = 1; i < passwordLength; i++) {            float x = width * i / passwordLength;            canvas.drawLine(x, 0, x, height, borderPaint);        }        // 密码        float cx, cy = height/ 2;        float half = width / passwordLength / 2;        for(int i = 0; i < textLength; i++) {            cx = width * i / passwordLength + half;            canvas.drawCircle(cx, cy, passwordWidth, passwordPaint);        }    }    @Override    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {        super.onTextChanged(text, start, lengthBefore, lengthAfter);        this.textLength = text.toString().length();        invalidate();    }    public int getBorderColor() {        return borderColor;    }    public void setBorderColor(int borderColor) {        this.borderColor = borderColor;        borderPaint.setColor(borderColor);        invalidate();    }    public float getBorderWidth() {        return borderWidth;    }    public void setBorderWidth(float borderWidth) {        this.borderWidth = borderWidth;        borderPaint.setStrokeWidth(borderWidth);        invalidate();    }    public float getBorderRadius() {        return borderRadius;    }    public void setBorderRadius(float borderRadius) {        this.borderRadius = borderRadius;        invalidate();    }    public int getPasswordLength() {        return passwordLength;    }    public void setPasswordLength(int passwordLength) {        this.passwordLength = passwordLength;        invalidate();    }    public int getPasswordColor() {        return passwordColor;    }    public void setPasswordColor(int passwordColor) {        this.passwordColor = passwordColor;        passwordPaint.setColor(passwordColor);        invalidate();    }    public float getPasswordWidth() {        return passwordWidth;    }    public void setPasswordWidth(float passwordWidth) {        this.passwordWidth = passwordWidth;        passwordPaint.setStrokeWidth(passwordWidth);        invalidate();    }    public float getPasswordRadius() {        return passwordRadius;    }    public void setPasswordRadius(float passwordRadius) {        this.passwordRadius = passwordRadius;        invalidate();    }}
用法,和NormalDialog用法一致:

final PassWordDialog p = new PassWordDialog(mainActivityActivity);p.title("请输入验证码")        .btnText("取消", "确定")//        .btnTextColor(Color.GRAY, Color.GREEN)        .style(NormalDialog.STYLE_TWO)//        .titleTextSize(23)//        .widthScale(0.4f)        .showAnim(new BounceTopEnter())//        .dismissAnim(new SlideBottomExit())//        .show();