当前位置: 移动技术网 > 移动技术>移动开发>Android > Android高仿微信支付密码输入控件

Android高仿微信支付密码输入控件

2019年07月24日  | 移动技术网移动技术  | 我要评论

像微信支付密码控件,在app中是一个多么司空见惯的功能。最近,项目需要这个功能,于是乎就实现这个功能。
老样子,投篮需要找准角度,变成需要理清思路。对于这个"小而美"的控件,我们思路应该这样子。

ⅰ、将要输入密码数量动态通过代码加载出来。

ⅱ、利用gridview模拟产生一个输入数字键盘,并且按照习惯从屏幕底部弹出来。

ⅲ、对输入数字键盘进行事件监听,将这个输入数字填入到这个密码框中,并且当您输入密码长度一致的时候,进行事件回调。

这个思维导图应该是这样的:


首先,我们要根据需求动态加载密码框,相应的代码如下: 

for (int i = 0; i < 6; i++) {
   textview textview = new textview(context);
   android.widget.linearlayout.layoutparams layoutparams = new android.widget.linearlayout.layoutparams(
     0, android.widget.linearlayout.layoutparams.wrap_content, 1);
   textview.setgravity(gravity.center);
   textview.settransformationmethod(passwordtransformationmethod.getinstance());
   textview.settextsize(32);
   textview.setlayoutparams(layoutparams);
   ll_pwd.addview(textview);
   if (i != 5) {
    view view2 = new view(context);
    android.widget.linearlayout.layoutparams layoutparams1 = new android.widget.linearlayout.layoutparams(
      1,
      android.widget.linearlayout.layoutparams.match_parent,
      0);
    view2.setlayoutparams(layoutparams1);
    view2.setbackgroundcolor(color.parsecolor("#999999"));
    ll_pwd.addview(view2);

   }
   tvlist[i] = textview;
  }

我们这里密码长度设置为6,将这6个密码框控件添加到盛放这些控件的父控件中去,并且每个密码控件中都有一个分隔控件。并且把每个密码输入控件放入控件数组,以便我们进行接下来的操作。

然后了,我们利用gridview产生一个12宫格的模拟数字键盘,这样模拟键盘样子是这样的: 


源代码应该是这样的: 

 /**
  * 加载数据的代码
  */
 private void initdata() {
  /* 初始化按钮上应该显示的数字 */
  for (int i = 1; i < 13; i++) {
   map<string, string> map = new hashmap<string, string>();
   if (i < 10) {
    map.put("name", string.valueof(i));
   } else if (i == 10) {
    map.put("name", "");
   } else if (i == 11) {
    map.put("name", string.valueof(0));
   } else if (i == 12) {
    map.put("name", "×");
   } else {
    map.put("name", "");
   }
   valuelist.add(map);
  }
  gridview.setadapter(adapter);
  gridview.setonitemclicklistener(new adapterview.onitemclicklistener() {
   @override
   public void onitemclick(adapterview<?> parent, view view,
     int position, long id) {
    if (position < 11 && position != 9) { // 点击0~9按钮
     if (currentindex >= -1 && currentindex < 5) { // 判断输入位置————要小心数组越界
      tvlist[++currentindex].settext(valuelist.get(position)
        .get("name"));
     }
    } else {
     if (position == 11) { // 点击退格键
      if (currentindex - 1 >= -1) { // 判断是否删除完毕————要小心数组越界
       tvlist[currentindex--].settext("");
      }
     }
    }
   }
  });
 }
  /**
   * grideview的适配器
   */ 
 baseadapter adapter = new baseadapter() {
  @override
  public int getcount() {
   return valuelist.size();
  }

  @override
  public object getitem(int position) {
   return valuelist.get(position);
  }

  @override
  public long getitemid(int position) {
   return position;
  }

  @suppresswarnings("deprecation")
  @override
  public view getview(int position, view convertview, viewgroup parent) {
   viewholder viewholder;
   if (convertview == null) {
    convertview = view.inflate(context, r.layout.item_gride, null);
    viewholder = new viewholder();
    viewholder.btnkey = (textview) convertview
      .findviewbyid(r.id.btn_keys);
    convertview.settag(viewholder);
   } else {
    viewholder = (viewholder) convertview.gettag();
   }
   viewholder.btnkey.settext(valuelist.get(position).get("name"));
   if (position == 9||position==11) {
    viewholder.btnkey.setbackgrounddrawable(utils.getstatelistdrawable(context));
    viewholder.btnkey.setenabled(false);
   }
   if (position == 11) {
    viewholder.btnkey.setbackgrounddrawable(utils.getstatelistdrawable(context));
   }

   return convertview;
  }
 };
 
 
 /**
  * 存放控件
  */
 public final class viewholder {
  public textview btnkey;
 } 
              

