Android開發--仿QQ支付界面

? 這是我第一次在簡書上寫的第一篇文章,其實我關注簡書有一兩個月吧!平時我就在這里看看別人的文章,很有沖動自己也能像別人一樣滔滔不絕的寫作,可是我有自知自明根本不能達到那個高度。哈哈!而這一篇也是我今天在簡書寫的第一篇,因此我也喜歡我能寫更多的不管是技術方面還是其他方面。下面這些內容如果有任何問題歡迎提出,由于工作時間不是很長如有問題還望大神指正,進而改之。

廢話不多說先看要實現的效果圖:


設計效果圖

所先聲明:支付寶QQ微信等平臺是直接輸入完自動進行下一步操作,而我這個是在鍵盤右下角確定按鈕進行下一步操作,而現在實現的只有輸入密碼功能,并沒有實現刷卡操作。

看設計圖思路: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.看到這個界面一般會想dialog實現,而且是全屏的。而一般dialog不是全部的需要設置(后面會提到)

2.自定義鍵盤,點擊鍵盤中的數字對應上部分輸入框中顯示密碼,刪除進行輸入框刪除,確定進行數據提交,而上部分輸入框右上角( X )可以取消dialog。點擊其他透明地方不進行任何操作。

代碼實現:

我就把核心代碼貼出來了,主要是我想把代碼全部貼出來可是我貼來排版好丑,完全變形了我自己都看不下去了我只能貼最要部分,其中輸入框密碼是一個自定義PasswordView.java,鍵盤Keyboard.java這兩個文件我就沒貼出來了,這部分我都難以接受~~~就將就看一下吧!等我哪天抽時間整理寫一個demo.

public classNewTableDialogManager {

public interface Listener {

public void confirm(String insertText);

}

//最大位數

private static final intMAX_INSERT_COUNT=6;

private static final intINVALID_VALUE= -1;

private ContextmContext;

private DialogmDialog;

Listener mListener;

Keyboard mNumberPad;

privatePasswordView[] mPasswordViews = new PasswordView[MAX_INSERT_COUNT];

private int mInsertCount=0;

private int[] mInsertKey = new int[MAX_INSERT_COUNT];

String mResultText="";

public NewTableDialogManager(Context context, Listener listener) {

this.mContext= context;

this.mListener= listener;

initView();

}

private void initView() {

//dialog初始化

mDialog = new Dialog(mContext, R.style.FullDialog);

mDialog.setCancelable(false);

mDialog.setCanceledOnTouchOutside(false);

//這里設置dialog為全屏

Window win = mDialog.getWindow();

win.getDecorView().setPadding(0,0,0,0);

WindowManager.LayoutParams lp = win.getAttributes();

lp.width= WindowManager.LayoutParams.MATCH_PARENT;

lp.height= WindowManager.LayoutParams.MATCH_PARENT;

win.setAttributes(lp);

mDialog.setContentView(R.layout.new_dialog_manager);

//綁定鍵盤

View numberView =mDialog.findViewById(R.id.keyboardView);

mNumberPad=newKeyboard(numberView, Keyboard.NumberPadType_hideKey);

mNumberPad.setKeyListener(mNumberPadListener);

//屏蔽左下角和右下角按鈕

RelativeLayout leftLayout = (RelativeLayout)mDialog.findViewById(R.id.leftLayout);

leftLayout.setClickable(false);

ImageView leftImageView = (ImageView)mDialog.findViewById(R.id.leftImageView);

leftImageView.setVisibility(View.INVISIBLE);

RelativeLayout pointViewPad = (RelativeLayout)mDialog.findViewById(R.id.pointViewPad);

pointViewPad.setClickable(false);

PointView pointView = (PointView)mDialog.findViewById(R.id.pointView);

pointView.setVisibility(View.INVISIBLE);

//密碼框

PasswordView passwordView1 = (PasswordView)mDialog.findViewById(R.id.passwordView1);

PasswordView passwordView2 = (PasswordView)mDialog.findViewById(R.id.passwordView2);

PasswordView passwordView3 = (PasswordView)mDialog.findViewById(R.id.passwordView3);

PasswordView passwordView4 = (PasswordView)mDialog.findViewById(R.id.passwordView4);

PasswordView passwordView5 = (PasswordView)mDialog.findViewById(R.id.passwordView5);

PasswordView passwordView6 = (PasswordView)mDialog.findViewById(R.id.passwordView6);

mPasswordViews[0] = passwordView1;

mPasswordViews[1] = passwordView2;

mPasswordViews[2] = passwordView3;

mPasswordViews[3] = passwordView4;

mPasswordViews[4] = passwordView5;

mPasswordViews[5] = passwordView6;

//關閉

ImageView mCloseImageView = (ImageView)mDialog.findViewById(R.id.closeImageView);

mCloseImageView.setOnClickListener(mCloseListener);

}

privateView.OnClickListener mCloseListener = new View.OnClickListener() {

@Override

public void onClick(View v) {

//? ? ? ? ? ? clearInsert();

mDialog.dismiss();

}

};

privateKeyboard.KeyboardListener mNumberPadListener = newKeyboard.KeyboardListener() {

@Override

public void numberClicked(intnumber) {

if(mInsertCount> = MAX_INSERT_COUNT) {

return;

}

PasswordView passwordView = mPasswordViews[mInsertCount];

passwordView.setChecked(true);

mInsertKey[mInsertCount] = number;

mInsertCount++;

//提交驗證

if(mInsertCount == MAX_INSERT_COUNT) {

String inserTextView ="";

for(inti =0; i

inserTextView += mInsertKey[i];

}

mResultText = inserTextView;

}

}

@Override

public void leftClicked() {

}

@Override

public void pointClicked() {

}

@Override

public void topClicked() {

//刪除

if( mInsertCount == 0 ) {

return;

}

mInsertCount--;

mPasswordViews[mInsertCount].setChecked(false);

mInsertKey[mInsertCount] = INVALID_VALUE;

//

String insertText = mResultText;

if(TextUtils.isEmpty(insertText)) {

return;

}

intcount = insertText.length();

insertText = insertText.substring(0, count -1);

mResultText= insertText;

}

@Override

public void buttonClicked() {

//確定

checkDatas(mResultText);

}

@Override

public void emptyClicked() {

}

};

/**

* 提交服務器驗證

*

* @paraminsertText

*/

private voidcheckDatas(String insertText) {

if(TextUtils.isEmpty(insertText)) {

Toast.makeText(mContext,"請輸入6位數字", Toast.LENGTH_SHORT).show();

}

Log.e("insertText", insertText);

//TODO 請求接口

mListener.confirm(insertText);

//請求完成之后清空數據

clearInsert();

}

//關閉時調用

private voidclearInsert() {

mInsertCount = 0;

for(inti =0; i

mInsertKey[i] = INVALID_VALUE;

mPasswordViews[i].setChecked(false);

}

mResultText="";

}

public voidshow() {

if(mDialog.isShowing()) {

return;

}

mDialog.show();

}

public voidhide() {

mDialog.hide();

}

public voiddismiss() {

mDialog.dismiss();

}

}

布局文件效果圖:

代碼不就不貼出來了,真心想死,還不是屬性這個寫作的布局方式。

寫出的效果圖


真心不敢貼代碼了。。我怕被打si。。。排版丑的無法直視。算了。。不敢再說多了,就這樣吧!就這樣吧!

---END------

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容