80,492
社区成员
发帖
与我相关
我的任务
分享
Service类:由于要一直悬浮球要一直显示在屏幕上,所以要使用Service显示悬浮球。
ViewManager类:用于添加悬浮球和删除悬浮球
public class ViewManager
{
private static ViewManager viewManager;
private WindowManager windowManager;
private FloatBall floatBall;
private ViewManager() {}
public static ViewManager getViewManagerInstance()
{
if(viewManager == null)
viewManager = new ViewManager();
return viewManager;
}
public void show(final Context context)
{
windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
floatBall = new FloatBall(context);
floatBall.setBackgroundColor(Color.parseColor("#ffdddddd"));
layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
layoutParams.width = floatBall.width;
layoutParams.height = floatBall.height;
layoutParams.flags = 40;
layoutParams.format = PixelFormat.RGBA_8888 | PixelFormat.TRANSLUCENT;
//floatBall.setLayoutParams(layoutParams);
windowManager.addView(floatBall, layoutParams);
floatBall.setOnTouchListener(new View.OnTouchListener()
{
float startX;
float startY; // 原位置
@Override
public boolean onTouch(View v, MotionEvent event)
{
int action = event.getAction();
float x = event.getRawX();
float y = event.getRawY(); // 新位置
if(action == MotionEvent.ACTION_DOWN)
{
startX = x;
startY = y;
}
else if(action == MotionEvent.ACTION_MOVE)
{
x = event.getRawX();
y = event.getRawY();
layoutParams.x += (int)(x - startX);
layoutParams.y += (int)(y - startY);
windowManager.updateViewLayout(floatBall, layoutParams);
startX = x;
startY = y;
}
else if(action == MotionEvent.ACTION_UP)
{
startX = x;
startY = y;
}
return false;
}
});
floatBall.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
final View view = LayoutInflater.from(context).inflate(R.layout.streamvolume, null);
view.setBackgroundColor(Color.parseColor("#ffdddddd"));
WindowManager.LayoutParams layoutParams1 = new WindowManager.LayoutParams();
layoutParams1.width = 800;
layoutParams1.height = 950;
layoutParams1.type = WindowManager.LayoutParams.TYPE_PHONE;
layoutParams1.flags = 40;
windowManager.addView(view, layoutParams1);
final AudioManager am = (AudioManager)view.getContext().getSystemService(Context.AUDIO_SERVICE);
SeekBar sysVolume = (SeekBar)view.findViewById(R.id.sysVolume);
SeekBar callVolume = (SeekBar)view.findViewById(R.id.callVolume);
SeekBar ringVolume = (SeekBar)view.findViewById(R.id.ringVolume);
SeekBar musicVolume = (SeekBar)view.findViewById(R.id.musicVolume);
SeekBar notifyVolume = (SeekBar)view.findViewById(R.id.notifyVolume);
SeekBar alarmVolume = (SeekBar)view.findViewById(R.id.alarmVolume);
// 1 系统音量
sysVolume.setMax(am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM));
sysVolume.setProgress(am.getStreamVolume(AudioManager.STREAM_SYSTEM));
sysVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
am.setStreamVolume(AudioManager.STREAM_SYSTEM, progress, AudioManager.FLAG_PLAY_SOUND);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
// 2 通话音量
callVolume.setMax(am.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL));
callVolume.setProgress(am.getStreamVolume(AudioManager.STREAM_VOICE_CALL));
callVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
am.setStreamVolume(AudioManager.STREAM_VOICE_CALL, progress, AudioManager.FLAG_PLAY_SOUND);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
// 3 铃声音量
ringVolume.setMax(am.getStreamMaxVolume(AudioManager.STREAM_RING));
ringVolume.setProgress(am.getStreamVolume(AudioManager.STREAM_RING));
ringVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
am.setStreamVolume(AudioManager.STREAM_RING, progress, AudioManager.FLAG_PLAY_SOUND);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
// 4 媒体音量
musicVolume.setMax(am.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
musicVolume.setProgress(am.getStreamVolume(AudioManager.STREAM_MUSIC));
musicVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, AudioManager.FLAG_PLAY_SOUND);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
// 5 通知音量
notifyVolume.setMax(am.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION));
notifyVolume.setProgress(am.getStreamVolume(AudioManager.STREAM_NOTIFICATION));
notifyVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
am.setStreamVolume(AudioManager.STREAM_NOTIFICATION, progress, AudioManager.FLAG_PLAY_SOUND);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
// 6 警报音量
alarmVolume.setMax(am.getStreamMaxVolume(AudioManager.STREAM_ALARM));
alarmVolume.setProgress(am.getStreamVolume(AudioManager.STREAM_ALARM));
alarmVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
{
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
{
am.setStreamVolume(AudioManager.STREAM_ALARM, progress, AudioManager.FLAG_PLAY_SOUND);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
});
ImageView c = (ImageView)view.findViewById(R.id.close);
c.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
windowManager.removeView(view);
}
});
}
});
}
public void close()
{
windowManager.removeView(floatBall);
}
}
另外是一个MainAcitivity类,定义两个按钮,点击它们可以启动Service和关闭Servcie。