加载模拟键盘上的数据为0-9与x,然后将这个数据通过一个适配器将这些数据填充到这个gridview控件。这些都是老司机的老套路。按照惯例,这个模拟键盘应该从屏幕的底部弹出,我这里所做的就是将gridview依附在popupwindow,然后在从屏幕的底部进行弹出。相应的代码如下:

view contentview = layoutinflater.from(context).inflate(
    r.layout.layout_popupdemo, null);// 定义后退弹出框
  gridview = (gridview) contentview.findviewbyid(r.id.gv_keybord);// 泡泡窗口的布局 
 popupwindow = new popupwindow(contentview,
    viewgroup.layoutparams.match_parent,// width

    viewgroup.layoutparams.wrap_content);// higth
  popupwindow.setfocusable(false);
  popupwindow.setanimationstyle(r.style.animation);
   //从底部弹出
  public void show() {
  popupwindow.showatlocation(rl_bottom, gravity.bottom, 0, 0); // 确定在界面中出现的位置
 }
 @override
 public void onwindowfocuschanged(boolean haswindowfocus) {
  super.onwindowfocuschanged(haswindowfocus);
  show();
 }

当这个控件一加载的时候,就弹出。 

最后,我们要做的就是监听模拟键盘,将这个模拟键盘的输入填入到密码框,说的貌似很高大上的,其实就是监听gridview的onitemclick事件,相应代码如下: 

gridview.setonitemclicklistener(new adapterview.onitemclicklistener() {
   @override
   public void onitemclick(adapterview<?> parent, view view,
     int position, long id) {
    if (position < 11 && position != 9) { // 点击0~9按钮
     if (currentindex >= -1 && currentindex < 5) { // 判断输入位置————要小心数组越界
      tvlist[++currentindex].settext(valuelist.get(position)
        .get("name"));
     }
    } else {
     if (position == 11) { // 点击退格键
      if (currentindex - 1 >= -1) { // 判断是否删除完毕————要小心数组越界
       tvlist[currentindex--].settext("");
      }
     }
    }
   }
  });

如果用户点击数字0-9,就填入到密码框中,如果是点击退格键的话,就删除所对应密码框的内容。看到没,上文所用文本框数组列表派上了用场。这里值得指出,由于退格键点击效果与众不同,我这里应用代码设置他的样式。

当用户最后一个密码框输入完成之后,就进行输入完成的回调,相应代码为: 

// 设置监听方法,在第6位输入完成后触发
 public void setonfinishinput(final onpasswordinputfinish pass) {
  tvlist[5].addtextchangedlistener(new textwatcher() {
   @override
   public void beforetextchanged(charsequence s, int start, int count,
     int after) {

   }

   @override
   public void ontextchanged(charsequence s, int start, int before,
     int count) {

   }

   @override
   public void aftertextchanged(editable s) {
    if (s.tostring().length() == 1) {
     strpassword = ""; // 每次触发都要先将strpassword置空,再重新获取,避免由于输入删除再输入造成混乱
     for (int i = 0; i < 6; i++) {
      strpassword += tvlist[i].gettext().tostring().trim();
     }
     if (pass!=null) {
      pass.inputfinish(); // 接口中要实现的方法,完成密码输入完成后的响应逻辑      
     }
    }
   }
  });

经过一番折腾以后,大功告成了,最终效果如下:

 

源码下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网