我有一个有趣的问题。我在服务中有一个WindowManager。现在windowmanager覆盖了屏幕并且是半透明的,所以你可以在窗口管理器下做其他事情。
在启动windowmanager服务的应用程序中。我想通过按下按钮更改颜色来更改背景的颜色。但是,我无法获得该视图或不知道如何使它能够使用它。 这是该项目的github,我希望有人可以帮助我,如果您需要更多信息,请告诉我。
在 MainActivity setDiffColor 中有一个 onClick 方法,可以更改颜色,可以使用R.color.colorAccent来改变颜色那个
https://github.com/juangdiaz/windowmanagerservice
这就是我在MainActivity中启动服务的方式
public void setOn(View v) {
Toast.makeText(this, "opening window", Toast.LENGTH_SHORT).show();
setOn = (Button) findViewById(R.id.button);
setOn.setEnabled(false);
sd.start(sensorManager);
startService(new Intent(this, FloatingWidgetService.class));
}
在MainActivity中停止服务
public void setOff(View v) {
setOn.setEnabled(true);
stopService(new Intent(getApplication(), FloatingWidgetService.class));
}
在MainActivity中更改颜色
public void setDiffColor(View v) {
R.color.colorAccent
//TODO: Change the WindowManagers Color
}
Floatingwidgetservice类
package com.bluetooth.juandiaz.bluetoothconnectivity.services;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import com.bluetooth.juandiaz.bluetoothconnectivity.R;
public class FloatingWidgetService extends Service {
private WindowManager windowManager;
private View widget;
WindowManager.LayoutParams params;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
widget = new View(this);
final LayoutInflater factory = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
widget = factory.inflate(R.layout.floating_widget, null);
widget.setAlpha(0.50f);
params= new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
windowManager.addView(widget, params);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
if (widget != null)
windowManager.removeView(widget);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
答案 0 :(得分:0)
我找到了一种使用GreenRobot做到这一点的方法,它运作良好
由于很难从服务中获取View,因此我将一个Event附加到该服务。这样,每当我在事件监听器中进行任何更改时,我都可以更改颜色。它将更新关于该点的观点。
此代码位于FloatingWidgetService中。
@Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(this);
}
public void onEvent(WindowEvent event){
Toast.makeText(this, "event fired", Toast.LENGTH_SHORT).show();
widget.setBackgroundResource(event.getColor());
}
@Override
public void onDestroy() {
super.onDestroy();
if (widget != null) {
windowManager.removeView(widget);
EventBus.getDefault().unregister(this);
}
}
然后在我做的MainActivity中
public void setDiffColor(View v) {
EventBus.getDefault().post(new WindowEvent(R.color.colorAccent));
}
为EventBus创建了一个POJO
public class WindowEvent {
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
private int color;
public WindowEvent(int color) {
this.color = color;
}
}