android--仿苹果数字解锁功能
跟着我一起按步骤来做,保证你一学就会。
步骤如下:
一、先自定义一个键盘布局文件:
在项目res/xml目录下新建一个xml文件,比如number_only.xml
<?xml version="1.0" encoding="utf-8"?> <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:horizontalGap="0px" android:keyHeight="13%p" android:keyWidth="33%p" android:verticalGap="0px" > <Row> <Key android:codes="49" android:keyLabel="1" /> <Key android:codes="50" android:keyLabel="2" /> <Key android:codes="51" android:keyLabel="3" /> </Row> <Row> <Key android:codes="52" android:keyLabel="4" /> <Key android:codes="53" android:keyLabel="5" /> <Key android:codes="54" android:keyLabel="6" /> </Row> <Row> <Key android:codes="55" android:keyLabel="7" /> <Key android:codes="56" android:keyLabel="8" /> <Key android:codes="57" android:keyLabel="9" /> </Row> <Row> <Key android:codes="-2" android:keyLabel="" /> <Key android:codes="48" android:keyLabel="0" /> <Key android:codes="-5" android:keyIcon="@drawable/keyboard_delete" /> </Row> </Keyboard>
二、编写一个键盘事件处理的工具类,如KeyboardUtil.java
import java.util.ArrayList; import android.app.Activity; import android.inputmethodservice.Keyboard; import android.inputmethodservice.KeyboardView; import android.inputmethodservice.KeyboardView.OnKeyboardActionListener; import android.view.View; import android.widget.EditText; public class KeyboardUtil { private Activity myActivity; private KeyboardView keyboardView; private Keyboard kb_num_only; private ArrayList<EditText> listEd; private String thisPwdText = ""; public KeyboardUtil(Activity activity) { this.myActivity = activity; kb_num_only = new Keyboard(activity, R.xml.number_only); keyboardView = (KeyboardView) myActivity .findViewById(R.id.keyboard_view); keyboardView.setKeyboard(kb_num_only); keyboardView.setEnabled(true); keyboardView.setPreviewEnabled(true); keyboardView.setOnKeyboardActionListener(listener); } private OnKeyboardActionListener listener = new OnKeyboardActionListener() { @Override public void swipeUp() { } @Override public void swipeRight() { } @Override public void swipeLeft() { } @Override public void swipeDown() { } @Override public void onText(CharSequence text) { } @Override public void onRelease(int primaryCode) { } @Override public void onPress(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes) { if (primaryCode == -2) { return; } else if (primaryCode == Keyboard.KEYCODE_DELETE) {// 回退 // 删除按钮所做的动作 if (thisPwdText != null && thisPwdText.length() >= 1) { thisPwdText = thisPwdText.substring(0, thisPwdText.length() - 1); System.out.println("thisPwdText=" + thisPwdText); int len = thisPwdText.length(); if (len <= 3) { listEd.get(len).setText(""); } } } else { thisPwdText = thisPwdText + (char) primaryCode; System.out.println("thisPwdText=" + thisPwdText); int len = thisPwdText.length(); if (len <= 4) { listEd.get(len - 1).setText("*"); if (len == 4) { // 返回值,并清理本次记录,自动进入下次 listEd.get(4).setText(thisPwdText); thisPwdText = ""; } } } } }; /** * 包括四个密码输入框和一个密码保存框(按此顺序即可) * * @param etList */ public void setListEditText(ArrayList<EditText> etList) { this.listEd = etList; } // 显示键盘 public void showKeyboard() { int visibility = keyboardView.getVisibility(); if (visibility == View.GONE || visibility == View.INVISIBLE) { keyboardView.setVisibility(View.VISIBLE); } } // 隐藏键盘 public void hideKeyboard() { int visibility = keyboardView.getVisibility(); if (visibility == View.VISIBLE) { keyboardView.setVisibility(View.INVISIBLE); } } }
三、新建一个activity窗口类:如SetLockPwdActivity.java
import java.util.ArrayList; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; import android.widget.EditText; public class SetLockPwdActivity extends Activity { private View backView; private EditText etPwdOne, etPwdTwo, etPwdThree, etPwdFour, etPwdText; private KeyboardUtil kbUtil; public String strLockPwdOne; public String strLockPwdTwo; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_set_lock_pwd); findView(); setListener(); initData(); } void findView() { etPwdOne = (EditText) findViewById(R.id.etPwdOne_setLockPwd); etPwdTwo = (EditText) findViewById(R.id.etPwdTwo_setLockPwd); etPwdThree = (EditText) findViewById(R.id.etPwdThree_setLockPwd); etPwdFour = (EditText) findViewById(R.id.etPwdFour_setLockPwd); etPwdText = (EditText) findViewById(R.id.etPwdText_setLockPwd); } void setListener() { etPwdText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) { if (etPwdFour.getText() != null && etPwdFour.getText().toString().length() >= 1) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } finally { Message msg = mHandler.obtainMessage(); msg.what = R.id.doSuccess; mHandler.sendMessage(msg); } } }).start(); } } }); } void initData() { kbUtil = new KeyboardUtil(SetLockPwdActivity.this); ArrayList<EditText> list = new ArrayList<EditText>(); list.add(etPwdOne); list.add(etPwdTwo); list.add(etPwdThree); list.add(etPwdFour); list.add(etPwdText); kbUtil.setListEditText(list); etPwdOne.setInputType(InputType.TYPE_NULL); etPwdTwo.setInputType(InputType.TYPE_NULL); etPwdThree.setInputType(InputType.TYPE_NULL); etPwdFour.setInputType(InputType.TYPE_NULL); MyHandle(); } void backToActivity() { Intent mIntent = new Intent(SetLockPwdActivity.this, MainActivity.class); startActivity(mIntent); } public void MyHandle() { mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case R.id.doSuccess: if (etPwdFour.getText() != null && etPwdFour.getText().toString().length() >= 1) { if (strLockPwdOne != null && strLockPwdOne.length() == 4) { String strReapt = etPwdText.getText().toString(); if (strReapt.equals(strLockPwdOne)) { Validate.Toast(SetLockPwdActivity.this, "解锁密码设置成功"); strLockPwdOne = null; } else { Validate.Toast(SetLockPwdActivity.this, "解锁密码设置失败"); } } else { strLockPwdOne = etPwdText.getText().toString(); } etPwdOne.setText(""); etPwdTwo.setText(""); etPwdThree.setText(""); etPwdFour.setText(""); } break; default: break; } } }; } }
此activity对应的layout文件:
<?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:background="@color/black" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="55dp" android:orientation="horizontal" > <EditText android:id="@+id/etPwdOne_setLockPwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/white" android:cursorVisible="false" android:ems="1" android:gravity="center" android:lines="1" android:textSize="31sp" > </EditText> <EditText android:id="@+id/etPwdTwo_setLockPwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:background="@color/white" android:cursorVisible="false" android:ems="1" android:gravity="center" android:textSize="31sp" /> <EditText android:id="@+id/etPwdThree_setLockPwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:background="@color/white" android:cursorVisible="false" android:ems="1" android:gravity="center" android:textSize="31sp" /> <EditText android:id="@+id/etPwdFour_setLockPwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:background="@color/white" android:cursorVisible="false" android:ems="1" android:gravity="center" android:textSize="31sp" /> <EditText android:id="@+id/etPwdText_setLockPwd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" > <android.inputmethodservice.KeyboardView android:id="@+id/keyboard_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@color/lightblack" android:focusable="true" android:focusableInTouchMode="true" android:keyBackground="@drawable/keyboard_key" android:keyTextColor="@color/white" /> </LinearLayout> </LinearLayout>
四、最后一步,别忘了在AndroidManifest.xml配置文件中声明上面的activity类。
效果如下:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。