展会信息港展会大全

android文本框左右加减按钮长按一直加减
来源:互联网   发布日期:2016-01-06 19:14:34   浏览:11071次  

导读:1、写程序前想好画好步骤图;2、集中精力,别一心二用; 然后来看看今天要说的,就是下面这个小功能,能够快速增加减小文本框里的值,这里看似简单,但在过程中也遇到了几个问题,下面就一一来说。1、最主要的问 ...

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")))

+ "");

赞助本站

人工智能实验室

相关热词: 长按 文本框 android

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港