2014-01-13 7 views
14

Ich habe eine Spiele-App mit der folgenden Ansichten Struktur. Zuerst habe ich eine leere FrameLayout wie so:SurfaceHolder.setFormat (PixelFormat.RGBA_8888) schlägt auf einigen Geräten und nicht anderen

FrameLayout game_frame_layout = new FrameLayout(getApplicationContext()); 

Dann füge ich zwei Ansichten, um es wie so:

game_frame_layout.addView(customView); 
game_frame_layout.addView(butView); 

Die Custom ist für alle Arten von sich bewegenden Spielgrafik angezeigt wird, während die butView einige ImageButtons zeigt oben auf den beweglichen Grafiken. Die customView ist eine Instanz einer Klasse CustomView, die SurfaceView erweitert.

Custom umfasst den folgenden Code

void updateView() 
    { 
     final SurfaceHolder holder = getHolder(); 
     holder.setFormat(PixelFormat.RGBA_8888); 

     try 
     { 
       Canvas canvas = holder.lockCanvas(); 
       if (canvas != null) 
       { 
        onDraw(canvas); 

        holder.unlockCanvasAndPost(canvas); 
       } 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

Die Linie holder.setFormat(PixelFormat.RGBA_8888); ist ein neuer Zusatz (siehe here). Ohne diese Linie scheinen meine animierten Grafiken in einem Format mit zu wenigen Farben zu sein (experimentell folgerte ich, dass es "RGB_565" war), so dass ich einige banding Artefakte erhalte. Als ich die setFormat-Zeile hinzugefügt habe, erscheinen die Grafiken perfekt (ohne Streifenbildung) auf meinem Samsung Galaxy Tab 10.1 (Android 3.1) ... aber auf drei anderen Geräten: einem Samsung GT-l9100 (4.1.2), einem Nexus 7 ME370T 4.4 .2 und ein HTC One X 4.2.2 Ich sehe nur die Tasten, die ButView mit einem völlig schwarzen Hintergrund entsprechen. In den Protokollen wird nicht angezeigt, dass das Programm abgestürzt ist.

Irgendwelche Ideen?

+0

Brauchen Sie Transparenz für diese Oberfläche oder könnten Sie auch 'PixelFormat.RGB_888' eine Aufnahme geben? – tiguchi

+0

Bewegen sich Ihre Tasten auf Ihren "schwarzen" bewegten Grafiken? –

Antwort

2

Wahrscheinlich unterstützen nicht alle Android-Geräte ein 32/24-Bit-Pixelformat, weshalb 565 immer funktioniert, während 888 ausfallen kann. Sie könnten versuchen, zu verstehen, wenn es ein Problem mit der Hardware-Beschleunigung ist versucht, es

+0

Ich kann bestätigen, dass das Deaktivieren der Hardwarebeschleunigung das Problem nicht behoben hat. – Mick

+0

Scheint seltsam, dass es die neueren Geräte sind, die versagen. – Mick

3

das Pixelformat vor dem setContentView() auf der Aktivität einstellen zu deaktivieren:

getWindow().setFormat(PixelFormat.RGBA_8888); 

+0

Das war das erste, was ich ausprobierte - kurz vor dem Start von onCreate (ohne das setFormat für den Halter), aber dann schien das Format meiner customView 565 zu sein, d. H. Ich konnte immer noch Banding sehen. – Mick

+0

Ich habe es gerade noch einmal versucht, dieses Mal SetFormat auf der Zeile direkt vor setContentView() aufrufen ... aber keine Änderung - immer noch 565. – Mick

0

Ich bin neugierig, wenn Sie den Hintergrund von butView auf transparent setzen.

butView.setBackgroundColor(Color.TRANSPARENT); 
+0

Keine Änderung - immer noch alle schwarzen hinter Tasten. – Mick

2

Was passiert, wenn Sie die Reihenfolge, die Sie zu dem game_frame_layout hinzufügen ändern? Zuerst wird die butView und dann die Custom:

game_frame_layout.addView(butView); 
game_frame_layout.addView(customView); 

Ich gehe davon aus dem butView wird nicht sichtbar sein, aber ich bin gespannt, ob der Custom richtig seinen Inhalt macht.

+0

Schwarzer Bildschirm - keine Tasten. – Mick

+0

Haben Sie Änderungen an der Oberflächenansicht/dem Halter oder dem Zeichnungsmechanismus zwischen Honeycomb und JellyBean Release festgestellt? scheint komisch, dass Ihre Jellybean-Geräte nicht angezeigt werden. – Delblanco

1

Ihre Anwendung scheint nach ICS nicht zu funktionieren. ICS sah große Überarbeitungen in der Grafikabteilung, die bedeutendste Einführung von TextureView, die entworfen wurde, um die Unzulänglichkeiten von SurfaceView zu beheben. Versuchen Sie, TextureView statt SurfaceView für Ihre CustomView Klasse zu erweitern. Für weitere Informationen besuchen Sie bitte Android 4.0 Graphics and Animation

+0

Ich weiß, es ist keine ideale Lösung, weil es nicht für niedrigere API-Ebenen funktioniert, aber mit abnehmendem Anteil von Pre-ICS-Geräten, könnte dies die beste Wette sein. – Shakti

Verwandte Themen