2011-03-25 148 views
2

我试着在SurfaceView的顶部显示VideoView。但它不可见,但对点击有反应(MediaController出现,声音播放)。视频似乎SurfaceView后面要播放,所以我也试图使setZOrderMediaOverlay()和/或setZOrderOnTop()使用,但什么都没有改变SurfaceView上的VideoView

当我去到主屏幕,我看到了VideoView在衰落动画第二分裂,所以它真的在那里。

我试着用xml布局,也完全编程,但没有任何作品。

这里是我的活动:

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); 
     } 
    } 
} 

我的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> 

一个提示:由于这只是一个测试,找出为什么它不工作我试图尽量减少代码从我的真实应用程序中,VideoView的可见性由处理程序控制,该处理程序从SurfaceView的绘图线程获取消息。这就是为什么当我使用菜单时,我实现了一个线程发送消息。

回答

3

我不认为你可以有重叠的SurfaceViews,根据this thread由Android框架工程师回答:

对不起,你不能做到这一点 - 因为 表面的观点是非常特殊的,不是 真的意见(表面是一个 独立的窗口Z-订购与您的 自己),他们的Z排序不匹配 您的意见。表面视图是一个很大的重物,你不打算 像这样处理常规视图 。

+1

但我在特殊情况下工作。在我的真实应用程序中,我可以用对话框主题调用另一个活动,并立即将VideoView放在顶部并保持在那里,即使我关闭顶部的活动。所以不知何故它的工作,但我无法控制它......感谢链接,反正! – WarrenFaith 2011-03-25 14:22:49

+0

看起来我需要在SurfaceView上实现我自己的视频播放器...或者在API演示中找到它:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android /apis/media/MediaPlayerDemo_Video.html – WarrenFaith 2011-03-25 14:34:44

+0

@WarrenFaith嘿,很久以前,但也许你会来:我认为它适用于当你显示视频时隐藏表面视图,反之亦然!?谢谢! – sjkm 2015-11-30 09:15:51