Android自定义View实现微信支付密码输入框

本文实例为大家分享了Android实现微信支付密码输入框的具体代码,供大家参考,具体内容如下

效果图

项目中使用到了支付密码功能,其实这类界面是比较常用的,涉及支付密码的输入的一般都会用到对的,所以单独地把这部分抽取出来,有需要的朋友可以拿去用哈!

效果就是支付,弹出密码框,输入密码,这个过程密码不可见,并且提供一个输入完毕的监听!

这个弹出层呢,其实就是一个DialogFragment,逻辑封装在其内部

一.弹出层进出动画 (anim文件)

push_bottom_in.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑入式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="200"
 android:fromYDelta="100%p"
 android:toYDelta="0" />
</set>

push_bottom_out.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 上下滑出式 -->
<set xmlns:android="http://schemas.android.com/apk/res/android">
 <translate
 android:duration="200"
 android:fromYDelta="0"
 android:toYDelta="100%p" />
</set>

二.drawable资源

selector_item_pressed.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/gray_bg" android:state_pressed="true" />
 <item android:drawable="@color/white" android:state_activated="false" />
 <item android:drawable="@color/white" />
</selector>

键盘的点击效果

shape_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="rectangle">
 <solid android:color="@android:color/white" />
 <corners android:radius="10dp" />
</shape>

弹出框样式

三.mipmap资源

四.layout布局

fragment_pay.xml

支付弹出层布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginLeft="40dp"
 android:layout_marginRight="40dp"
 android:layout_marginTop="100dp"
 android:background="@drawable/shape_dialog"
 android:orientation="vertical"
 android:paddingBottom="@dimen/spacing_large">

 <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

  <TextView
  style="@style/style_black_normal_text"
  android:layout_width="wrap_content"
  android:layout_height="@dimen/text_item_height"
  android:layout_centerInParent="true"
  android:gravity="center"
  android:text="请输入支付密码"
  android:textSize="20sp"
  android:textStyle="bold" />
  <!--cancel键-->
  <ImageView
  android:id="@+id/iv_close"
  android:clickable="true"
  android:layout_width="28dp"
  android:layout_height="28dp"
  android:layout_alignParentLeft="true"
  android:layout_centerVertical="true"
  android:layout_marginLeft="@dimen/spacing_tiny"
  android:src="@mipmap/icon_del" />
 </RelativeLayout>

 <View style="@style/style_separate_line" />
 <!--操作文字-->
 <TextView
  android:id="@+id/tv_content"
  style="@style/style_black_normal_text"
  android:layout_width="wrap_content"
  android:layout_height="@dimen/text_item_height"
  android:layout_gravity="center_horizontal"
  android:gravity="center"
  android:textStyle="bold" />
 <!--支付金额-->
 <TextView
  android:id="@+id/tv_content2"
  style="@style/style_black_money_text"
  android:layout_width="wrap_content"
  android:layout_height="@dimen/text_item_height"
  android:layout_gravity="center_horizontal"
  android:gravity="center"
  android:textStyle="bold" />
 <!--额外扣除手续费-->
 <TextView
  android:id="@+id/tv_content3"
  style="@style/style_black_normal_text"
  android:layout_width="wrap_content"
  android:layout_height="@dimen/text_item_height2"
  android:layout_gravity="center_horizontal"
  android:gravity="center" />
 <!--密码输入框-->
 <cn.xdeveloper.payui.PayPassWordView
  android:id="@+id/payPwdView"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_marginLeft="@dimen/spacing_large"
  android:layout_marginRight="@dimen/spacing_large"
  android:background="@color/white" />
 </LinearLayout>

 <!--键盘-->
 <cn.xdeveloper.payui.PassWordInputView
 android:id="@+id/inputMethodView"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignParentBottom="true" />

</RelativeLayout>

