改变windowmanager服务的颜色

时间:2016-01-30 22:02:32

标签: android android-service android-windowmanager

我有一个有趣的问题。我在服务中有一个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;
    }

}

1 个答案:

答案 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;
    }

}