2014-01-03 2 views
2

Я пытаюсь сделать приложение для Android, которое управляет его экраном (его цвета, если быть конкретным). У меня есть эти две следующих классы:Манипулирование цветами экрана Android RGB

static class ScreenAdjuster { 

    public static void setAlpha(Layer view, int alpha){ 
     //Handle all conditions 
      view.setColor(alpha, 0, 0, 0); 
    } 
    public static void setContrast(Layer view, int contrast){ 
     //Handle all conditions 
     view.setColor(contrast, 100, 100, 100); 
    } 

    public static void setColor(Layer redView, Layer greenView, Layer blueView, int r, int g, int b){ 
     //Handle all conditions 
     redView.setColor(r, 255, 0, 0); 
     greenView.setColor(g, 0, 255, 0); 
     blueView.setColor(b, 0, 0, 255); 
     Log.d("display", "setting..." + r + " " + g + " " + b); 
    } 

} 

class Layer extends View 
{ 
     private int a; 
     private int b; 
     private int g; 
     private int r; 

     public Layer(Context context){ 
     super(context); 
     } 

     @Override 
     protected void onDraw(Canvas canvas){ 
     super.onDraw(canvas); 
     canvas.drawARGB(this.a, this.r, this.g, this.b); 
     Log.d("display", "rendering.."); 
     } 

     @Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
     int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
     this.setMeasuredDimension(parentWidth/2, parentHeight); 
     this.setLayoutParams(new ViewGroup.LayoutParams(parentWidth/2,parentHeight)); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     Log.d("display", "filling..."); 
     } 

     public void setColor(int a, int r, int g, int b){ 
     this.a = a; 
     this.r = r; 
     this.g = g; 
     this.b = b; 
     invalidate(); 
     } 
} 

Я добавляю вид на менеджер в этой функции:

public void setColorsViews() { 
    if(!colorsFirstTime) { 
     view = new Layer(cordova.getActivity()); 
     redView = new Layer(cordova.getActivity()); 
     greenView = new Layer(cordova.getActivity()); 
     blueView = new Layer(cordova.getActivity()); 


     WindowManager localWindowManager = (WindowManager)cordova.getActivity().getSystemService("window"); 
     WindowManager.LayoutParams layoutParams = cordova.getActivity().getWindow().getAttributes(); 
     localWindowManager.addView(view, layoutParams); 
     localWindowManager.addView(greenView, layoutParams); 
     localWindowManager.addView(redView, layoutParams); 
     localWindowManager.addView(blueView, layoutParams); 
     colorsFirstTime = true; 
     Log.d("display", "views added"); 
    } 
} 

(Это будет плагин для Кордовы, так что я получаю активность по cordova.getActivity() It. работает с моими другими функциями, поэтому я полагаю, что он работает и здесь).

Я вызываю все это: ScreenAdjuster.setColor (redView, greenView, blueView, красный, зеленый, синий);

Но ... ничего не происходит. Все функции вызываются (onDraw(), onMeasure(), setColorsViews(), но экран остается тем же

Что я делаю неправильно

Заранее спасибо

+0

Вы можете использовать это решение в [this] (http://stackoverflow.com/a/7658364/2581872)? – hichris123

+0

Это не про яркость (я использовал это решение, и оно работает). Речь идет о манипуляции цветами. – tomwesolowski

+0

Я не уверен, что представление будет позиционироваться так, как вы ожидаете.Не могли бы вы попытаться просто проверить позиционирование вида, давая им цвет фона, чтобы понять, где они находятся? –

ответ

2

Изменение:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
     int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
     this.setMeasuredDimension(parentWidth/2, parentHeight); 
     //Since you are attatching it to the window use window layout params. 
     WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(parentWidth/2, 
       parentHeight); 
     this.setLayoutParams(layoutParams); 

     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     Log.d("display", "filling..."); 
    } 

Добавить:layoutParams.format = PixelFormat.TRANSLUCENT;

public void setColorsViews() { 
    if (!colorsFirstTime) { 
     view = new Layer(cordova.getActivity()); 
     redView = new Layer(cordova.getActivity()); 
     greenView = new Layer(cordova.getActivity()); 
     blueView = new Layer(cordova.getActivity()); 

     WindowManager localWindowManager = (WindowManager) cordova.getActivity() 
       .getSystemService("window"); 
     WindowManager.LayoutParams layoutParams = cordova.getActivity().getWindow() 
       .getAttributes(); 
     layoutParams.format = PixelFormat.TRANSLUCENT; 

     localWindowManager.addView(view, layoutParams); 
     localWindowManager.addView(greenView, layoutParams); 
     localWindowManager.addView(redView, layoutParams); 
     localWindowManager.addView(blueView, layoutParams); 
     colorsFirstTime = true; 
     Log.d("display", "views added"); 
    } 
} 

ScreenAdjuster.setColor (redView, greenView, blueView, 50, 150, 0); ScreenAdjuster.setColor(redView, greenView, blueView, 50, 150, 0);

+0

Боюсь, это не работает для меня. Когда я вызываю setColor в первый раз, экран мигает на мгновение, и ничего не изменилось. Я прикрепляю весь файл: http://speedy.sh/tXHmD/Display.java – tomwesolowski

+0

ОК, мне нужно установить кордову и попробовать. Это собственный код для Android (по ошибке я думал, что это сработает). На каком устройстве вы его тестируете? – ejohansson

+0

HTC Nexus One (Android 2.3) – tomwesolowski

1

Похоже, от Android спецификации для WindowManager.?!:

Throws WindowManager.BadTokenException for certain programming errors, 
such as adding a second view to a window without removing the first view. 

добавляя следующую строку между каждым addView(...), было бы удалить предыдущий вид, и загрузить следующую точку зрения:

localWindowManager.removeView(View view); 

Или, вы можете изменить последующие три строки в дальнейшем, имея их заменить текущий вид:

lastWindowManager.updateViewLayout(view, params); 

Вы должны также изменить на следующий код (или нечто подобное), если вы хотите быть отображением цвета RGB, который вводится пользователем:

view = new Layer(cordova.getActivity()); 
view.setColor(int a, int r, int g, int b)  //enter values here somehow? 
localWindowManager.addView(view, layoutParams); 

Это создаст вид из нового класса, присвоить значения A, R, G и B, а затем добавить, что новый вид как Текущий вид.

p.s. - У меня ограниченный опыт разработки Android, поэтому я не уверен, правильно ли это, но, глядя на документацию, похоже, это указывает на это решение. Кроме того, не видя весь код, я не уверен, что это исправление ...

Смежные вопросы