自定义键盘布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/table_num"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_weight="6"
 android:background="@color/gray_line"
 android:orientation="vertical">

 <View style="@style/style_separate_line" />

 <RelativeLayout
 android:id="@+id/layout_hide"
 android:layout_width="match_parent"
 android:layout_height="25dp"
 android:background="@drawable/selector_item_pressed">

 <ImageView
  android:layout_width="30dp"
  android:layout_height="wrap_content"
  android:layout_centerInParent="true"
  android:src="@mipmap/ic_arrow_down" />

 </RelativeLayout>

 <LinearLayout style="@style/layout_input_amount_style">

 <TextView
  android:id="@+id/btn_1"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:layout_marginTop="@dimen/input_method_spacing"
  android:onClick="onClick"
  android:tag="1"
  android:text="1" />

 <TextView
  android:id="@+id/btn_2"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:layout_marginTop="@dimen/input_method_spacing"
  android:tag="2"
  android:text="2" />

 <TextView
  android:id="@+id/btn_3"
  style="@style/btn_input_num_style"
  android:layout_marginTop="@dimen/input_method_spacing"
  android:tag="3"
  android:text="3" />
 </LinearLayout>

 <LinearLayout style="@style/layout_input_amount_style">

 <TextView
  android:id="@+id/btn_4"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:tag="4"
  android:text="4" />

 <TextView
  android:id="@+id/btn_5"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:tag="5"
  android:text="5" />

 <TextView
  android:id="@+id/btn_6"
  style="@style/btn_input_num_style"
  android:tag="6"
  android:text="6" />
 </LinearLayout>

 <LinearLayout style="@style/layout_input_amount_style">

 <TextView
  android:id="@+id/btn_7"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:tag="7"
  android:text="7" />

 <TextView
  android:id="@+id/btn_8"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:tag="8"
  android:text="8" />

 <TextView
  android:id="@+id/btn_9"
  style="@style/btn_input_num_style"
  android:tag="9"
  android:text="9" />
 </LinearLayout>

 <LinearLayout style="@style/layout_input_amount_style">

 <TextView
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:background="@color/gray_btn" />

 <TextView
  android:id="@+id/btn_0"
  style="@style/btn_input_num_style"
  android:layout_marginRight="@dimen/input_method_spacing"
  android:tag="0"
  android:text="0" />

 <ImageView
  android:id="@+id/btn_del"
  android:layout_width="0dp"
  android:layout_height="match_parent"
  android:layout_weight="1"
  android:scaleType="center"
  android:src="@mipmap/ic_input_del"
  android:tag="-1" />

 </LinearLayout>
</LinearLayout>

五.color资源

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <color name="colorPrimary">#3F51B5</color>
 <color name="colorPrimaryDark">#303F9F</color>
 <color name="colorAccent">#FF4081</color>

 <color name="gray_text">#919191</color>
 <color name="gray_btn">#EBEBEB</color>

 <color name="gray_bg">#f0eff5</color>
 <color name="gray_line">#d5d1d1</color>
 <color name="white">#FFFFFF</color>
 <color name="black">#000000</color>
 <color name="black_text">#212121</color>
</resources>

六.dimen资源

<?xml version="1.0" encoding="utf-8"?>
<resources>

 <!-- 字体大小 -->
 <dimen name="font_larger">40sp</dimen>
 <dimen name="font_large">18sp</dimen>
 <dimen name="font_normal">15sp</dimen>
 <dimen name="font_small">12sp</dimen>
 <dimen name="font_tiny">10sp</dimen>

 <!-- 控件之间的距离 -->
 <dimen name="spacing_large">20dp</dimen>
 <dimen name="spacing_normal">15dp</dimen>
 <dimen name="spacing_small">10dp</dimen>
 <dimen name="spacing_tiny">10dp</dimen>
 <dimen name="divider_height">0.5dp</dimen>
 <dimen name="spacing_layout_padding">10dp</dimen>
 <dimen name="spacing_layout_margin">10dp</dimen>

 <!-- 描述性文字item项的高 -->
 <dimen name="text_item_height">50dp</dimen>
 <dimen name="text_item_height2">25dp</dimen>
 <dimen name="input_method_spacing">2px</dimen>

