來講說今天的戰績吧,說是戰績,是由於今天寫代碼時效率挺高,多是由於集中精力吧,因此,若是要寫好程序的話,最好知足如下兩點:
一、寫程序前想好畫好步驟圖;
二、集中精力,別一心二用;
而後來看看今天要說的,就是下面這個小功能,可以快速增長減少文本框裏的值,這裏看似簡單,但在過程當中也遇到了幾個問題,下面就一一來講。 java
一、最主要的問題:長按事件並非咱們想要的
android
findViewById(R.id.test).setOnLongClickListener( new OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.e("", "onLongClick"); return true; } });
//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專門用於解決大小數(大分數)的一個類,它支持任何精度的定點數,所以,咱們的加減法能夠寫成:
ide
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"))) + "");