1.首先自定义view悬浮小球
public class FloatCircleView extends View{
}
2.重写构造方法
public FloatCircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
// 相对于定义了布局文件,有style样式
initPaints();// 初始化画笔的方法
}
3.在构造方法初始化画笔
private void initPaints() {
// TODO Auto-generated method stub
circlePaint = new Paint();//画笔对象
circlePaint.setColor(Color.GRAY);//画笔颜色
circlePaint.setAntiAlias(true);//防止锯齿效果
textPaint = new Paint();
textPaint.setTextSize(25);//画笔大小
textPaint.setColor(Color.WHITE);//画笔颜色
textPaint.setAntiAlias(true);//画笔防止锯齿效果
textPaint.setFakeBoldText(true);//加粗效果
Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.zoom_plate);
bitmap = Bitmap.createScaledBitmap(src, width, height, true);
}
4.重写onMeasure方法
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
setMeasuredDimension(width, height);// 控件宽高
}
5.重写onDraw方法
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
if(drag){
canvas.drawBitmap(bitmap, 0, 0,null);
}else{
/**
* drawCircle画圆
* 参数一 参数二:确认中心点圆心 参数三:半径 参数四:对应画笔
*
* drawText绘制文本
* 参数一:文本内容 参数二,三:文本x轴坐标,文本y轴基线坐标,参数四:相应画笔
*/
canvas.drawCircle(width/2, height/2, width/2, circlePaint);
float textwidth = textPaint.measureText(text);//文本宽度
float x = width/2 - textwidth/2;
FontMetrics metrics = textPaint.getFontMetrics();
float dy = -(metrics.descent+metrics.ascent)/2;
float y = height/2+dy;
canvas.drawText(text, x, y, textPaint);
}
}
6.在浮窗管理FloatViewManager处理悬浮小球的移动,贴边,开启,关闭等功能
(1)单例类
private static FloatViewManager instance;// 私有化FloatViewManager类
private WindowManager wn;// 通过这个windowmanager来操控浮窗体的显示和隐藏以及位置的改变
// 通过公共的方法获取FloatViewManager类,使其成为单例类
public static FloatViewManager getInstance(Context context) {
if (instance == null) {
synchronized (FloatViewManager.class) {
if (instance == null) {
instance = new FloatViewManager(context);
}
}
}
return instance;
}
7.通过OnTouchListener来控制悬浮窗的状态
private OnTouchListener onTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
手指点击时
startx = event.getRawX();
starty = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
移动时悬浮窗
float x = event.getRawX();
float y = event.getRawY();
float dx = x-startx;
float dy = y-starty;
params.x+=dx;
params.y+=dy;
circleView.setDragState(true);
wn.updateViewLayout(circleView, params);
startx = x;
starty = y;
break;
case MotionEvent.ACTION_UP:
最后悬浮窗放开的位置
float x1 =event.getRawX();
if(x1>getScreenWidth()/2){
params.x = getScreenWidth()-circleView.width;
}else {
params.x = 0;
}
circleView.setDragState(false);
wn.updateViewLayout(circleView, params);
break;
default:
break;
}
return false;
}
};
下面是demo源码,上面是demo的一部分代码
http://download.csdn.net/download/ou775968876/10107916