Ich frage mich, auf welche Weise Android Ansichten auf dem Bildschirm in Layout-Ansichten mit definierten android:layout_width
und android:layout_height
Werte in Pixeln zeichnet.Warum zeichnet Android View in einem anderen (mit in Pixel definierten Breite und Höhe) falsch auf?
Ich verwende Android-Klasse Ansicht erweitert android.view.SurfaceView
. Es ist nur MjpegView
, um MJPEG Stream von der Kamera auf der Android App anzuzeigen. Ich arbeite mit diesem Code (mit einigen kleinen Änderungen): Android ICS and MJPEG using AsyncTask
Diese MjpegView
Klasse ist innerhalb der RelativeLayout
platziert. MjpegView
Objekt hinzugefügt wird programmatisch und diese RelativeLayout
hat Attribute auf diese Weise definiert:
android:layout_width="800px"
android:layout_height="600px"
Diese Größenwerte für diese Anwendung erforderlich ist, so kann ich sie nicht ändern. Die Anwendung funktioniert nur im Querformat. Meine MjpegView
müssen 320 x 240
Pixel Größe innerhalb RelativeLayout (800 x 600 px)
gesetzt werden. Meine Anwendung vergrößert diese RealtiveLayout
, um den Bildschirm des aktuellen Geräts zu füllen. Und das ist ein Problem, das auch mit dem Streaming MJPEG verbunden ist. Ich arbeite an Nexus 7 (Version 2012), die 1280 x 800
Auflösung hat.
Um die tatsächliche Größe dieser Ansicht im Layout zu erhalten, muss ich die Höhe des Nexus 7-Bildschirms ohne Aktions- und Navigationsleisten messen. Um dies ich diese Methode in einem Activity
verwendet haben:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
RelativeLayout parentLayout = (RelativeLayout) findViewById(R.id.parent_layout);
if (parentLayout != null && isLandscape) {
this.measuredActivityHeight = parentLayout.getBottom();
}
}
Ich erhalte 703
Wert als measuredActivityHeight
der Laufaktivität. Also um das Verhältnis zu erhalten, in dem Android übersetzt 320 x 240 px
innerhalb 800 x 600 px
, um den dp
Wert auf dem Bildschirm ich diese Methode geschrieben habe:
public int calculateForCurrentScreen(float pixelValue) {
float ratio = PageActivity.measuredActivityHeight/600f;
int result = (int) (pixelValue * ratio);
return result;
}
Also für die 320 x 240 px
auf dem Nexus 7 I 374 x 281
bin immer. Und um MjpegView
in dieser Größe brauche ich in der MjpegView
Klasse diese Methode zu verwenden:
public void setResolution(int width, int height) {
holder.setFixedSize(width, height);
}
und die Größe der Streaming-Ansicht ist in der gewünschten Größe. Aber diese Ansicht hat zusätzliche schwarze Bereiche. In der Tat hat die gesamte Ansicht (Kamerastrom + schwarze Bereiche auf der unteren und rechten Seite) 440 x 328
Größe.
Ich habe überprüft, dass Rect
Objekt in MjpegView
Zeichnung mit 374 x 281
Größe ist, so ist es in Ordnung. SurfaceHolder
und Canvas
haben auch diese Größe. Bitmap
Objekt hat 320 x 240
Größe, aber das ist OK, weil Bitmap
Objekt aus Kamerastrom ist. Und es wird auf die gewünschte Größe angepasst.
Problem verschwinden (es keine schwarzen Flächen ist und MjpegView
ist in der richtigen Position und Größe im Vergleich zu anderen Ansichten), wenn I RelativeLayout
zur 800dp x 600dp
Größe und rufen setResolution(320, 240)
für das Objekt MjpegView
eingeschaltet habe. Aber das ganze Layout ist in diesem Moment zu groß.
EDIT
Dank @mathiash für Ihren Kommentar. Ich habe gerade einen Screenshot von Nexus 7 (Ausgabe 2012) hochgeladen, um Ihnen mein Problem zu zeigen.
Wie Sie sehen können, ist der grüne Bereich der RelativeLayout
mit definierter 800 x 600 px
Größe. Um MJPEG-Stream von der http://trackfield.webcam.oregonstate.edu/
zu bekommen. Ich habe diese URL verwendet: http://trackfield.webcam.oregonstate.edu/axis-cgi/mjpg/video.cgi?resolution=320x240
.
Für diesen Screenshot habe ich setResolution(320, 240)
Methode aufgerufen. Und schwarze Fläche hat 374 x 281
und Videostream 320 x 240
.
Für diesen Screenshot ich setResolution(374, 281)
Methode aufgerufen haben. Und schwarze Fläche ist viel größer und Video-Stream ist 374 x 281
. Und in diesem Fall hat der Videostream die richtige Größe, aber dieser schwarze Bereich ist nicht notwendig.
Tut mir leid, ich habe Ihre Frage verpasst – pskink
Diese Frage ist interessant, aber, es tut mir leid zu sagen, eher schwer zu verstehen. :/Vielleicht wäre ein Screenshot nützlich? – matiash
@matiash danke für deinen Kommentar, ich habe meine Frage mit den Sreenshots aktualisiert – woyaru