自定义密码框 让你实现一格一格输密码

1.功能介绍及效果图

做密码框的时候考虑了两个方案,一个方案是用6个EditText,另一个方案则是在EditText上画5条线。因为我基本没接触过draw部分的代码,对语法都不了解,所以果断选择了第一种。接下来考虑密码框需要实现的功能和用户体验的问题。

功能1:输入密码删除密码流畅

功能2:用户点击任意密码框焦点在正确的位置

功能3:输入的密码直接显示为圆点

2.源码

[java]  view plain  copy
  1. package com.example.passwordview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.text.Editable;  
  11. import android.text.TextUtils;  
  12. import android.text.TextWatcher;  
  13. import android.util.Log;  
  14. import android.view.KeyEvent;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.view.View.OnKeyListener;  
  18. import android.view.inputmethod.InputMethodManager;  
  19. import android.widget.Button;  
  20. import android.widget.EditText;  
  21. import android.widget.LinearLayout;  
  22. import android.widget.Toast;  
  23.   
  24. public class MainActivity extends Activity implements TextWatcher{  
  25.   
  26.     private EditText et_pwd1;  
  27.     private EditText et_pwd2;  
  28.     private EditText et_pwd3;  
  29.     private EditText et_pwd4;  
  30.     private EditText et_pwd5;  
  31.     private EditText et_pwd6;  
  32.     private List<EditText> et_group;  
  33.     private OnKeyListener onKeyListener;  
  34.     public int cursorPosition=0;  
  35.     private InputMethodManager imm;  
  36.     public Context context;  
  37.     private String[] password=new String[6];  
  38.     @Override  
  39.     protected void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.httfund_enter_password);  
  42.         intiView();  
  43.         setListener();  
  44.         testcursorPosition();  
  45.     }  
  46.       
  47.     public void intiView(){  
  48.         et_pwd1=(EditText)findViewById(R.id.et_pwd1);  
  49.         et_pwd2=(EditText)findViewById(R.id.et_pwd2);  
  50.         et_pwd3=(EditText)findViewById(R.id.et_pwd3);  
  51.         et_pwd4=(EditText)findViewById(R.id.et_pwd4);  
  52.         et_pwd5=(EditText)findViewById(R.id.et_pwd5);  
  53.         et_pwd6=(EditText)findViewById(R.id.et_pwd6);  
  54.           
  55.         et_group=new ArrayList<EditText>();  
  56.         et_group.add(et_pwd1);  
  57.         et_group.add(et_pwd2);  
  58.         et_group.add(et_pwd3);  
  59.         et_group.add(et_pwd4);  
  60.         et_group.add(et_pwd5);  
  61.         et_group.add(et_pwd6);  
  62.           
  63.     }  
  64.       
  65.     /** 
  66.      * 输入判断,光标永远在第一个空白格 
  67.      */  
  68.     public void testcursorPosition(){  
  69.         cursorPosition=0;  
  70.         for(EditText editView : et_group){  
  71.             editView.setFocusableInTouchMode(true);  
  72.         }  
  73.           
  74.         for(EditText et : et_group){  
  75.             if(!TextUtils.isEmpty(et.getText().toString())){  
  76.                 ++cursorPosition;  
  77.                   
  78.             }else{  
  79.                 break;  
  80.             }  
  81.         }  
  82.           
  83.             if(cursorPosition==6){  
  84.                 cursorPosition=5;  
  85.             }  
  86.             EditText et=et_group.get(cursorPosition);  
  87.             et.requestFocus();  
  88.             et.setSelection(et.getText().toString().length());  
  89.               
  90.             imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
  91.             if(imm.isActive()){  
  92.                 imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);  
  93.               
  94.               
  95.         }  
  96.         setEditViewEnable();  
  97.     }  
  98.     /** 
  99.      * 设置EditView的Enable属性 
  100.      * 仅将包含光标的EditView设置为true 
  101.      */  
  102.     public void setEditViewEnable(){  
  103.         int i=0;  
  104.         for(EditText et : et_group){  
  105.             if(i++!=cursorPosition){  
  106.                 et.setFocusableInTouchMode(false);  
  107.             }  
  108.         }  
  109.     }  
  110.     /** 
  111.      * 事件监听 
  112.      */  
  113.     public void setListener(){  
  114.         /** 
  115.          * EditView 监听软键盘,监听删除键 
  116.          */  
  117.         onKeyListener=new OnKeyListener() {  
  118.             @Override  
  119.             public boolean onKey(View v, int keyCode, KeyEvent event) {  
  120.                 // TODO Auto-generated method stub  
  121.                 if(keyCode==KeyEvent.KEYCODE_DEL&&event.getAction()==KeyEvent.ACTION_DOWN){  
  122.                     testcursorPosition();  
  123.                     Log.d("pwd""删除密码"+Integer.toString(cursorPosition));  
  124.                     if(cursorPosition!=6&&cursorPosition!=0){  
  125.                         EditText et=et_group.get(cursorPosition);  
  126.                         if(TextUtils.isEmpty(et.getText().toString())){  
  127.                             et_group.get(cursorPosition-1).setText("");  
  128.                         }  
  129.                     }  
  130.                 }  
  131.                     return false;  
  132.                   
  133.             }  
  134.         };  
  135.         /** 
  136.          * EditView的点击事件 
  137.          */  
  138.         OnClickListener clickListener=new OnClickListener() {  
  139.               
  140.             @Override  
  141.             public void onClick(View v) {  
  142.                 // TODO Auto-generated method stub  
  143.                 testcursorPosition();  
  144.             }  
  145.         };  
  146.           
  147.         for(EditText et : et_group){  
  148.             et.addTextChangedListener(this);  
  149.             et.setOnKeyListener(onKeyListener);  
  150.             et.setOnClickListener(clickListener);  
  151.         }  
  152.     }  
  153.       
  154.     @Override  
  155.     public void beforeTextChanged(CharSequence s, int start, int count,  
  156.             int after) {  
  157.         // TODO Auto-generated method stub  
  158.     }  
  159.   
  160.     @Override  
  161.     public void onTextChanged(CharSequence s, int start, int before, int count) {  
  162.         // TODO Auto-generated method stub  
  163.         EditText et = et_group.get(cursorPosition);  
  164.         if(s.length()>1){  
  165.             s=s.toString().subSequence(01);  
  166.             et.setText(s);  
  167.             et.setSelection(s.length());  
  168.         }  
  169.           
  170.         if(!TextUtils.isEmpty(et.getText().toString())&&  
  171.                 !et.getText().toString().equals("*")){  
  172.             password[cursorPosition]=et.getText().toString();  
  173.             et.setText("*");  
  174.         }else if(!et.getText().toString().equals("*")){  
  175.             password[cursorPosition]=et.getText().toString();  
  176.         }  
  177.           
  178.         testcursorPosition();  
  179.     }  
  180.   
  181.     @Override  
  182.     public void afterTextChanged(Editable s) {  
  183.         // TODO Auto-generated method stub  
  184.     }  
  185. }  


