SeekBar 本身有就是一个View 对象,既然是View 对象那也证明它有setOnLongClickListener 事件,众所周知,这个事件是让一个View 对象拥有长按功能,进而达到我们想要实现的操作。
为SeekBar 添加长按事件监听如下:
SeekBar.setOnLongClickListener(
new
OnLongClickListener() {
@Override
public
boolean
onLongClick(View v) {
//
TODO Auto-generated method stub
return
false
;
}
});
那么,我们来试试,它是否可以成立 ,为它添加一个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 重写内部的事件和方法
代码如下:
public
class
seekBarDemo
extends
SeekBar
implements
OnTouchListener
2、实现一个线程,当在规定的时间内停住即认为其是一个长按动作
这里实现一个自己的Runable 对象,向Handler 对象发送消息,代码如下:
/**
* 为runable 赋值
*/
runable
=
new
Runnable() {
@Override
public
void
run() {
//
TODO Auto-generated method stub
do
{
i
++
;
try
{
Thread.sleep(
400
);
Message msg
=
hand.obtainMessage();
msg.arg1
=
i;
msg.sendToTarget();
}
catch
(InterruptedException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
while
(isStop);
}
};
之后实现一个handler 对象用来设置该重写View 具有的长按事件
3、实现长按事件的接口函数
/**
* 获取一个handler 对象
*
@param
0代表onTouch 1代表onChange
*
@param
视图对象
*
@param
进度
*
@return
返回一个handler对象
*/
public
Handler getHandler(
final
int
j,
final
View v,
final
int
progress) {
Handler h
=
new
Handler() {
@Override
public
void
handleMessage(Message msg) {
//
TODO Auto-generated method stub
switch
(j) {
case
0
:
if
(msg.arg1
==
3
) {
if
(longClick
!=
null
) {
longClick.onLongClick(v);
}
}
break
;
case
1
:
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);
}
};
return
h;
}
4、并为重写的SeekBar 添加自己的OnSeekBarChangeListener 监听事件
这里我们首先定义一个onChange 接口 ,接口中有三未实现的方法,分别代表SeekBar 的三种状态
/**
* 进度改变接口
*
@author
terry
*
*/
public
interface
onChange {
public
void
onStopTrackingTouch(seekBarDemo seekBar);
public
void
onStartTrackingTouch(seekBarDemo seekBar);
public
void
onProgressChanged(seekBarDemo seekBar,
int
progress,
boolean
fromUser);
}
实现接口函数:
this
.setOnSeekBarChangeListener(
new
OnSeekBarChangeListener() {
@Override
public
void
onStopTrackingTouch(SeekBar seekBar) {
//
TODO Auto-generated method stub
if
(SeekBarChange
!=
null
) {
SeekBarChange.onStopTrackingTouch(seekBarDemo.
this
);
}
}
@Override
public
void
onStartTrackingTouch(SeekBar seekBar) {
//
TODO Auto-generated method stub
if
(SeekBarChange
!=
null
) {
SeekBarChange.onStartTrackingTouch(seekBarDemo.
this
);
}
}
@Override
public
void
onProgressChanged(
final
SeekBar seekBar,
final
int
progress,
boolean
fromUser) {
if
(SeekBarChange
!=
null
) {
SeekBarChange.onProgressChanged(seekBarDemo.
this
, progress,
fromUser);
}
hand
=
getHandler(
1
, seekBarDemo.
this
, progress);
}
});
完整的参考代码如下:
package
org.lytsing.android.qzoneloading;
import
android.content.Context;
import
android.os.Handler;
import
android.os.Message;
import
android.util.AttributeSet;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.View.OnTouchListener;
import
android.widget.SeekBar;
public
class
seekBarDemo
extends
SeekBar
implements
OnTouchListener {
private
onLong longClick;
/**
* 长按接口
*
@author
terry
*
*/
public
interface
onLong {
public
boolean
onLongClick(View v);
}
private
onChange SeekBarChange;
/**
* 进度改变接口
*
@author
terry
*
*/
public
interface
onChange {
public
void
onStopTrackingTouch(seekBarDemo seekBar);
public
void
onStartTrackingTouch(seekBarDemo seekBar);
public
void
onProgressChanged(seekBarDemo seekBar,
int
progress,
boolean
fromUser);
}
private
Handler hand;
private
Runnable runable;
private
Thread th;
public
static
int
i
=
0
;
private
boolean
isStop
=
false
;
public
static
int
pp
=
0
;
public
int
index
=
0
;
public
seekBarDemo(Context context) {
this
(context,
null
);
//
TODO Auto-generated constructor stub
}
public
seekBarDemo(Context context, AttributeSet attrs) {
super
(context, attrs);
this
.setOnTouchListener(
this
);
this
.setOnSeekBarChangeListener(
new
OnSeekBarChangeListener() {
@Override
public
void
onStopTrackingTouch(SeekBar seekBar) {
//
TODO Auto-generated method stub
if
(SeekBarChange
!=
null
) {
SeekBarChange.onStopTrackingTouch(seekBarDemo.
this
);
}
}
@Override
public
void
onStartTrackingTouch(SeekBar seekBar) {
//
TODO Auto-generated method stub
if
(SeekBarChange
!=
null
) {
SeekBarChange.onStartTrackingTouch(seekBarDemo.
this
);
}
}
@Override
public
void
onProgressChanged(
final
SeekBar seekBar,
final
int
progress,
boolean
fromUser) {
if
(SeekBarChange
!=
null
) {
SeekBarChange.onProgressChanged(seekBarDemo.
this
, progress,
fromUser);
}
hand
=
getHandler(
1
, seekBarDemo.
this
, progress);
}
});
/**
* 为runable 赋值
*/
runable
=
new
Runnable() {
@Override
public
void
run() {
//
TODO Auto-generated method stub
do
{
i
++
;
try
{
Thread.sleep(
400
);
Message msg
=
hand.obtainMessage();
msg.arg1
=
i;
msg.sendToTarget();
}
catch
(InterruptedException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
while
(isStop);
}
};
}
/**
* 获取一个handler 对象
*
@param
0代表onTouch 1代表onChange
*
@param
视图对象
*
@param
进度
*
@return
返回一个handler对象
*/
public
Handler getHandler(
final
int
j,
final
View v,
final
int
progress) {
Handler h
=
new
Handler() {
@Override
public
void
handleMessage(Message msg) {
//
TODO Auto-generated method stub
switch
(j) {
case
0
:
if
(msg.arg1
==
3
) {
if
(longClick
!=
null
) {
longClick.onLongClick(v);
}
}
break
;
case
1
:
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);
}
};
return
h;
}
/**
* 设置长按事件
*
@param
longClick
*/
public
void
setOnLongSeekBarClick(onLong longClick) {
this
.longClick
=
longClick;
}
/**
* 设置进度改变事件
*
@param
change
*/
public
void
setOnSeekBarChange(onChange change) {
this
.SeekBarChange
=
change;
}
@Override
public
boolean
onTouch(
final
View v, MotionEvent event) {
//
TODO Auto-generated method stub
switch
(event.getAction()) {
case
MotionEvent.ACTION_DOWN:
isStop
=
true
;
th
=
new
Thread(runable);
th.start();
i
=
0
;
hand
=
getHandler(
0
, v,
0
);
break
;
case
MotionEvent.ACTION_UP:
isStop
=
false
;
break
;
}
return
false
;
}
}
在布局的XML可以如下定义:
<
org.lytsing.android.qzoneloading.seekBarDemo
android:max
="200"
android:id
="@+id/seek"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
>
</
org.lytsing.android.qzoneloading.seekBarDemo
>
功能至此完成,在前台可以像我们之前使用SeekBar 一样使用,功能一样,大家也可以根据自己的需求再另行扩展。这里给出的只是一个思路。
本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/385441,如需转载请自行联系原作者