前言:之前开发涉及到三原色的渐变效果,然后自个根据进制之间的转换与三原色结合,写了个工具类,希望大家做到这块需求时可以帮助到大家。
根据源码自己封装的十进制、二进制、十六进制转换工具类:
/**
* 说明:进制转换帮助类
* 作者:黄伟财 日期:2016-3-12
*/
public class SysConvertHelp {
/**
* 获取三原色字符串中红绿蓝对应的整数值
* @param hStr
* @return
*/
public int[] getHSubValue(String hStr){//# ff ee dd
int[] hSubs = new int[3];
//存放色值字符串的三原色对应的红绿蓝整数值
hSubs[0] = Integer.valueOf(toD(hStr.substring(1, 3), 16));
hSubs[1] = Integer.valueOf(toD(hStr.substring(3, 5), 16));
hSubs[2] = Integer.valueOf(toD(hStr.substring(5, 7), 16));
return hSubs;
}
/**
* 十进制--->二进制 Integer.toBinaryString(a)
* 十进制--->十六进制 Integer.toHexString(a)
* 任意进制数转为十进制数,注意:十进制都其他进制相互转换的中转进制
*/
public String toD(String num, int onsetSystem) {
int r = 0;
for (int i = 0; i < num.length(); i++) { // 计算X的Y次方
// 结果就是,任意进制转成十进制的值
r = (int) (r + formatting2Num(num.substring(i, i + 1))
* Math.pow(onsetSystem, num.length() - i - 1));
}
return String.valueOf(r);
}
/**
* 十进制转十六进制
* @return
*/
public String toH(int dNum){
return Integer.toHexString(dNum);
}
/**
* 十进制转二进制
* @return
*/
public String toB(int dNum){
return Integer.toBinaryString(dNum);
}
/** 将十六进制中的字母转为对应的数字 */
public int formatting2Num(String numStr) {
int i = 0;
//匹配十进制以内的数字
for (int u = 0; u < 10; u++) {
if (numStr.equals(String.valueOf(u))) {
i = u;
}
}
if (numStr.equals("a") || numStr.equals("A")) {
i = 10;
}
if (numStr.equals("b") || numStr.equals("B")) {
i = 11;
}
if (numStr.equals("c") || numStr.equals("C")) {
i = 12;
}
if (numStr.equals("d") || numStr.equals("D")) {
i = 13;
}
if (numStr.equals("e") || numStr.equals("E")) {
i = 14;
}
if (numStr.equals("f") || numStr.equals("F")) {
i = 15;
}
return i;
}
private static SysConvertHelp sysConvertHelp;
//控制实例入口在getInstance方法中
private SysConvertHelp() {
}
//唯一实例入口
public static SysConvertHelp getInstance() {
if (null == sysConvertHelp) {
synchronized (SysConvertHelp.class) {
if (null == sysConvertHelp) {//确保单一实例
sysConvertHelp = new SysConvertHelp();
}
}
}
return sysConvertHelp;
}
}
源码案例:
public class MainActivity extends Activity implements OnClickListener {
public RadioButton two, ten, sixteen;
public Button[] buttons = new Button[16];
public Button backbButton, cleanButton;
public EditText econtent;
int jinzhi = 1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
econtent = (EditText) findViewById(R.id.Econtent);
two = (RadioButton) findViewById(R.id.radio0);
ten = (RadioButton) findViewById(R.id.radio1);
sixteen = (RadioButton) findViewById(R.id.radio2);
two.setOnClickListener(this);
ten.setOnClickListener(this);
sixteen.setOnClickListener(this);
backbButton = (Button) findViewById(R.id.backspace);
cleanButton = (Button) findViewById(R.id.clean);
buttons[0] = (Button) findViewById(R.id.b0);
buttons[1] = (Button) findViewById(R.id.b1);
buttons[2] = (Button) findViewById(R.id.b2);
buttons[3] = (Button) findViewById(R.id.b3);
buttons[4] = (Button) findViewById(R.id.b4);
buttons[5] = (Button) findViewById(R.id.b5);
buttons[6] = (Button) findViewById(R.id.b6);
buttons[7] = (Button) findViewById(R.id.b7);
buttons[8] = (Button) findViewById(R.id.b8);
buttons[9] = (Button) findViewById(R.id.b9);
buttons[10] = (Button) findViewById(R.id.b10);
buttons[11] = (Button) findViewById(R.id.b11);
buttons[12] = (Button) findViewById(R.id.b12);
buttons[13] = (Button) findViewById(R.id.b13);
buttons[14] = (Button) findViewById(R.id.b14);
buttons[15] = (Button) findViewById(R.id.b15);
for (int i = 0; i < buttons.length; i++) {
buttons[i].setOnClickListener(this);
}
backbButton.setOnClickListener(this);
cleanButton.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
int a = 0;
//二进制
if (arg0 == two) {
if (jinzhi == 1) {
a = Integer.valueOf(econtent.getText().toString());
econtent.setText(Integer.toBinaryString(a));
}
if (jinzhi == 2) {
econtent.setText(HToB(econtent.getText().toString()));
}
jinzhi = 0;
for (int i = 0; i < 16; i++) {
if (i < 2) {
buttons[i].setEnabled(true);
} else {
buttons[i].setEnabled(false);
}
}
}
//十进制
if (arg0 == ten) {
if (jinzhi == 2) {
econtent.setText(toD(econtent.getText().toString(), 16));
}
if (jinzhi == 0) {
econtent.setText(toD(econtent.getText().toString(), 2));
}
jinzhi = 1;
for (int i = 0; i < 16; i++) {
if (i < 10) {
buttons[i].setEnabled(true);
} else {
buttons[i].setEnabled(false);
}
}
}
//十六进制
if (arg0 == sixteen) {
if (jinzhi == 1) {
a = Integer.valueOf(econtent.getText().toString());
econtent.setText(Integer.toHexString(a));
}
if (jinzhi == 0) {
econtent.setText(BToH(econtent.getText().toString()));
}
jinzhi = 2;
for (int i = 0; i < 16; i++) {
if (i < 16) {
buttons[i].setEnabled(true);
} else {
buttons[i].setEnabled(false);
}
}
}
//btn事件
for (int i = 0; i < buttons.length; i++) {
//选中的某个btn
if (arg0 == buttons[i]) {
String aString = econtent.getText().toString();
if (aString.equals("0")) {
//输入框为0时,直接显示(针对字母做些处理)
econtent.setText(formattingH(i));
} else {
//输入框拼接字符串
econtent.setText(aString + formattingH(i));
}
}
}
//回退
if (arg0 == backbButton) {
String scontent = econtent.getText().toString();
if (scontent.length() > 1) {
//截取前面部分,效果就是删除最后一位
econtent.setText(scontent.substring(0, scontent.length() - 1));
}else{
econtent.setText("0");
}
}
//清空,直接设置为0
if (arg0 == cleanButton) {
econtent.setText("0");
}
}
/**十六进制转二进制*/
public String HToB(String a) {
String b = Integer.toBinaryString(Integer.valueOf(toD(a, 16)));
return b;
}
/**二进制转十六进制*/
public String BToH(String a) {
// 将二进制转为十进制再从十进制转为十六进制
String b = Integer.toHexString(Integer.valueOf(toD(a, 2)));
return b;
}
/**任意进制数转为十进制数,注意:十进制都其他进制相互转换的中转进制*/
public String toD(String a, int onsetSystem) {
int r = 0;
for (int i = 0; i < a.length(); i++) { //计算X的Y次方
//结果就是,任意进制转成十进制的值
r = (int) (r + formatting(a.substring(i, i + 1)) * Math.pow(onsetSystem, a.length() - i - 1));
}
return String.valueOf(r);
}
/**将十六进制中的字母转为对应的数字*/
public int formatting(String a) {
int i = 0;
//匹配十进制以内的数字
for (int u = 0; u < 10; u++) {
if (a.equals(String.valueOf(u))) {
i = u;
}
}
if (a.equals("a")) {
i = 10;
}
if (a.equals("b")) {
i = 11;
}
if (a.equals("c")) {
i = 12;
}
if (a.equals("d")) {
i = 13;
}
if (a.equals("e")) {
i = 14;
}
if (a.equals("f")) {
i = 15;
}
return i;
}
/**将十进制中的数字转为十六进制对应的字母*/
public String formattingH(int a) {
String i = String.valueOf(a);//转出字符串
if (a == 10) {
i = "a";
}
if (a == 11) {
i = "b";
}
if (a == 12) {
i = "c";
}
if (a == 13) {
i = "d";
}
if (a == 14) {
i = "e";
}
if (a == 15) {
i = "f";
}
return i;
}
}
注意:
任意进制之间的转换都需要通过十进制作为中转进制,该进制—>十进制—>目标进制
小结:系统封装了十进制转任意进制的API,所以进制之间的转换,其实就是和十进制之间的转换,toD方法实现了任意进制转十进制
十进制—>二进制
Integer.toBinaryString(a)
十进制—>十六进制
Integer.toHexString(a)
Math.pow(x, y) 计算X的Y次方