代码并不难,testcursorPosition用来检测光标应该在的正确位置。InputMethodManager用于显示软键盘,设置成HIDE_IMPLICIT_ONLY唯一的一个问题就是可能弹出密码框的时候会自动弹出软键盘,这个软键盘在弹出后会弹回,但是解决了在输入密码的时候软键盘弹出弹回影响用户体验的问题。在onTextChanged对EditText的长度进行了限制。把数字显示成“*”

整个逻辑跑通之后最大的问题就是输入密码变圆点,如果不直接设置成*号,密码框变成圆点的过程会很长,而且时间不定,体验非常差。

3.源码下载

源码下载

1.功能介绍及效果图

做密码框的时候考虑了两个方案,一个方案是用6个EditText,另一个方案则是在EditText上画5条线。因为我基本没接触过draw部分的代码,对语法都不了解,所以果断选择了第一种。接下来考虑密码框需要实现的功能和用户体验的问题。

功能1:输入密码删除密码流畅

功能2:用户点击任意密码框焦点在正确的位置

功能3:输入的密码直接显示为圆点

2.源码

[java]  view plain  copy
  1. package com.example.passwordview;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.text.Editable;  
  11. import android.text.TextUtils;  
  12. import android.text.TextWatcher;  
  13. import android.util.Log;  
  14. import android.view.KeyEvent;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.view.View.OnKeyListener;  
  18. import android.view.inputmethod.InputMethodManager;  
  19. import android.widget.Button;  
  20. import android.widget.EditText;  
  21. import android.widget.LinearLayout;  
  22. import android.widget.Toast;  
  23.   
  24. public class MainActivity extends Activity implements TextWatcher{  
  25.   
  26.     private EditText et_pwd1;  
  27.     private EditText et_pwd2;  
  28.     private EditText et_pwd3;  
  29.     private EditText et_pwd4;  
  30.     private EditText et_pwd5;  
  31.     private EditText et_pwd6;  
  32.     private List<EditText> et_group;  
  33.     private OnKeyListener onKeyListener;  
  34.     public int cursorPosition=0;  
  35.     private InputMethodManager imm;  
  36.     public Context context;  
  37.     private String[] password=new String[6];  
  38.     @Override  
  39.     protected void onCreate(Bundle savedInstanceState) {  
  40.         super.onCreate(savedInstanceState);  
  41.         setContentView(R.layout.httfund_enter_password);  
  42.         intiView();  
  43.         setListener();  
  44.         testcursorPosition();  
  45.     }  
  46.       
  47.     public void intiView(){  
  48.         et_pwd1=(EditText)findViewById(R.id.et_pwd1);  
  49.         et_pwd2=(EditText)findViewById(R.id.et_pwd2);  
  50.         et_pwd3=(EditText)findViewById(R.id.et_pwd3);  
  51.         et_pwd4=(EditText)findViewById(R.id.et_pwd4);  
  52.         et_pwd5=(EditText)findViewById(R.id.et_pwd5);  
  53.         et_pwd6=(EditText)findViewById(R.id.et_pwd6);  
  54.           
  55.         et_group=new ArrayList<EditText>();  
  56.         et_group.add(et_pwd1);  
  57.         et_group.add(et_pwd2);  
  58.         et_group.add(et_pwd3);  
  59.         et_group.add(et_pwd4);  
  60.         et_group.add(et_pwd5);  
  61.         et_group.add(et_pwd6);  
  62.           
  63.     }  
  64.       
  65.     /** 
  66.      * 输入判断,光标永远在第一个空白格 
  67.      */  
  68.     public void testcursorPosition(){  
  69.         cursorPosition=0;  
  70.         for(EditText editView : et_group){  
  71.             editView.setFocusableInTouchMode(true);  
  72.         }  
  73.           
  74.         for(EditText et : et_group){  
  75.             if(!TextUtils.isEmpty(et.getText().toString())){  
  76.                 ++cursorPosition;  
  77.                   
  78.             }else{  
  79.                 break;  
  80.             }  
  81.         }  
  82.           
  83.             if(cursorPosition==6){  
  84.                 cursorPosition=5;  
  85.             }  
  86.             EditText et=et_group.get(cursorPosition);  
  87.             et.requestFocus();  
  88.             et.setSelection(et.getText().toString().length());  
  89.               
  90.             imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
  91.             if(imm.isActive()){  
  92.                 imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);  
  93.               
  94.               
  95.         }  
  96.         setEditViewEnable();  
  97.     }  
  98.     /** 
  99.      * 设置EditView的Enable属性 
  100.      * 仅将包含光标的EditView设置为true 
  101.      */  
  102.     public void setEditViewEnable(){  
  103.         int i=0;  
  104.         for(EditText et : et_group){  
  105.             if(i++!=cursorPosition){  
  106.                 et.setFocusableInTouchMode(false);  
  107.             }  
  108.         }  
  109.     }  
  110.     /** 
  111.      * 事件监听 
  112.      */  
  113.     public void setListener(){  
  114.         /** 
  115.          * EditView 监听软键盘,监听删除键 
  116.          */  
  117.         onKeyListener=new OnKeyListener() {  
  118.             @Override  
  119.             public boolean onKey(View v, int keyCode, KeyEvent event) {  
  120.                 // TODO Auto-generated method stub  
  121.                 if(keyCode==KeyEvent.KEYCODE_DEL&&event.getAction()==KeyEvent.ACTION_DOWN){  
  122.                     testcursorPosition();  
  123.                     Log.d("pwd""删除密码"+Integer.toString(cursorPosition));  
  124.                     if(cursorPosition!=6&&cursorPosition!=0){  
  125.                         EditText et=et_group.get(cursorPosition);  
  126.                         if(TextUtils.isEmpty(et.getText().toString())){  
  127.                             et_group.get(cursorPosition-1).setText("");  
  128.                         }  
  129.                     }  
  130.                 }  
  131.                     return false;  
  132.                   
  133.             }  
  134.         };  
  135.         /** 
  136.          * EditView的点击事件 
  137.          */  
  138.         OnClickListener clickListener=new OnClickListener() {  
  139.               
  140.             @Override  
  141.             public void onClick(View v) {  
  142.                 // TODO Auto-generated method stub  
  143.                 testcursorPosition();  
  144.             }  
  145.         };  
  146.           
  147.         for(EditText et : et_group){  
  148.             et.addTextChangedListener(this);  
  149.             et.setOnKeyListener(onKeyListener);  
  150.             et.setOnClickListener(clickListener);  
  151.         }  
  152.     }  
  153.       
  154.     @Override  
  155.     public void beforeTextChanged(CharSequence s, int start, int count,  
  156.             int after) {  
  157.         // TODO Auto-generated method stub  
  158.     }  
  159.   
  160.     @Override  
  161.     public void onTextChanged(CharSequence s, int start, int before, int count) {  
  162.         // TODO Auto-generated method stub  
  163.         EditText et = et_group.get(cursorPosition);  
  164.         if(s.length()>1){  
  165.             s=s.toString().subSequence(01);  
  166.             et.setText(s);  
  167.             et.setSelection(s.length());  
  168.         }  
  169.           
  170.         if(!TextUtils.isEmpty(et.getText().toString())&&  
  171.                 !et.getText().toString().equals("*")){  
  172.             password[cursorPosition]=et.getText().toString();  
  173.             et.setText("*");  
  174.         }else if(!et.getText().toString().equals("*")){  
  175.             password[cursorPosition]=et.getText().toString();  
  176.         }  
  177.           
  178.         testcursorPosition();  
  179.     }  
  180.   
  181.     @Override  
  182.     public void afterTextChanged(Editable s) {  
  183.         // TODO Auto-generated method stub  
  184.     }  
  185. }  


代码并不难,testcursorPosition用来检测光标应该在的正确位置。InputMethodManager用于显示软键盘,设置成HIDE_IMPLICIT_ONLY唯一的一个问题就是可能弹出密码框的时候会自动弹出软键盘,这个软键盘在弹出后会弹回,但是解决了在输入密码的时候软键盘弹出弹回影响用户体验的问题。在onTextChanged对EditText的长度进行了限制。把数字显示成“*”

整个逻辑跑通之后最大的问题就是输入密码变圆点,如果不直接设置成*号,密码框变成圆点的过程会很长,而且时间不定,体验非常差。

3.源码下载

源码下载




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值