TextView abhängig der Grösse einer VideoView hinzufügen und platzieren

  • Antworten:10
Kai P.
  • Forum-Beiträge: 113

31.10.2012, 11:19:03 via Website

Hallo Developer-Forum,

Ich arbeite jetzt schon einige Zeit daran, eine TextView abhängig von der Grösse einer VideoView zu platzieren.
Ziel ist es, dass die TextView auf jedem Device am gleichen Ort dargestellt wird.

Hat jemand eine Idee wie ich das programmieren kann?
Ich hoffe diese Angaben reichen... :-)

Freundliche Grüsse
Kai

— geändert am 31.10.2012, 11:33:28

Antworten
Kai P.
  • Forum-Beiträge: 113

01.11.2012, 08:21:49 via Website

Die Versionen 2.3.3 - 4.1.2 sollten dabei unterstützt werden

Antworten
Maximilian O
  • Forum-Beiträge: 990

01.11.2012, 08:51:10 via App

Wo willst du sie denn platzieren? So ist das wie Rätselraten :)

LG Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Kai P.
  • Forum-Beiträge: 113

01.11.2012, 08:54:35 via Website

Maximilian O
Wo willst du sie denn platzieren? So ist das wie Rätselraten :)

LG Maximilian


Oh, tut mir leid...
Sie sollte etwas bei 9/10 (unten) vom Video zentriert dargestellt werden.

p.s.: finde deine Birthdays-App super cool! Hab mir schon die Vollversion gekauft :-)

— geändert am 01.11.2012, 08:55:08

Antworten
Maximilian O
  • Forum-Beiträge: 990

01.11.2012, 11:18:36 via Website

Hey Kai,
freut mich sehr, dass dir Birthdays so gut gefällt :)

Es gibt 2 Möglichkeiten die TextView an deiner gewünschten Stelle anzuordnen.
1. Möglichkeit (XML)
Du legst um deine VideoView ein RelativeLayout, welches wrap_content als Höhe und Breite hat (alternativ auch die festen Größen der VideoView).
Als 2. Element neben der VideoView legst du die TextView mit in das RelativeLayout. Mit layout_centerHorizontal="true" wird es horizontal in diesem Layout zentriert. Nun müsstest du mit marginBottom den Abstand nach unten angeben. Dies bekommst du jedoch nur grob hin, da du eben keine Prozentangaben nutzen kannst.

2. Möglichkeit (Java)
Hierzu musst du die als erstes die Höhe und Breite der VideoView holen. Da diese aber in der onCreate Methode noch nicht verfügbar sind, musst du entweder einen handler nutzen, oder die Breite berechnen. Zum Beispiel hat deine VideoView eine Margin von 30dip links und 15dip rechts. Um nun die Breite zu berechnen holst du dir Höhe und Breite des Displays
1Display display = getWindowManager().getDefaultDisplay();
2int width = display.getWidth();
3int height = display.getHeight();

Die Breite der VideoView berechnet sich nun aus display.getWidth()-45dip. Nun musst du nur noch vorher Dip in Px umrechnen:

1Resources r = getResources();
2float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, r.getDisplayMetrics());

Analog dann mit der Höhe. Die TextView positionierst du nun absolut mit

1LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
2lp.setMargins(left, top, right, bottom);
3imageView.setLayoutParams(lp);

Liebe Grüße Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Kai P.
  • Forum-Beiträge: 113

01.11.2012, 13:18:44 via Website

Maximilian O
Hey Kai,
freut mich sehr, dass dir Birthdays so gut gefällt :)

Es gibt 2 Möglichkeiten die TextView an deiner gewünschten Stelle anzuordnen.
1. Möglichkeit (XML)
Du legst um deine VideoView ein RelativeLayout, welches wrap_content als Höhe und Breite hat (alternativ auch die festen Größen der VideoView).
Als 2. Element neben der VideoView legst du die TextView mit in das RelativeLayout. Mit layout_centerHorizontal="true" wird es horizontal in diesem Layout zentriert. Nun müsstest du mit marginBottom den Abstand nach unten angeben. Dies bekommst du jedoch nur grob hin, da du eben keine Prozentangaben nutzen kannst.

