1. 程式人生 > >androdi簡單的密碼輸入對話方塊(Dialog)

androdi簡單的密碼輸入對話方塊(Dialog)

加入:

compile 'com.flyco.dialog:FlycoDialog_Lib:[email protected]'
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();

相關推薦

androdi簡單密碼輸入對話方塊Dialog

加入: compile 'com.flyco.dialog:FlycoDialog_Lib:[email protected]' Dialog程式碼: package com.influx.kalyke.component; /** * Created

四種對話方塊dialog簡單使用方法

有普通對話方塊,單選對話方塊,複選對話方塊,進度條的兩種實現方法話不多說,直接上程式碼 activity_main.xml:   1 <?xml version="1.0" encoding="utf-8"?> 2 <android.support.constra

html5+css實現六位數字密碼輸入對話方塊類似支付寶,微信

先來看看原型圖:直接上程式碼:html<div class="common-part pay-part"> <div class="common-dialog pay-dialog"> <div class

win7訪問xp的共享,彈出重輸入密碼對話方塊NTLM

最近在研究 NTLM 的東東,無意發現一博文,實乃 NTLM 應用之例項, 故轉之,再次感謝原創者! --------------------------------------------------------------------------------------

GUI之練習——列出指定目錄下的內容和對話方塊Dialog

package myclass; import java.awt.; import java.awt.event.; import java.io.*; class MyWindowDemo { private Frame f; private TextFiel

jquery 對話方塊Dialog外掛

<!doctype html> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <

android 8種對話方塊Dialog使用方法彙總

目錄 1.寫在前面2.程式碼示例 2.1 普通Dialog(圖1與圖2) 2.2 列表Dialog(圖3) 2.3 單選Dialog(圖4) 2.4 多選Dialog(圖5) 2.5 等待Dialog(圖6) 2.6 進度條Dialog(圖7) 2.7 編輯Dialog(圖8) 2.8 自定義Dialo

android 實現點選輸入框彈出日期選擇對話方塊DatePickerDialog

前言 這裡我們實現一個功能,點選日期輸入框(EditText),即可彈出日期選擇對話方塊(DatePickerDialog),等使用者選擇日期後,將使用者選擇的日期顯示在日期輸入框。 1.activity_main.xml 這裡只有一個TextView和EditText。

Android中的對話方塊AlertDialog

建立android中分體式對話方塊需要四個步驟: 第一:獲得AlertDialog的靜態內部類Builder物件,有該類建立對話方塊。 第二:通過Builder物件設定對話方塊的標題,按鈕UI及將要響應的事件。、 第三:呼叫Builder的Create()方法建立對對話方塊 第四

android模式進度對話方塊ProgressDialog的呼叫方法

public class MainActivity extends AppCompatActivity {     @BindView(R.id.button2)     Button button2;     @BindView(R.id.button1)     TextView

PyQt5 筆記6 -- 對話方塊QDialog

PyQt5 筆記6 – 對話方塊(QDialog) 1、主視窗彈出對話方塊 import sys from PyQt5.QtWidgets import QApplication, QMainWin

Java-記事本程式、檔案選擇對話方塊JFileChooser

基本的GUI基礎和IO基礎 核心程式碼 JFileChooser jfc = new JFileChooser(); jfc.setDialogTitle("另存為..."); // jfc.showOpenDialog(null); // 顯示開啟檔案

MFC 對話方塊視窗透明

程式的實現步驟基本就是這樣,當然也有其他方法。希望大家能積極開拓,展示更多方法。 SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHw

對話方塊CDialog中使用分割窗CSplitterWnd

原文見:   可以使用以下三個步驟在對話方塊中建立分割窗: 1. In the OnCreate function or your CDialog, register a new WindowClass by calling "AfxRegisterWndClass".

VC++對話方塊CDialog新增背景圖片

在對話方塊(CDialog)程式中,為了讓程式看上去漂亮一些,我們可以為對話方塊新增一個好看的背景圖片,要想完成這個目標,可以利用afx_msg BOOLOnEraseBkgnd (CDC* pDC) 這個函式。 (1)找來一張合適的BMP格式的背景圖片,將其放在工程的r

VC++對話方塊CDialog的全屏顯示及控制元件居中顯示

在編寫一些軟體時,我們會比較偏向於比較簡潔、清新的使用者介面,同時為了避免其它程式或者桌面等影響使用者的注意力等,我們通常習慣將軟體介面全屏,佈滿整個顯示螢幕,與此同時,我們也將對介面中的控制元件位置進行相應的調整,讓它們按螢幕的大小和其在對話方塊中的相對位置,居中顯示。

QT學習 之 對話方塊 字型對話方塊、訊息對話方塊、檔案對話方塊、程序對話方塊

QMessageBox類: 含有Question訊息框、Information訊息框、Warning訊息框和Critical訊息框等 通常有兩種方式可以來建立標準訊息對話方塊: 一種是採用“基於屬性”的API,一種是使用QMessageBox的靜態方法。 後者書寫容易,但缺

QT學習 之 對話方塊 可擴充套件對話方塊

QT中的對話方塊是QDialog類 下面是三個主要的視窗的區別: QWidget類是所有使用者介面物件的基類。 視窗部件是使用者介面的一個基本單元:它從視窗系統接收滑鼠、鍵盤和其它事件,並且在螢幕上繪製自己。每一個視窗部件都是矩形的,並且它們按Z軸順序排列。一個視窗部件可以

標準對話方塊QMessageBox

    所謂標準對話方塊,是 Qt 內建的一系列對話方塊,用於簡化開發。事實上,有很多對話方塊都是通用的,比如開啟檔案、設定顏色、列印設定等。這些對話方塊在所有程式中幾乎相同,因此沒有必要在每一個程式

MUI-dialog對話方塊,警告框、確認框、輸入對話方塊、訊息提示框

本文主要講述dialog(對話方塊),包括:警告框、確認框、輸入對話方塊、訊息提示框四類。 元件名 作用 alert 警告框 confirm 確認框