android 禁止长按事件,Android 让你的SeekBar 也支持长按事件

SeekBar 本身有就是一个View 对象,既然是View 对象那也证明它有setOnLongClickListener 事件,众所周知,这个事件是让一个View 对象拥有长按功能,进而达到我们想要实现的操作。

为SeekBar 添加长按事件监听如下:

SeekBar.setOnLongClickListener(newOnLongClickListener() {

@OverridepublicbooleanonLongClick(View v) {//TODO Auto-generated method stubreturnfalse;

}

});

那么,我们来试试,它是否可以成立 ,为它添加一个Toast :

Toast.makeText(ttActivty.this,"fda",100).show();

一般来说,我们运行项目,然后长按SeekBar 即能够把Toast Show 出来。那么试一下吧,试了之后结果很让人费解,因为我们知道SeekBar 继承自AbsSeekBar 而AbsSeekBar 又是继承自ProgressBar ,而ProgressBar 的长按事件是可行的,可是这里我们同样的操作却得不到效果,Toast 并不能像我们如期想像的一样显示出来。那是不是就是说SeekBar 不支持长按事件呢?这点我也不好下定论,总之我们为其他同样的View 对象的操作是可行的。好了,既然SeekBar 可能不支持长按事件,那我们就为它模拟一个长按事件,模拟思路如下:

1、继承SeekBar 重写内部的事件和方法

2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作

3、实现长按事件的接口函数

4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件

具体操作看如下:

1、继承SeekBar 重写内部的事件和方法

代码如下:

publicclassseekBarDemoextendsSeekBarimplementsOnTouchListener

2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作

这里实现一个自己的Runable 对象,向Handler 对象发送消息,代码如下:

/*** 为runable 赋值*/runable=newRunnable() {

@Overridepublicvoidrun() {//TODO Auto-generated method stubdo{

i++;try{

Thread.sleep(400);

Message msg=hand.obtainMessage();

msg.arg1=i;

msg.sendToTarget();

}catch(InterruptedException e) {//TODO Auto-generated catch blocke.printStackTrace();

}

}while(isStop);

}

};

之后实现一个handler 对象用来设置该重写View 具有的长按事件

3、实现长按事件的接口函数

/*** 获取一个handler 对象

*@param0代表onTouch 1代表onChange

*@param视图对象

*@param进度

*@return返回一个handler对象*/publicHandler getHandler(finalintj,finalView v,finalintprogress) {

Handler h=newHandler() {

@OverridepublicvoidhandleMessage(Message msg) {//TODO Auto-generated method stubswitch(j) {case0:if(msg.arg1==3) {if(longClick!=null) {

longClick.onLongClick(v);

}

}break;case1:if(msg.arg1==1) {

pp=progress;

}if(msg.arg1==2) {if(pp!=progress) {

i=0;

}

}if(msg.arg1==3) {

i=0;if(pp==progress) {if(longClick!=null) {

longClick.onLongClick(seekBarDemo.this);

}

}

}break;

}super.handleMessage(msg);

}

};returnh;

}

4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件

这里我们首先定义一个onChange 接口 ,接口中有三未实现的方法,分别代表SeekBar 的三种状态

/*** 进度改变接口

*@authorterry

**/publicinterfaceonChange {publicvoidonStopTrackingTouch(seekBarDemo seekBar);publicvoidonStartTrackingTouch(seekBarDemo seekBar);publicvoidonProgressChanged(seekBarDemo seekBar,intprogress,booleanfromUser);

}

实现接口函数:

this.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {

@OverridepublicvoidonStopTrackingTouch(SeekBar seekBar) {//TODO Auto-generated method stubif(SeekBarChange!=null) {

SeekBarChange.onStopTrackingTouch(seekBarDemo.this);

}

}

@OverridepublicvoidonStartTrackingTouch(SeekBar seekBar) {//TODO Auto-generated method stubif(SeekBarChange!=null) {

SeekBarChange.onStartTrackingTouch(seekBarDemo.this);

}

}

@OverridepublicvoidonProgressChanged(finalSeekBar seekBar,finalintprogress,booleanfromUser) {if(SeekBarChange!=null) {

SeekBarChange.onProgressChanged(seekBarDemo.this, progress,

fromUser);

}

hand=getHandler(1, seekBarDemo.this, progress);

}

});

