效果圖這樣:
上面是要展示屬性的自定義View,下面的佈局就是我自己寫的屬性控制佈局,添加各類控件組都只需要一行代碼,像這樣:
acl.addSeekBar("寬度", 20, 80, 300, value -> btn2.setWidth(value))
.addSeekBar("高度", 10, 20, 60, value -> btn2.setHeight(value))
.addSeekBar("邊框寬度", 0, 1, 5, value -> changeStrokeWidth(value))
.addSeekBar("Radius", 0, 15, 30, value -> btn2.setRadius(value))
.addRadioGroup("背景顏色", new String[]{"Normal", "Pressed", "Disable"}, -1, position -> {
state = position;
currAdjustAttribute = "BackgroundColor";
})
.addRadioGroup("邊框顏色", new String[]{"Normal", "Pressed", "Disable"}, -1, position -> {
state = position;
currAdjustAttribute = "StrokeColor";
})
.addRadioGroup("文字顏色", new String[]{"Normal", "Pressed", "Disable"}, -1, position -> {
state = position;
currAdjustAttribute = "TextColor";
})
.addCheckBoxGroup("使能", new String[]{"Enable/Disable"}, new int[]{0}, false, (position, state) -> {
btn2.setEnabled(state);
isEnable = !isEnable;
})
.addColorSeekBar("顏色", color -> {
switch (currAdjustAttribute) {
case "BackgroundColor":
if (state == 0)
btn2.setNormalBackgroundColor(color);
else if (state == 1)
btn2.setPressedBackgroundColor(color);
else if (state == 2)
btn2.setUnableBackgroundColor(color);
break;
case "StrokeColor":
if (state == 0)
btn2.setNormalStrokeColor(color);
else if (state == 1)
btn2.setPressedStrokeColor(color);
else if (state == 2)
btn2.setUnableStrokeColor(color);
break;
case "TextColor":
if (state == 0)
btn2.setNormalTextColor(color);
else if (state == 1)
btn2.setPressedTextColor(color);
else if (state == 2)
btn2.setUnableTextColor(color);
break;
}
});
實際應用的時候,把監聽處理封裝成函數調用,結構就會很清晰.目前只有CheckBox,RadioButton,SeekBar,ColorSeekBar,Spinner這些控件可以添加,日後如有需求,可以仿照着添加新的控件.
這個調節顏色的SeekBar實現比較複雜,我就不加到源碼文件中了,你如果知道有輕量級的實現,請留言.
源碼在這兒,1分混口飯吃.