VideoView auf der Oberseite der SurfaceView
Ich versuche zu zeigen, einen VideoView
auf der Spitze eines SurfaceView
. Aber es ist nicht sichtbar, sondern reagiert auf Klicks (MediaController wird angezeigt, und der Ton spielt). Das video scheint gespielt zu werden, hinter der SurfaceView
also ich habe auch versucht zu nutzen setZOrderMediaOverlay()
- und/oder setZOrderOnTop()
aber nichts geändert
Wenn ich auf der Startseite sehe ich die VideoView für einen Sekundenbruchteil in die fading-animation, so es ist wirklich es.
Versuchte ich es mit einer xml-layout-und auch ganz programmatisch, aber nichts funktioniert.
Hier ist meine Aktivität:
public class VideoTest extends Activity {
private RelativeLayout mLayout;
private VideoView mVideo;
private Handler mHandler;
private FrameLayout mFrameLayout;
private SurfaceView mSurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFrameLayout = new FrameLayout(this);
mFrameLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mLayout = new RelativeLayout(this);
mLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mVideo = new VideoView(this);
mVideo.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
mSurfaceView = new SurfaceView(this);
mSurfaceView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mSurfaceView.setZOrderMediaOverlay(false);
mSurfaceView.setZOrderOnTop(false);
mFrameLayout.addView(mSurfaceView);
mLayout.addView(mVideo);
mFrameLayout.addView(mLayout);
setContentView(mFrameLayout);
//with xml
// setContentView(R.layout.main);
// mFrameLayout = (FrameLayout) findViewById(R.id.activity_reader);
// mLayout = (RelativeLayout) findViewById(R.id.videoview);
// mVideo = (VideoView) findViewById(R.id.video_view);
// mSurfaceView = (SurfaceView) findViewById(R.id.surface_view);
//Set the handler to me messaged from the threads
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg != null) {
mVideo.setMediaController(new MediaController(mVideo.getContext()));
mVideo.setVideoPath("/mnt/sdcard/myvideo.mp4");
if (mLayout.getVisibility() == View.VISIBLE) {
mLayout.setVisibility(View.GONE);
} else {
mLayout.setVisibility(View.VISIBLE);
}
// mFrameLayout.bringChildToFront(mLayout);
// mFrameLayout.bringChildToFront(mVideo);
// mFrameLayout.requestLayout();
// mFrameLayout.invalidate();
// mFrameLayout.postInvalidate();
// mVideo.requestFocus();
}
super.handleMessage(msg);
}
};
}
/** Inflate the menu */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_reader_menu, menu);
return true;
}
/** Handle menu items events */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.toggle_video:
new Thread() {
public void run() {
mHandler.sendEmptyMessage(0);
};
}.start();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Mein xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_reader"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<RelativeLayout android:id="@+id/videoview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone">
<VideoView android:id="@+id/video_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
</FrameLayout>
Einen Hinweis: dies ist nur ein test, um herauszufinden, warum es nicht funktioniert habe ich versucht zu minimieren, den code aus meinem realen Anwendung, wo die Sichtbarkeit des VideoView
wird gesteuert durch eine Prozedur, die eine Nachricht aus der Zeichnung Gewinde der SurfaceView
. Das ist der Grund, warum ich implementiert einen thread, die die Nachricht sendet, wenn das Menü verwendet wurde.
InformationsquelleAutor WarrenFaith | 2011-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass Sie überlappende SurfaceViews, nach dieser thread beantwortet von einem Android framework engineer:
Sieht aus wie ich implementieren müssen, um meine eigenen video-player auf die surfaceview ich haben... oder finden Sie diese auf der API-demos: developer.android.com/resources/samples/ApiDemos/src/com/...
Hey, vor langer Zeit, aber vielleicht kommen Sie um: ich denke, es funktioniert, wenn Sie nur ausblenden, die surfaceview, wenn Sie zeigen, die videview-und Umgekehrt!? Danke!
Leider war keine alternative, denn das Video wurde nie im Vollbildmodus. Also ich sah immer die SurfaceView Inhalt dahinter.
Überlappende surfaceViews sind möglich mit der Antwort von diesem Beitrag: stackoverflow.com/questions/18358852/.... Ich habe dies selbst für video-Anwendungen, es funktioniert ganz gut.
InformationsquelleAutor Matthew Willis