由于最近项目要用到指纹设置功能,在个人设置模块中打开 即可。接到产品工程师的UI设计,感觉用android源生控件做起来比较麻烦,所以在网上找了个视觉效果还行的view。勉强用上了。 效果图如下:
结合业务及程序安全,所实现的不仅仅是选择关闭或开启,具体我参照了支付宝上的指纹支付开启功能设置流程,所以就准备仿照做类似的操作。开发过程中遇到了一个问题,也就是我为什么要写这个笔记帮自己回顾这个过程,同时如果会有人遇到类似的问题一时没有找到好的解决方法提供参考。遇到的问题:当监听组件状态变更时,如果取消了操作,视图不能重新回到原状态。场景:默认是开启状态,当选择关闭会弹出对话框提示是否执行操作,弹出对话框的触发是在开关状态发生变更时才会触发的,即是一种观察者模式,当触发了事件,但用户又取消了操作,所以需要让组件重新回到最开始状态。
源生控件check、switch都能够实现这种效果,但是自定控件没有生效。 相关源代码如下: public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); notifyViewAccessibilityStateChangedIfNeeded( AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); // Avoid infinite recursions if setChecked() is called from a listener if (mBroadcasting) { return; } mBroadcasting = true; if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mChecked); } if (mOnCheckedChangeWidgetListener != null) { mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked); } mBroadcasting = false; } }
所以当状态变更时,需要通知观察者去执行相应的操作: mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);
自定义控件上: public void setDefaultStatus(boolean checked) { if (NowChoose != checked) { NowChoose = checked; if (changeListener != null) { changeListener .OnChanged(NowChoose); } } } 最后发现,加上了相关操作,还是没有实现效果,最后发现问题是出在没有对控件进行重绘操作; 由于自定义控件的滑动事件利用Canvas进行相关操作,伴随着滑动控件区域显示发生了变化,所以需要重新绘制。 最后代码如下: public void setDefaultStatus(boolean checked) { if (NowChoose != checked) { NowChoose = checked; if (ChgLsn != null) { ChgLsn.OnChanged(NowChoose); invalidate(); // 改变状态后,需要重绘 } } }