2. Möglichkeit (Java)
Hierzu musst du die als erstes die Höhe und Breite der VideoView holen. Da diese aber in der onCreate Methode noch nicht verfügbar sind, musst du entweder einen handler nutzen, oder die Breite berechnen. Zum Beispiel hat deine VideoView eine Margin von 30dip links und 15dip rechts. Um nun die Breite zu berechnen holst du dir Höhe und Breite des Displays
1Display display = getWindowManager().getDefaultDisplay();
2int width = display.getWidth();
3int height = display.getHeight();

Die Breite der VideoView berechnet sich nun aus display.getWidth()-45dip. Nun musst du nur noch vorher Dip in Px umrechnen:

1Resources r = getResources();
2float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, r.getDisplayMetrics());

Analog dann mit der Höhe. Die TextView positionierst du nun absolut mit

1LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
2lp.setMargins(left, top, right, bottom);
3imageView.setLayoutParams(lp);

Liebe Grüße Maximilian

Vielen Dank für die schnelle Antwort.
Also ich habe eine PlayerView (CustomView) in einem TabLayout.

Kann ich da die Möglichkeit 2 auch anwenden? Ich sehe da noch nicht ganz durch.

Lg
Kai

Antworten
Maximilian O
  • Forum-Beiträge: 990

01.11.2012, 14:10:38 via App

Klar. Du brauchst ja nur eine beliebige View. Wie sieht denn der XML code deiner View aus?

LG Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Kai P.
  • Forum-Beiträge: 113

01.11.2012, 15:16:18 via Website

Maximilian O
Klar. Du brauchst ja nur eine beliebige View. Wie sieht denn der XML code deiner View aus?

LG Maximilian

1<?xml version="1.0" encoding="utf-8"?>
2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:gravity="center|top"
6 android:orientation="vertical" >
7
8 <ch.kandroid.mediaplayer.PlayerView
9 android:id="@+id/videoView1"
10 android:layout_width="fill_parent"
11 android:layout_height="fill_parent" >
12 </ch.kandroid.mediaplayer.PlayerView>
13
14 <RelativeLayout
15 android:layout_width="fill_parent"
16 android:layout_height="fill_parent"
17 android:layout_alignParentTop="true"
18 android:layout_marginTop="0dp" >
19
20 <TextView
21 android:id="@+id/home_wetterdescription"
22 android:layout_width="wrap_content"
23 android:layout_height="wrap_content"
24 android:layout_alignParentRight="true"
25 android:layout_alignParentTop="true"
26 android:layout_marginRight="5dp"
27 android:layout_marginTop="5dp"
28 android:text="Wetterbeschreibung"
29 android:textColor="@color/weiss"
30 android:textSize="6pt"
31 android:visibility="invisible" />
32
33 <LinearLayout
34 android:id="@+id/home_min"
35 android:layout_width="wrap_content"
36 android:layout_height="wrap_content"
37 android:layout_alignParentRight="true"
38 android:layout_below="@id/home_wetterdescription"
39 android:layout_marginRight="10dp"
40 android:layout_marginTop="8dp"
41 android:orientation="horizontal" >
42
43 <TextView
44 android:id="@+id/home_tempmin"
45 android:layout_width="wrap_content"
46 android:layout_height="wrap_content"
47 android:layout_marginRight="5dp"
48 android:text="lo"
49 android:textColor="@color/weiss"
50 android:textSize="6pt"
51 android:visibility="invisible" />
52
53 <ImageView
54 android:id="@+id/imageViewTempTief"
55 android:layout_width="wrap_content"
56 android:layout_height="wrap_content"
57 android:src="@drawable/temptief"
58 android:visibility="invisible" />
59 </LinearLayout>
60
61 <LinearLayout
62 android:id="@+id/home_max"
63 android:layout_width="wrap_content"
64 android:layout_height="wrap_content"
65 android:layout_alignParentRight="true"
66 android:layout_below="@id/home_min"
67 android:layout_marginRight="10dp"
68 android:layout_marginTop="5dp"
69 android:orientation="horizontal" >
70
71 <TextView
72 android:id="@+id/home_tempmax"
73 android:layout_width="wrap_content"
74 android:layout_height="wrap_content"
75 android:layout_marginRight="5dp"
76 android:text="hi"
77 android:textColor="@color/weiss"
78 android:textSize="6pt"
79 android:visibility="invisible" />
80
81 <ImageView
82 android:id="@+id/imageViewTempHoch"
83 android:layout_width="wrap_content"
84 android:layout_height="wrap_content"
85 android:src="@drawable/temphoch"
86 android:visibility="invisible" />
87 </LinearLayout>
88
89 <TextView
90 android:id="@+id/home_timestamp"
91 android:layout_width="wrap_content"
92 android:layout_height="wrap_content"
93 android:layout_alignParentRight="true"
94 android:layout_below="@id/home_max"
95 android:layout_marginRight="5dp"
96 android:layout_marginTop="5dp"
97 android:text="Timestamp"
98 android:textColor="@color/weiss"
99 android:textSize="6pt"
100 android:visibility="invisible" />
101
102 <TextView
103 android:id="@+id/home_cityname"
104 android:layout_width="wrap_content"
105 android:layout_height="wrap_content"
106 android:layout_alignParentTop="true"
107 android:layout_centerHorizontal="true"
108 android:layout_marginTop="403dp"
109 android:text="city"
110 android:textColor="@color/black"
111 android:textSize="8pt"
112 android:visibility="invisible" />
113
114 <TextView
115 android:id="@+id/home_tempnow"
116 android:layout_width="wrap_content"
117 android:layout_height="wrap_content"
118 android:layout_alignParentRight="true"
119 android:layout_marginRight="55dp"
120 android:layout_marginTop="20dp"
121 android:text="12°"
122 android:textColor="@color/weiss"
123 android:textSize="20pt"
124 android:visibility="invisible" />
125 </RelativeLayout>
126
127</RelativeLayout>

