public abstract class Selector extends FrameLayout implements View.OnClickListener {
public Selector(Context context) {
super(context);
initView(context, null);
}
public Selector(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context, attrs);
}
public Selector(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context, attrs);
}
private void initView(Context context, AttributeSet attrs) {
//实现特性1:可点击
this.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//实现特性2:点击后改变选中状态
boolean isSelect = switchSelector();
}
//反转选中状态
public boolean switchSelector() {
boolean isSelect = this.isSelected();
this.setSelected(!isSelect);
return !isSelect;
}
}
为满足业务场景,需要新增附加特性:可自定义按钮内元素相对布局
附加特性会随着业务需求变化而变化,可以用模版方法模式
将这层变化封装起来:由Selector
定义初始化算法框架,将真正界面初始化延后到子类进行。
- 虽然这次业务场景中,单选按钮元素的布局是:图片在上,文字在下。下次换了咋办?所以定义元素布局应该作为一个抽象函数交给
Selector
子类实现。 - 为了实现选中的渐变效果,
Selector
需提供选项变更的时机。 - 按钮包含一些基本的属性,比如按钮名称,按钮图标,将这些属性写成自定义属性并传递给子类解析,代码如下:
public abstract class Selector extends FrameLayout implements View.OnClickListener {
public Selector(Context context) {
super(context);
initView(context, null);
}
p