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 一样使用,功能一样,大家也可以根据自己的需求再另行扩展。这里给出的只是一个思路。