Antworten
Kai P.
  • Forum-Beiträge: 113

03.11.2012, 11:22:10 via Website

Maximilian O
Klar. Du brauchst ja nur eine beliebige View. Wie sieht denn der XML code deiner View aus?

LG Maximilian

Hast du eine Idee? >_>

Lg Kai

Antworten
Maximilian O
  • Forum-Beiträge: 990

06.11.2012, 20:39:34 via Website

Hey,
da deine VideoView ja über den kompletten Bildschirm geht ist die Bildschirmbreite (display.getWidth()) gleich der Viewbreite, analog dazu die Höhe.

Um nun eine deiner TextView so zu positionieren wie du es möchtest musst du dir die TextView zuerst als Objekt holen
1TextView deineTextView = (TextView) findViewById(....);

Nun gibst dieser einfach neue LayoutParams und setzt dort die margins:
1RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
2lp.setMargins(0, display.getHeight()*0.9, 0, 0);
3lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
4deineTextView.setLayoutParams(lp);

Eventuell musst du noch einmal mit der ersten 0 in den Margins rumprobieren, sollte aber klappen.

Liebe Grüße Maximilian

— geändert am 06.11.2012, 20:40:13

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Kai P.
  • Forum-Beiträge: 113

08.11.2012, 08:22:48 via Website

Maximilian O
Hey,
da deine VideoView ja über den kompletten Bildschirm geht ist die Bildschirmbreite (display.getWidth()) gleich der Viewbreite, analog dazu die Höhe.

Um nun eine deiner TextView so zu positionieren wie du es möchtest musst du dir die TextView zuerst als Objekt holen
1TextView deineTextView = (TextView) findViewById(....);

Nun gibst dieser einfach neue LayoutParams und setzt dort die margins:
1RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
2lp.setMargins(0, display.getHeight()*0.9, 0, 0);
3lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
4deineTextView.setLayoutParams(lp);

Eventuell musst du noch einmal mit der ersten 0 in den Margins rumprobieren, sollte aber klappen.

Liebe Grüße Maximilian

Hallo Maximilian

Hat super geklappt! Vielen Dank! Ich habe da aber noch eine andere Frage:
Wie du siehst habe ich ja eine eigene PlayerView im Layout die Videos von 720x1280 empfängt.
Wie bringe ich es nun hin das diese Videos auf allen Devices scharf und unverzogen angezeigt werden?

Vielen, vielen Dank für Deine Hilfe!

Lieber Gruss
Kai

Antworten