android安卓 按住button连续增加
相关知识:
Timer
延迟时间,间隔时间,重复执行
参考http://www.cnblogs.com/xuling/archive/2011/06/06/2073864.html
publicclasste{staticinti=1;publicstaticvoidmain(String[]args){Timertimer=newTimer();timer.schedule(newMyTask(),1000,1000);}staticclassMyTaskextendsTimerTask{publicvoidrun(){System.out.println("________________"+(i++)+"______________");}}}
实现了按住界面上的button后,TextView每隔一秒连续增加。抬起后,停止。
packagecom.myapp.androidtest2;importjava.util.Timer;importjava.util.TimerTask;importandroid.app.Activity;importandroid.os.Bundle;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.view.View.OnTouchListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassMainActivityextendsActivity{privateButtonmButton;staticTextViewmTextView;staticinti=1;Timertimer;/**Calledwhentheactivityisfirstcreated.*/publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//如果是字switch就设置OnTouchLisennerButtonListenerb=newButtonListener();mButton=(Button)findViewById(R.id.button);mButton.setOnClickListener(b);mButton.setOnTouchListener(b);mTextView=(TextView)findViewById(R.id.textview);}staticclassMyTaskextendsTimerTask{publicvoidrun(){Messagemessage=newMessage();message.what=1;mHandler.sendMessage(message);}}privatestaticHandlermHandler=newHandler(){//接收到消息后处理publicvoidhandleMessage(Messagemsg){switch(msg.what){case1:mTextView.setText(""+(i++));System.out.println("i="+i);break;}super.handleMessage(msg);}};classButtonListenerimplementsOnClickListener,OnTouchListener{publicvoidonClick(Viewv){if(v.getId()==R.id.button){i=i+3;mTextView.setText(""+i);System.out.println("i="+i);System.out.println("cansalbutton--->click");}}//你需要复写onTouch事件,需要开启一个线程sleep1秒执行加一操作,更新数据需要放到ui线程里面。//停止的时候可以直接跳出线程breakpublicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN://只要当down返回true时候,系统将不把本次事件记录为点击事件,也就不会触发onClick或者onLongClick事件了timer=newTimer(true);timer.schedule(newMyTask(),1000,1000);System.out.println("开始循环");break;caseMotionEvent.ACTION_UP:System.out.println("++++++key_UP");timer.cancel();timer.purge();timer=null;System.out.println("结束循环");break;caseMotionEvent.ACTION_CANCEL:System.out.println("++++++key_CANCEL");timer.cancel();timer.purge();timer=null;System.out.println("结束循环");break;}returntrue;//返回false表示该aciton未被touch消耗//返回true表示该aciton被touch消耗,其他的人都收不到该aciton}}}
参考文章:
http://www.cnblogs.com/xzf158/archive/2009/09/04/1560042.html
http://alex-yang-xiansoftware-com.iteye.com/blog/1958905
http://www.android100.org/html/201409/12/64378.html
http://www.linuxidc.com/Linux/2011-10/45976.htm
这里注意的一点,话费了一下午的时间才明白过来的问题:
classButtonListenerimplementsOnClickListener,OnTouchListener{
这句代码,一定要同时继承两个监听者,返回return 设为flase后就可以实现click和touch同时共存。
错误一:分别设置两个继承类监听click和touch
classButtonListener1implementsOnClickListener
classButtonListener2implementsOnTouchListene
会出现touch抬起时调用onclick方法,多运行了onclick中的内容。
08-2406:47:47.949:I/System.out(4710):i=1008-2406:47:48.311:I/System.out(4710):i=1108-2406:47:48.642:I/System.out(4710):i=1208-2406:47:48.838:I/System.out(4710):++++++key_UP08-2406:47:48.838:I/System.out(4710):timer取消了08-2406:47:48.859:I/System.out(4710):cansalbutton--->click
错误二:返回值为true
Timertimer;publicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:timer=newTimer(true);System.out.println("++++++key_down");timer.schedule(newMyTask(),1000,300);break;caseMotionEvent.ACTION_UP:System.out.println("++++++key_UP");timer.cancel();timer.purge();timer=null;break;caseMotionEvent.ACTION_CANCEL:System.out.println("++++++key_CANCEL");timer.cancel();timer.purge();timer=null;break;}returntrue;}
当touch和click同时都有的时候,系统优先touch接收到action动作,返回值为true表明告诉系统:此次动作我消耗了,不要继续给其他人了。返回值设为false时,touch处理完后,click才会接收到该次action。
这样使得touch和click可以同时共存。
关于Button的onTouch,onClick,onLongClick事件发生先后顺序和关联:网络博文明确说明
Button的onTouch,onClick,onLongClick事件发生先后顺序和关联:一,onTouch返回false首先是onTouch事件的down事件发生,此时,如果长按,触发onLongClick事件;然后是onTouch事件的up事件发生,up完毕,最后触发onClick事件。二,onTouch返回true首先是onTouch事件的down事件发生,然后是onTouch事件的up事件发生;期间不触发onClick和onLongClick事件三,onTouch:down返回true,up返回false:结果同二。机制分析:onTouch事件中:down事件返回值标记此次事件是否为点击事件(返回false,是点击事件;返回true,不记为点击事件),而up事件标记此次事件结束时间,也就是判断是否为长按。只要当down返回true时候,系统将不把本次事件记录为点击事件,也就不会触发onClick或者onLongClick事件了。因此尽管当up的时候返回false,系统也不会继续触发onClick事件了。四,onTouch:down返回false,up返回true:首先是onTouch事件的down事件发生,此时:长按,触发onLongClick事件,然后是onTouch事件的up事件发生,完毕。短按,先触发onTouch的up事件,到一定时间后,自动触发onLongClick事件。机制分析:onTouch事件中:down事件返回值标记此次事件是否为点击事件(返回false,是点击事件;返回true,不记为点击事件),而up事件标记此次事件结束时间,也就是判断是否为长按。当down返回false,标记此次事件为点击事件,而up返回了true,则表示此次事件一直没有结束,也就是一直长按下去了,达到长按临界时间后,自然触发长按事件,而onClick事件没有触发到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。