为什么80%的码农都做不了架构师?>>>
来说说今天的战绩吧,说是战绩,是因为今天写代码时效率挺高,可能是因为集中精力吧,所以,如果要写好程序的话,最好满足以下两点:
1、写程序前想好画好步骤图;
2、集中精力,别一心二用;
然后来看看今天要说的,就是下面这个小功能,能够快速增加减小文本框里的值,这里看似简单,但在过程中也遇到了几个问题,下面就一一来说。
1、最主要的问题:长按事件并不是我们想要的
findViewById(R.id.test).setOnLongClickListener(new OnLongClickListener() {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void run() {while (isOnLongClick) {try {Thread.sleep(200);myHandler.sendEmptyMessage(1);} catch (InterruptedException e) {e.printStackTrace();}super.run();}}}//加操作class PlusThread extends Thread {@Overridepublic 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")))+ "");
我的博客的其他文章列表
http://my.oschina.net/helu