完整的参考代码如下:

packageorg.lytsing.android.qzoneloading;importandroid.content.Context;importandroid.os.Handler;importandroid.os.Message;importandroid.util.AttributeSet;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.View.OnTouchListener;importandroid.widget.SeekBar;publicclassseekBarDemoextendsSeekBarimplementsOnTouchListener {privateonLong longClick;/*** 长按接口

*@authorterry

**/publicinterfaceonLong {publicbooleanonLongClick(View v);

}privateonChange SeekBarChange;/*** 进度改变接口

*@authorterry

**/publicinterfaceonChange {publicvoidonStopTrackingTouch(seekBarDemo seekBar);publicvoidonStartTrackingTouch(seekBarDemo seekBar);publicvoidonProgressChanged(seekBarDemo seekBar,intprogress,booleanfromUser);

}privateHandler hand;privateRunnable runable;privateThread th;publicstaticinti=0;privatebooleanisStop=false;publicstaticintpp=0;publicintindex=0;publicseekBarDemo(Context context) {this(context,null);//TODO Auto-generated constructor stub}publicseekBarDemo(Context context, AttributeSet attrs) {super(context, attrs);this.setOnTouchListener(this);this.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {

@OverridepublicvoidonStopTrackingTouch(SeekBar seekBar) {//TODO Auto-generated method stubif(SeekBarChange!=null) {

SeekBarChange.onStopTrackingTouch(seekBarDemo.this);

}

}

@OverridepublicvoidonStartTrackingTouch(SeekBar seekBar) {//TODO Auto-generated method stubif(SeekBarChange!=null) {

SeekBarChange.onStartTrackingTouch(seekBarDemo.this);

}

}

@OverridepublicvoidonProgressChanged(finalSeekBar seekBar,finalintprogress,booleanfromUser) {if(SeekBarChange!=null) {

SeekBarChange.onProgressChanged(seekBarDemo.this, progress,

fromUser);

}

hand=getHandler(1, seekBarDemo.this, progress);

}

});/*** 为runable 赋值*/runable=newRunnable() {

@Overridepublicvoidrun() {//TODO Auto-generated method stubdo{

i++;try{

Thread.sleep(400);

Message msg=hand.obtainMessage();

msg.arg1=i;

msg.sendToTarget();

}catch(InterruptedException e) {//TODO Auto-generated catch blocke.printStackTrace();

}

}while(isStop);

}

};

}/*** 获取一个handler 对象

*@param0代表onTouch 1代表onChange

*@param视图对象

*@param进度

*@return返回一个handler对象*/publicHandler getHandler(finalintj,finalView v,finalintprogress) {

Handler h=newHandler() {

@OverridepublicvoidhandleMessage(Message msg) {//TODO Auto-generated method stubswitch(j) {case0:if(msg.arg1==3) {if(longClick!=null) {

longClick.onLongClick(v);

}

}break;case1:if(msg.arg1==1) {

pp=progress;

}if(msg.arg1==2) {if(pp!=progress) {

i=0;

}

}if(msg.arg1==3) {

i=0;if(pp==progress) {if(longClick!=null) {

longClick.onLongClick(seekBarDemo.this);

}

}

}break;

}super.handleMessage(msg);

}

};returnh;

}/*** 设置长按事件

*@paramlongClick*/publicvoidsetOnLongSeekBarClick(onLong longClick) {this.longClick=longClick;

}/*** 设置进度改变事件

*@paramchange*/publicvoidsetOnSeekBarChange(onChange change) {this.SeekBarChange=change;

}

@OverridepublicbooleanonTouch(finalView v, MotionEvent event) {//TODO Auto-generated method stubswitch(event.getAction()) {caseMotionEvent.ACTION_DOWN:

isStop=true;

th=newThread(runable);

th.start();

i=0;

hand=getHandler(0, v,0);break;caseMotionEvent.ACTION_UP:

isStop=false;break;

}returnfalse;

}

}

在布局的XML可以如下定义:

功能至此完成,在前台可以像我们之前使用SeekBar 一样使用,功能一样,大家也可以根据自己的需求再另行扩展。这里给出的只是一个思路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值