ToggleButton、Switch、CheckBox小结

关于Switch、ToggleButton、CheckBox小结

  • 背景
  • 应用场景
  • 事件回调机制及重绘

背景

由于最近项目要用到指纹设置功能,在个人设置模块中打开 即可。接到产品工程师的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(); // 改变状态后,需要重绘
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值