android文本框左右加減按鈕長按一直加減

   來講說今天的戰績吧,說是戰績,是由於今天寫代碼時效率挺高,多是由於集中精力吧,因此,若是要寫好程序的話,最好知足如下兩點:
 一、寫程序前想好畫好步驟圖;
 二、集中精力,別一心二用;
 
   而後來看看今天要說的,就是下面這個小功能,可以快速增長減少文本框裏的值,這裏看似簡單,但在過程當中也遇到了幾個問題,下面就一一來講。 java

 
 一、最主要的問題:長按事件並非咱們想要的
  android

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專門用於解決大小數(大分數)的一個類,它支持任何精度的定點數,所以,咱們的加減法能夠寫成:
 
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")))
 + "");


  個人博客的其餘文章列表
  http://my.oschina.net/helu
相關文章
相關標籤/搜索