</resources>

七.styles样式

<resources>

 <!-- Base application theme. -->
 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
 <!-- Customize your theme here. -->
 <item name="colorPrimary">@color/colorPrimary</item>
 <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
 <item name="colorAccent">@color/colorAccent</item>
 </style>

 <!--底部弹框-->
 <style name="BottomDialog" parent="@style/Theme.AppCompat">
 <item name="android:layout_width">match_parent</item>
 <item name="android:layout_height">wrap_content</item>
 <item name="android:windowIsFloating">true</item>
 <item name="android:backgroundDimEnabled">true</item>
 </style>

 <style name="AnimBottom" parent="@android:style/Animation">
 <item name="android:windowEnterAnimation">@anim/push_bottom_in</item>
 <item name="android:windowExitAnimation">@anim/push_bottom_out</item>
 </style>

 <!-- 提示文字样式 -->
 <style name="style_black_normal_text">
 <item name="android:textColor">@color/black_text</item>
 <item name="android:textSize">@dimen/font_normal</item>
 <item name="android:includeFontPadding">false</item>
 </style>
 <!-- 输入金额样式 -->
 <style name="style_black_money_text">
 <item name="android:textColor">@color/black_text</item>
 <item name="android:textSize">@dimen/font_larger</item>
 <item name="android:includeFontPadding">false</item>
 </style>

 <!-- 分割线样式 -->
 <style name="style_separate_line">
 <item name="android:layout_width">match_parent</item>
 <item name="android:layout_height">@dimen/divider_height</item>
 <item name="android:background">@color/gray_line</item>
 </style>

 <!--密码弹出框-->
 <declare-styleable name="PayPassWordView">
 <attr name="count" format="integer" />
 <attr name="border_color" format="color" />
 <attr name="dot_color" format="color" />
 </declare-styleable>
 <!--输入样式-->
 <style name="layout_input_amount_style">
 <item name="android:layout_width">match_parent</item>
 <item name="android:layout_height">55dp</item>
 <item name="android:layout_marginBottom">2px</item>
 <item name="android:gravity">center</item>
 <item name="android:orientation">horizontal</item>
 </style>

 <!--键盘数字-->
 <style name="btn_input_num_style">
 <item name="android:layout_width">0dp</item>
 <item name="android:layout_height">match_parent</item>
 <item name="android:layout_weight">1</item>
 <item name="android:gravity">center</item>
 <item name="android:textSize">25sp</item>
 <item name="android:textColor">@color/black_text</item>
 <item name="android:background">@drawable/selector_item_pressed</item>
 </style>

</resources>

八.输入键盘view

public class PassWordInputView extends LinearLayout implements View.OnClickListener {

 private InputReceiver inputReceiver;

 public PassWordInputView(Context context, @Nullable AttributeSet attrs) {
 super(context, attrs);
 LayoutInflater.from(context).inflate(R.layout.view_password_input, this);

 initView();
 }

 private void initView() {
 findViewById(R.id.btn_1).setOnClickListener(this);
 findViewById(R.id.btn_2).setOnClickListener(this);
 findViewById(R.id.btn_3).setOnClickListener(this);
 findViewById(R.id.btn_4).setOnClickListener(this);
 findViewById(R.id.btn_5).setOnClickListener(this);
 findViewById(R.id.btn_6).setOnClickListener(this);
 findViewById(R.id.btn_7).setOnClickListener(this);
 findViewById(R.id.btn_8).setOnClickListener(this);
 findViewById(R.id.btn_9).setOnClickListener(this);
 findViewById(R.id.btn_0).setOnClickListener(this);
 findViewById(R.id.btn_del).setOnClickListener(this);

 findViewById(R.id.layout_hide).setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
  setVisibility(GONE);
  }
 });
 }

 @Override
 public void onClick(View v) {
 String num = (String) v.getTag();
 this.inputReceiver.receive(num);
 }

 /**
 * 设置接收器
 *
 * @param receiver
 */
 public void setInputReceiver(InputReceiver receiver) {
 this.inputReceiver = receiver;
 }

 /**
 * 输入接收器
 */
 public interface InputReceiver {

 void receive(String num);
 }
}

