android文本框左右加减按钮长按一直加减

   来说说今天的战绩吧,说是战绩,是因为今天写代码时效率挺高,可能是因为集中精力吧,所以,如果要写好程序的话,最好满足以下两点:
 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")))
 + "");
  
  
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值