来说说今天的战绩吧,说是战绩,是因为今天写代码时效率挺高,可能是因为集中精力吧,所以,如果要写好程序的话,最好满足以下两点:
1、写程序前想好画好步骤图;
2、集中精力,别一心二用;
然后来看看今天要说的,就是下面这个小功能,能够快速增加减小文本框里的值,这里看似简单,但在过程中也遇到了几个问题,下面就一一来说。
1、最主要的问题:长按事件并不是我们想要的
findViewById(R.id.test).setOnLongClickListener(
new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Log.e("", "onLongClick");
return true;
}
});
长按着test按钮,你会发现,控制台并不会一直打印出onLongClick,这也没什么奇怪的OnLongClickListener只是长按后出发的一个事件,这个事件一直到松开手,在按下,长按,松手这个
过程只会触发OnLongClickListener一次,你想啊,用过智能机的都知道,长按文件夹移动,文件夹会跟着你跑,如果会触发很多次,那不是会弹出很多个文件夹来吗。。。
所以,要实现长按让它连续加减值,OnLongClickListener事件对我们是没用的,在android有个onTouch(View v, MotionEvent event)事件,它有两个参数View v, MotionEvent event,相信大家都知道这是什么意思,所以。。。。 有想法了没,哈哈
在这里贴上主要代码:
//Touch事件
class CompentOnTouch implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
//这是btnMius下的一个层,为了增强易点击性
case R.id.linearBtnMius:
onTouchChange("mius", event.getAction());
break;
//这里也写,是为了增强易点击性
case R.id.btnMius:
onTouchChange("mius", event.getAction());
break;
case R.id.linearBtnPlus:
onTouchChange("plus", event.getAction());
break;
case R.id.btnPlus:
onTouchChange("plus", event.getAction());
break;
}
return true;
}
}
private void onTouchChange(String methodName, int eventAction) {
//按下松开分别对应启动停止减线程方法
if ("mius".equals(methodName)) {
if (eventAction == MotionEvent.ACTION_DOWN) {
miusThread = new MiusThread();
isOnLongClick = true;
miusThread.start();
} else if (eventAction == MotionEvent.ACTION_UP) {
if (miusThread != null) {
isOnLongClick = false;
}
} else if (eventAction == MotionEvent.ACTION_MOVE) {
if (miusThread != null) {
isOnLongClick = true;
}
}
}
//按下松开分别对应启动停止加线程方法
else if ("plus".equals(methodName)) {
if (eventAction == MotionEvent.ACTION_DOWN) {
plusThread = new PlusThread();
isOnLongClick = true;
plusThread.start();
} else if (eventAction == MotionEvent.ACTION_UP) {
if (plusThread != null) {
isOnLongClick = false;
}
} else if (eventAction == MotionEvent.ACTION_MOVE) {
if (plusThread != null) {
isOnLongClick = true;
}
}
}
}
//减操作
class MiusThread extends Thread {
@Override
public void run() {
while (isOnLongClick) {
try {
Thread.sleep(200);
myHandler.sendEmptyMessage(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
}
}
}
//加操作
class PlusThread extends Thread {
@Override
public void run() {
while (isOnLongClick) {
try {
Thread.sleep(200);
myHandler.sendEmptyMessage(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
}
}
}
//更新文本框的值
Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
if (miusEnable) {
buttonHolder.input.setText((new BigDecimal(
buttonHolder.input.getText().toString())
.subtract(new BigDecimal("0.1")))
+ "");
}
break;
case 2:
if (plusEnable) {
buttonHolder.input.setText((new BigDecimal(
buttonHolder.input.getText().toString())
.add(new BigDecimal("0.1")))
+ "");
}
break;
}
setBtnEnable();
};
};
//超出最大最小值范围按钮的可能与不可用
private void setBtnEnable() {
if (new BigDecimal(buttonHolder.input.getText().toString())
.compareTo(new BigDecimal(minvalue + "")) > 0) {
miusEnable = true;
buttonHolder.btnMius
.setBackgroundResource(R.drawable.nurse_symp_mius);
} else {
miusEnable = false;
buttonHolder.btnMius
.setBackgroundResource(R.drawable.nurse_symp_mius_max);
}
if (new BigDecimal(buttonHolder.input.getText().toString())
.compareTo(new BigDecimal(maxvalue + "")) < 0) {
plusEnable = true;
buttonHolder.btnPlus
.setBackgroundResource(R.drawable.nurse_symp_plus);
} else {
plusEnable = false;
buttonHolder.btnPlus
.setBackgroundResource(R.drawable.nurse_symp_plus_max);
}
}
看完上面代码你一定会觉得,怎么没有单击事件,我单击也可以增加减小文本框的值嘛,哈哈,单击事件已经合并在Touch事件里啦,单击也是要按下弹起的不是么,至此最大的问题就解决了,这个还有个小问题,因为文本框里的值都是小数,如果你直接35.5-0.1,35.5-0.2,35.5-0.3 ... ...,你会发现会得到类似35.29999999904这些类似的情况,这里大概是因为计算机进行二进制分数运算时,造成了不够精度的bug,这里,我们可以使用BigDecimal,它是java专门用于解决大小数(大分数)的一个类,它支持任何精度的定点数,因此,我们的加减法可以写成:
buttonHolder.input.setText((new BigDecimal(
buttonHolder.input.getText().toString())
.subtract(new BigDecimal("0.1")))
+ "");
buttonHolder.input.setText((new BigDecimal(
buttonHolder.input.getText().toString())
.add(new BigDecimal("0.1")))
+ "");