九.密码框view

public class PayPassWordView extends View {

 private ArrayList<String> result;//输入结果保存
 private int count;//密码位数
 private int size;//默认每一格的大小
 private Paint mBorderPaint;//边界画笔
 private Paint mDotPaint;//掩盖点的画笔
 private int mBorderColor;//边界颜色
 private int mDotColor;//掩盖点的颜色
 private RectF mRoundRect;//外面的圆角矩形
 private int mRoundRadius;//圆角矩形的圆角程度

 public PayPassWordView(Context context) {
 super(context);
 init(null);//初始化
 }

 private InputCallBack inputCallBack;//输入完成的回调
 private PassWordInputView inputMethodView; //输入键盘

 public interface InputCallBack {
 void onInputFinish(String result);
 }

 public PayPassWordView(Context context, AttributeSet attrs) {
 super(context, attrs);
 init(attrs);
 }

 public PayPassWordView(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);
 init(attrs);
 }

 /**
 * 初始化相关参数
 */
 void init(AttributeSet attrs) {
 final float dp = getResources().getDisplayMetrics().density;
 this.setFocusable(true);
 this.setFocusableInTouchMode(true);
 result = new ArrayList<>();
 if (attrs != null) {
  TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.PayPassWordView);
  mBorderColor = ta.getColor(R.styleable.PayPassWordView_border_color, Color.LTGRAY);
  mDotColor = ta.getColor(R.styleable.PayPassWordView_dot_color, Color.BLACK);
  count = ta.getInt(R.styleable.PayPassWordView_count, 6);
  ta.recycle();
 } else {
  mBorderColor = Color.LTGRAY;
  mDotColor = Color.GRAY;
  count = 6;//默认6位密码
 }
 size = (int) (dp * 30);//默认30dp一格
 //color
 mBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mBorderPaint.setStrokeWidth(3);
 mBorderPaint.setStyle(Paint.Style.STROKE);
 mBorderPaint.setColor(mBorderColor);

 mDotPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mDotPaint.setStrokeWidth(3);
 mDotPaint.setStyle(Paint.Style.FILL);
 mDotPaint.setColor(mDotColor);
 mRoundRect = new RectF();
 mRoundRadius = (int) (5 * dp);
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 int w = measureWidth(widthMeasureSpec);
 int h = measureHeight(heightMeasureSpec);
 int wsize = MeasureSpec.getSize(widthMeasureSpec);
 int hsize = MeasureSpec.getSize(heightMeasureSpec);
 //宽度没指定,但高度指定
 if (w == -1) {
  if (h != -1) {
  w = h * count;//宽度=高*数量
  size = h;
  } else {//两个都不知道,默认宽高
  w = size * count;
  h = size;
  }
 } else {//宽度已知
  if (h == -1) {//高度不知道
  h = w / count;
  size = h;
  }
 }
 setMeasuredDimension(Math.min(w, wsize), Math.min(h, hsize));
 }

 private int measureWidth(int widthMeasureSpec) {
 //宽度
 int wmode = MeasureSpec.getMode(widthMeasureSpec);
 int wsize = MeasureSpec.getSize(widthMeasureSpec);
 if (wmode == MeasureSpec.AT_MOST) {//wrap_content
  return -1;
 }
 return wsize;
 }

 private int measureHeight(int heightMeasureSpec) {
 //高度
 int hmode = MeasureSpec.getMode(heightMeasureSpec);
 int hsize = MeasureSpec.getSize(heightMeasureSpec);
 if (hmode == MeasureSpec.AT_MOST) {//wrap_content
  return -1;
 }
 return hsize;
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
 if (event.getAction() == MotionEvent.ACTION_DOWN) {//点击控件弹出输入键盘
  requestFocus();
  inputMethodView.setVisibility(VISIBLE);
  return true;
 }
 return true;
 }

 @Override
 protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
 super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
 if (gainFocus) {
  inputMethodView.setVisibility(VISIBLE);
 } else {
  inputMethodView.setVisibility(GONE);
 }
 }

 @Override
 protected void onDraw(Canvas canvas) {
 super.onDraw(canvas);
 final int width = getWidth() - 2;
 final int height = getHeight() - 2;
 //先画个圆角矩形
 mRoundRect.set(0, 0, width, height);
 canvas.drawRoundRect(mRoundRect, 0, 0, mBorderPaint);
 //画分割线
 for (int i = 1; i < count; i++) {
  final int x = i * size;
  canvas.drawLine(x, 0, x, height, mBorderPaint);
 }
 //画掩盖点,
 // 这是前面定义的变量 private ArrayList<Integer> result;//输入结果保存
 int dotRadius = size / 8;//圆圈占格子的三分之一
 for (int i = 0; i < result.size(); i++) {
  final float x = (float) (size * (i + 0.5));
  final float y = size / 2;
  canvas.drawCircle(x, y, dotRadius, mDotPaint);
 }
 }

 @Override
 public boolean onCheckIsTextEditor() {
 return true;
 }

 @Override
 public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
 outAttrs.inputType = InputType.TYPE_CLASS_NUMBER;//输入类型为数字
 outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE;
 return new MyInputConnection(this, false);
 }

 public void setInputCallBack(InputCallBack inputCallBack) {
 this.inputCallBack = inputCallBack;
 }

 public void clearResult() {
 result.clear();
 invalidate();
 }

 private class MyInputConnection extends BaseInputConnection {
 public MyInputConnection(View targetView, boolean fullEditor) {
  super(targetView, fullEditor);
 }

 @Override
 public boolean commitText(CharSequence text, int newCursorPosition) {
  //这里是接受输入法的文本的,我们只处理数字,所以什么操作都不做
  return super.commitText(text, newCursorPosition);
 }

 @Override
 public boolean deleteSurroundingText(int beforeLength, int afterLength) {
  //软键盘的删除键 DEL 无法直接监听,自己发送del事件
  if (beforeLength == 1 && afterLength == 0) {
  return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
   && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
  }
  return super.deleteSurroundingText(beforeLength, afterLength);
 }
 }

 /**
 * 设置输入键盘view
 *
 * @param inputMethodView
 */
 public void setInputMethodView(PassWordInputView inputMethodView) {
 this.inputMethodView = inputMethodView;
 this.inputMethodView.setInputReceiver(new PassWordInputView.InputReceiver() {
  @Override
  public void receive(String num) {
  if (num.equals("-1")) {
   if (!result.isEmpty()) {
   result.remove(result.size() - 1);
   invalidate();
   }
  } else {
   if (result.size() < count) {
   result.add(num);
   invalidate();
   ensureFinishInput();
   }
  }

  }
 });
 }

 /**
 * 判断是否输入完成,输入完成后调用callback
 */
 void ensureFinishInput() {
 if (result.size() == count && inputCallBack != null) {//输入完成
  StringBuffer sb = new StringBuffer();
  for (String i : result) {
  sb.append(i);
  }
  inputCallBack.onInputFinish(sb.toString());
 }
 }

 /**
 * 获取输入文字
 *
 * @return
 */
 public String getInputText() {
 if (result.size() == count) {
  StringBuffer sb = new StringBuffer();
  for (String i : result) {
  sb.append(i);
  }
  return sb.toString();
 }
 return null;
 }
}

