Android 仿支付宝密码输入页面

简单页面,不一一介绍,直接上源码
`
package cn.npe1348.zfbpay.view;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import cn.npe1348.zfbpay.R;

public class PasswordView extends RelativeLayout {
private Context context;
// 输入的密码
private String strPassword;
// 就6个输入框不会变了,用数组内存申请固定空间,比List省空间
private TextView[]textViewList;
// 用GrideView布局键盘,其实并不是真正的键盘,只是模拟键盘的功能
private GridView gridView;
// 要用Adapter中适配,用数组不能往adapter中填充
private ArrayList<Map<String, String>> valueList;
//取消按钮
private ImageView tvCancel;
//忘记密码按钮
private TextView tvForget;
// 用于记录当前输入密码格位置
private int currentIndex = -1;

//自定义接口
public interface OnPasswordInputFinish {
    //添加密码输入完成的接口
    void inputFinish();
    //取消支付接口
    void outfo();
    //忘记密码接口
    void forgetPwd();
}

public PasswordView(Context context, AttributeSet attrs) {
    this(context, attrs,0);
}

public PasswordView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.context = context;
    //view布局
    View view = View.inflate(context, R.layout.layout_popup_bottom, null);
    valueList = new ArrayList<Map<String, String>>();
    textViewList = new TextView[6];
    //初始化控件
    tvCancel=(ImageView) view.findViewById(R.id.tvCancel);
    tvForget = (TextView) view.findViewById(R.id.tv_forgetPwd);
    textViewList[0] = (TextView) view.findViewById(R.id.tv_pass1);
    textViewList[1] = (TextView) view.findViewById(R.id.tv_pass2);
    textViewList[2] = (TextView) view.findViewById(R.id.tv_pass3);
    textViewList[3] = (TextView) view.findViewById(R.id.tv_pass4);
    textViewList[4] = (TextView) view.findViewById(R.id.tv_pass5);
    textViewList[5] = (TextView) view.findViewById(R.id.tv_pass6);
    //初始化键盘
    gridView = (GridView) view.findViewById(R.id.gv_keybord);
    //设置键盘显示按钮到集合
    setView();
    // 必须要,不然不显示控件
    addView(view);
}

//设置按钮显示内容
private void setView() {
    // 初始化按钮上应该显示的数字
    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", "X");
        } else if (i == 12) {
            map.put("name", "<");
        } else if (i == 11) {
            map.put("name", String.valueOf(0));
        }
        valueList.add(map);
    }
    //为键盘gridview设置适配器
    gridView.setAdapter(adapter);
    //为键盘按键添加点击事件
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // 点击0~9按钮
            if (position < 11 && position != 9) {
                // 判断输入位置————要小心数组越界
                if (currentIndex >= -1 && currentIndex < 5) {
                    textViewList[++currentIndex].setText(valueList.get(position)
                            .get("name"));
                }
            } else {
                // 点击退格键
                if (position == 11) {
                    // 判断是否删除完毕————要小心数组越界
                    if (currentIndex - 1 >= -1) {
                        textViewList[currentIndex--].setText("");
                    }
                }else if(position == 9){
                    currentIndex = -1;
                    for(int i = 0,length=textViewList.length;i<length;i++){
                        textViewList[i].setText("");
                    }
                }
            }
        }
    });
}

// 设置监听方法,在第6位输入完成后触发
public void setOnFinishInput(final OnPasswordInputFinish pass) {
    textViewList[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 += textViewList[i].getText().toString().trim();
                }
                // 接口中要实现的方法,完成密码输入完成后的响应逻辑
                pass.inputFinish();
            }
        }
    });
    tvCancel.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //点击取消调用接口
            pass.outfo();
        }
    });
    tvForget.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //单击忘记密码调用接口
            pass.forgetPwd();
        }
    });
}

//获取输入的密码
public String getStrPassword() {
    return strPassword;
}
// 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;
    }
    @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) {
            //设置按钮背景
            viewHolder.btnKey
                    .setBackgroundResource(R.drawable.selector_key_del);
        }
        if (position == 11) {
            //设置按钮背景
            viewHolder.btnKey
                    .setBackgroundResource(R.drawable.selector_key_del);
        }
        return convertView;
    }
};
// 存放控件
public final class ViewHolder {
    public TextView btnKey;
}

}

`

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在安卓平台上,仿支付宝拖动是一种非常有趣和实用的交互设计,它可以让用户轻松地完成操作过程并且让人感觉非常顺畅和自然。仿支付宝拖动的核心思想是让用户通过手指拖动界面上的元素来完成操作,然后通过一系列动画和效果来让用户感觉到自己掌控了整个过程。下面是一些我们可以采用的技术手段。 首先,在最基本的层面上,我们可以采用Android中的ViewDragHelper类来实现仿支付宝拖动效果。该类是官方提供的一种工具,可以简化开发人员的工作,同时提供了一些不错的效果和动画。为了使用ViewDragHelper,我们需要将其包含在一个ViewGroup中,并且创建一个回调方法来控制手指移动时的交互。ViewDragHelper提供了一些回调方法,例如onTouchMove()和onViewReleased(),我们可以在这些方法中实现自定义的交互逻辑。 在实现交互逻辑之后,我们还需要添加一些视觉效果来让用户体验更加自然和流畅。例如,在拖动过程中,我们可以添加阴影和透明度效果来指示元素移动的位置,这可以通过Android中的View属性或Drawable对象来实现。我们还可以添加一系列过渡效果和动画,例如元素弹跳、放大和旋转,这些效果可以通过使用Android中的PropertyAnimation类或View动画来实现。 最后,为了使仿支付宝拖动操作更加方便和实用,我们还可以添加一些额外的功能。例如,在用户拖动一个元素时,我们可以自动调整其他元素的位置,使得整个界面的布局更加合理和美观。在实现这些额外功能时,我们需要充分考虑用户体验和性能问题,并注意避免过度设计和不必要的动画效果。 总之,实现Android仿支付宝拖动效果需要我们充分理解用户需求和操作习惯,并结合视觉效果和交互设计来打造一个高度自然和流畅的交互体验。在实现过程中,我们可以采用一系列技术手段和工具,例如ViewDragHelper、动画效果和布局优化,在最大化实现用户需求和提升应用体验的同时,保持代码简洁、易读和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值