像微信支付密码控件,在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() {@Overridepublic 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() {@Overridepublic int getCount() {return valueList.size();}@Overridepublic Object getItem(int position) {return valueList.get(position);}@Overridepublic long getItemId(int position) {return position;}@SuppressWarnings("deprecation")@Overridepublic 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);// higthpopupWindow.setFocusable(false);popupWindow.setAnimationStyle(R.style.animation);//从底部弹出public void show() {popupWindow.showAtLocation(rl_bottom, Gravity.BOTTOM, 0, 0); // 确定在界面中出现的位置
    }@Overridepublic void onWindowFocusChanged(boolean hasWindowFocus) {super.onWindowFocusChanged(hasWindowFocus);show();}

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

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

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic 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() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {}@Overridepublic 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(); // 接口中要实现的方法,完成密码输入完成后的响应逻辑
                    }}}});

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

  项目地址为:http://pan.baidu.com/s/1o88FK2A

转载于:https://www.cnblogs.com/manuosex/p/5400550.html

Android 高仿微信支付密码输入控件相关推荐

  1. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  2. android仿微信充值布局,Android 高仿微信支付数字键盘功能

    现在很多app的支付.输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便.其效果着实精致. 下面带着大家学习下,如何高仿微信的数字键盘,可以拿来直接用在自身的项目中. 先看下效果图: 1. 自定 ...

  3. Android 高仿微信支付键盘

    转载自  http://blog.csdn.net/zuiwuyuan/article/details/52198240 1. 道友留步 这位大神的代码封装的很好,把类拿来直接就可以用的了,稍微要注意 ...

  4. android 微信支付键盘,Android 高仿微信支付键盘

    转载自  http://blog.csdn.net/zuiwuyuan/article/details/52198240 1. 道友留步 这位大神的代码封装的很好,把类拿来直接就可以用的了,稍微要注意 ...

  5. android仿支付提现功能,Android应用开发Android 仿微信支付密码界面

    本文将带你了解Android应用开发Android 仿微信支付密码界面,希望本文对大家学Android有所帮助. 使用 Bundle bundle = new Bundle(); bundle.put ...

  6. android+高仿视频录制,Android高仿微信拍照控件,实战推荐!

    原标题:Android高仿微信拍照控件,实战推荐! 作者:陈嘉桐 转自:ttps://github.com/CJT2325 控件介绍 不知道是不是在微信更新到6.0版本之后,微信将它的拍照和录制视频的 ...

  7. 自定义view,仿微信、支付宝密码输入控件的源码实现

    研究支付宝密码输入控件及源码实现 目标效果图 实现思路 要想实现输入,就少不了EditText 看整体布局应该是一个横向的LinearLayout 每个格子看进来应该是多个子View 那么我们是不是有 ...

  8. android+高仿视频录制,android高仿微信视频编辑页

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

  9. android高仿微信视频编辑页-视频多张图片提取

    android高仿微信视频编辑页-视频多张图片提取 上一篇中介绍了有关视频提取图片的知识点,如果对这个不太了解 建议看下android提取视频多张图片和视频信息之前这篇. 这里实现的是仿微信的视频编辑 ...

  10. android com.mylhyl,Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...

最新文章

  1. dev gridcontrol设置过滤器下拉列表
  2. oracle星形转换,Oracle数据仓库博客(转,学)
  3. 会导致所有者权益减少的项目是_第二章:会计要素的确认(11)所有者权益
  4. lazada铺货模式的选品_lazada小白的运营难点→铺货与精细化运营的优劣势详解
  5. safari的一些问题
  6. 苹果应用上架,图片的要求(2017年4月27日)
  7. C#面向对象15 多态
  8. 随笔写一个简单的爬虫
  9. 剑指 Offer II 036. 后缀表达式
  10. Cloudera Certified Associate Administrator案例之Install篇
  11. Python机器学习笔记:异常点检测算法——Isolation Forest
  12. HarmonyOS 开发App详细步骤
  13. Google Exoplayer之全面认识
  14. 使用samba完成Linux服务器与Windows之间的映射
  15. Git通过SSH拉取报错kex_exchange_identification
  16. AI绘画是什么软件?看完你就知道了
  17. 2018年上半年信息安全工程师上午选择题及解析
  18. 计算机应用基础(高起专)作业,西安交通大学19年5月补考《计算机应用基础》作业考核试题 (含主观题)【参考答案】...
  19. echarts中对整个图形旋转90°(实现div旋转90度)
  20. 杰理之LINEIN 左右声道与 DACLR 输入出的注意【篇】

热门文章

  1. USACO 2016 January Contest, Gold解题报告
  2. Android KLog源代码分析
  3. bfs (宽度搜素)
  4. BPM实例分享——日期自动计算
  5. 一个超级简单的HTML模板框架源代码以及使用示例
  6. WebSocket,不再“轮询”
  7. NPM酷库:minimatch,模式匹配字符串
  8. linux文件系统简析
  9. 一网打尽Android UI 控件教程
  10. 构建Docker镜像仓库的另一选择:Nexus3 - DockOne.io