十.支付弹出层

public class PayFragment extends DialogFragment implements View.OnClickListener {

 public static final String EXTRA_CONTENT = "extra_content"; //提示框内容
 public static final String EXTRA_CONTENT2 = "extra_content2"; //提示框内容
 public static final String EXTRA_CONTENT3 = "extra_content3"; //提示框内容

 private PayPassWordView psw_input;
 private PayPassWordView.InputCallBack inputCallBack;

 @NonNull
 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
 // 使用不带Theme的构造器, 获得的dialog边框距离屏幕仍有几毫米的缝隙。
 Dialog dialog = new Dialog(getActivity(), R.style.BottomDialog);
 dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置Content前设定
 dialog.setContentView(R.layout.fragment_pay);
 dialog.setCanceledOnTouchOutside(true); //外部点击取消
 // 设置宽度为屏宽, 靠近屏幕底部。
 final Window window = dialog.getWindow();
 window.setWindowAnimations(R.style.AnimBottom);
 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
 final WindowManager.LayoutParams lp = window.getAttributes();
 lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度持平
 lp.gravity = Gravity.TOP;
 window.setAttributes(lp);
 initView(dialog);
 return dialog;
 }

 private void initView(Dialog dialog) {
 Bundle bundle = getArguments();
 if (bundle != null) {
  TextView tv_content = (TextView) dialog.findViewById(R.id.tv_content);
  TextView tv_content2 = (TextView) dialog.findViewById(R.id.tv_content2);
  TextView tv_content3 = (TextView) dialog.findViewById(R.id.tv_content3);
  tv_content.setText(bundle.getString(EXTRA_CONTENT));
  tv_content2.setText(bundle.getString(EXTRA_CONTENT2));
  tv_content3.setText(bundle.getString(EXTRA_CONTENT3));
 }
 psw_input = (PayPassWordView) dialog.findViewById(R.id.payPwdView);
 PassWordInputView inputMethodView = (PassWordInputView) dialog.findViewById(R.id.inputMethodView);
 psw_input.setInputMethodView(inputMethodView);
 psw_input.setInputCallBack(inputCallBack);
 dialog.findViewById(R.id.iv_close).setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
  case R.id.iv_close:
  dismiss();
  break;
 }
 }

 /**
 * 设置输入回调
 *
 * @param inputCallBack
 */
 public void setPaySuccessCallBack(PayPassWordView.InputCallBack inputCallBack) {
 this.inputCallBack = inputCallBack;
 }

}

十一.逻辑代码中直接引用

public class MainActivity extends AppCompatActivity implements PayPassWordView.InputCallBack, View.OnClickListener {

 private PayFragment fragment;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 findViewById(R.id.btn_pay).setOnClickListener(this);
 }

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
  case R.id.btn_pay:
  Bundle bundle = new Bundle();
  bundle.putString(PayFragment.EXTRA_CONTENT, "提现");
  bundle.putString(PayFragment.EXTRA_CONTENT2, "¥" + 1.00);
  bundle.putString(PayFragment.EXTRA_CONTENT3, "额外扣除0.1手续费");
  fragment = new PayFragment();//创建支付弹出框实例
  fragment.setArguments(bundle);//传递信息
  fragment.setPaySuccessCallBack(MainActivity.this);//设置回调
  fragment.show(getSupportFragmentManager(), "Pay");
  break;
 }
 }

 @Override
 public void onInputFinish(String result) {
 Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
 fragment.dismiss();//窗口消失
 }
}

啥都没有,只有一个点击事件而已.

分享结束,这里面的代码可是有我造假的成分哦,不过,我就是喜欢将优秀的东西集成在一起,谢谢观看!

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

(0)

相关推荐

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

    像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现这个功能. 老样子,投篮需要找准角度,变成需要理清思路.对于这个"小而美"的控件,我们思路应该这样子. Ⅰ.将要输入密码数量动态通过代码加载出来. Ⅱ.利用Gridview模拟产生一个输入数字键盘,并且按照习惯从屏幕底部弹出来. Ⅲ.对输入数字键盘进行事件监听,将这个输入数字填入到这个密码框中,并且当您输入密码长度一致的时候,进行事件回调. 这个思维导图应该是这样的: 首先,我们要根据需求动态加

  • Android仿支付宝微信支付密码界面弹窗封装dialog

    一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外框是用的一个有stroke属性的shape, (2),1-9数字是用的recycleview ,每个item的底部和右边有1dp的黑线,填充后形成分割线. (3),recycleview 要设置属性  android:overScrollMode=&quo

  • Android仿微信支付密码弹出层功能

    预览 使用 这个弹出层是一个DialogFragment,逻辑都封装在其内部,使用起来很简单: Bundle bundle = new Bundle(); bundle.putString(PayFragment.EXTRA_CONTENT, "提现:¥ " + 100.00); PayFragment fragment = new PayFragment(); fragment.setArguments(bundle); fragment.setPaySuccessCallBack(

  • android仿微信支付宝的支付密码输入框示例

    大家好,我是狸小华,萌汉子一枚.今天给大家带来的是仿微信/支付宝的密码输入框.这个效果也出来有一段时间了,所以搜索一下还是有不少的网友实现,但是,但是!经过一番查看后,我发现他们的实现分为两大类. 一,直接继承EditText,然后在ondraw里面做文章:二,EditText外面包一个viewGroup.我不喜欢这两种实现方式,觉着有些臃肿了,所以我详细介绍下我的实现方式:直接继承View,获取用户的输入,然后draw出来. 我们实现的是上面的密码输入框,这个键盘...系统自带的哦,调用用户输

  • android仿支付宝、微信密码输入框效果

    本文实例为大家分享了android密码输入框效果展示的具体代码,供大家参考,具体内容如下 老规矩,先看效果:这是现在商城类app中很常见的支付密码效果,首先说下这个不是自定义控件,是github上的开源库: https://github.com/Jungerr/GridPasswordView 下面主要说下这个开源库的用法和平时我们常用的几点功能: 想要使用这个开源库首先我们需要将库导入到咱们的项目中: 直接在app的build.gradle下添加如下代码 dependencies { comp

  • Android仿微信/支付宝密码输入框

    在用到支付类app时,都有一个简密的输入框..开始实现的时候思路有点问题,后来到github上搜了下,找到了一个开源的库看起来相当的牛逼,,来个地址先: https://github.com/Jungerr/GridPasswordView 效果图: 这个开源库我研究了之后,又有了自己的一个思路:来个假的简密框---底部放一个EditTextView,顶部放置6个ImageView的原点,控制他们的显隐来实现这个简密宽 开发步骤: 1 布局 <?xml version="1.0"

  • Android仿微信或支付宝方块密码输入框

    在用到支付类或者验证类app时,都有一个简密的输入框.百度了下有个不错的帖子,点击打开链接 不过自己也写了个简单的类似的. 懒得运行,直接截layout.xml的效果图先. 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wr

  • Android自定义View实现微信支付密码输入框

    本文实例为大家分享了Android实现微信支付密码输入框的具体代码,供大家参考,具体内容如下 效果图 项目中使用到了支付密码功能,其实这类界面是比较常用的,涉及支付密码的输入的一般都会用到对的,所以单独地把这部分抽取出来,有需要的朋友可以拿去用哈! 效果就是支付,弹出密码框,输入密码,这个过程密码不可见,并且提供一个输入完毕的监听! 这个弹出层呢,其实就是一个DialogFragment,逻辑封装在其内部 一.弹出层进出动画 (anim文件) push_bottom_in.xml <?xml v

  • Android自定义View实现支付宝支付成功-极速get花式Path炫酷动画

    本文手把手教你图片->SVG->Path的姿势.. 从此酷炫Path动画,如此简单. 效果先随便上几个图,以后你找到的图有多精彩,gif就有多精彩: 随便搜了一个铅笔画的图,丢进去 随手复制的二维码icon 来自大佬wing的铁塔 前文回顾 这里简单回顾一下前文,GIF如下图: PathAnimView接受的唯一数据源是Path(给我一个Path,还你一个动画View) 所以内置了几种将别的资源->Path的方法: 直接传string.(A-Z,0-9 "." &qu

  • Android 自定义view仿微信相机单击拍照长按录视频按钮

    Android仿微信相机的拍照按钮单击拍照,长按录视频.先上效果图. 项目地址:https://github.com/c786909486/PhotoButton2/tree/v1.0 添加依赖 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile compile 'com.github.c786909486:PhotoButton2:v1.1' } 长按效果分

  • Android自定义view仿微信刷新旋转小风车

    本文实例为大家分享了Android仿微信刷新旋转小风车 具体代码,供大家参考,具体内容如下 不太会录像,没办法,智能截图了 不多说了,直接上代码 package com.shipneg.demoysp.demo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.

  • Android自定义View实现微信语音界面

    前言 因为最近的项目需要使用录音功能,开始的想法是Button+OnTouchListener+Dialog实现,在大部分手机中都没问题,只有MI8会偶尔无法触发MotionEvent.ACTION_UP,导致程序异常.所以就自己写了个自定义View来实现,主要也是通过监听 OnTouchListener+Dialog来实现.这里只实现了自定义View,并不涉及录音和播放.效果图如下: 代码 代码并不复杂,配合注释应该很容易理解. /** * Author : BlackHao * Time :

  • Android自定义View仿微信LetterView效果

    废话不多说了,具体代码如下所示: public class LetterView extends View { private String TAG = LetterView.class.getSimpleName(); //A,B,C....Z,# public List<String> letters; private Paint mPaint; private int selectPosition = -1; private TextView mLetter; public void s

  • Android自定义View仿支付宝输入六位密码功能

    跟选择银行卡界面类似,也是用一个PopupWindow,不过输入密码界面是一个自定义view,当输入六位密码完成后用回调在Activity中获取到输入的密码并以Toast显示密码.效果图如下: 自定义view布局效果图及代码如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android编程实现的微信支付功能详解【附Demo源码下载】

    本文实例讲述了Android编程实现的微信支付功能.分享给大家供大家参考,具体如下: 最近公司弄Ionic框架,项目中需要微信支付,无奈,把我调过去弄,期间也是几近崩溃,好在皇天不负有心人,在看别人的文档,终于是在项目中集成了微信支付,下面作为一个小白的我,想要把我的经验分享给大家,希望对大家有所帮助. 先给一个可用的demo吧(运行前先看txt文件) demo代码点击此处本站下载. 这个demo是基于eclipse开发的,博主也在Android Studio开发过微信支付,原理都是一样的,大家

  • Android 自定义View实现芝麻分曲线图效果

    1.简介 其实这个效果几天之前就写了,但是一直没有更新博客,本来想着把芝麻分雷达图也做好再发博客的,然后今天看到鸿洋的微信公众号有朋友发了芝麻分的雷达图,所以就算了,算是一个互补吧.平时文章也写的比较少,所以可能有点杂乱,有什么需要改进的地方欢迎给出建议,不胜感激. 效果图: 2.步骤: 初始化View的属性 初始化画笔 绘制代表最高分和最低分的两根虚线 绘制文字 绘制代表月份的属性 绘制芝麻分折线 绘制代表芝麻分的圆点 绘制选中分数的悬浮文字以及背景 处理点击事件 3.编码: 初始化View属

  • Android自定义TextView仿微信朋友圈文字展开全文功能

    Android自定义TextView仿微信朋友圈文字信息,展开全文功能 代码及注释如下: 首先写一个xml文件 showmore.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical

随机推荐