2012-01-17 63 views
2

我遇到了这个问题,当我想在surfaceview顶部显示一个普通的视图对象时。 问题是: 如果在布局xml文件中将普通视图的可见性设置为不可见,则刷新视图不正确 - 视图和表面视图的重叠区域无法更新。 如果我将普通视图的可见性设置为在布局xml中可见,则没有问题。刷新时出现错误在SurfaceView上查看

这里是我的测试代码:

package com.test; 

import java.io.IOException; 


import android.app.Activity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnPreparedListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.LinearLayout; 


public class TESTActivity extends Activity implements Callback, OnPreparedListener { 
    private SurfaceView mSurface1; 
    private SurfaceHolder mSurfaceHolder1; 
    private MediaPlayer mMediaPlayer1; 
    private LinearLayout mLayout; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mLayout = (LinearLayout) findViewById(R.id.channel_subscribe); 

     new Handler() { 
      @Override 
      public void handleMessage(Message m) { 
       if(mLayout.getVisibility() == View.INVISIBLE) 
        mLayout.setVisibility(View.VISIBLE); 
       else 
        mLayout.setVisibility(View.INVISIBLE); 
       this.sendEmptyMessageDelayed(0, 4000); 
      } 
     }.sendEmptyMessageDelayed(0, 4000); 

     mSurface1 = (SurfaceView) findViewById(R.id.video_surface); 
     mSurfaceHolder1 = mSurface1.getHolder(); 
     mSurfaceHolder1.addCallback(this); 
     mSurfaceHolder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     mMediaPlayer1 = new MediaPlayer(); 
     mMediaPlayer1.setOnPreparedListener(this); 

     try { 
      mMediaPlayer1.setDataSource("/sdcard/d4.avi"); 
     } catch (IllegalArgumentException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     Log.w("XXXXX", "Surface1 created"); 
     mMediaPlayer1.setDisplay(holder); 
     mMediaPlayer1.prepareAsync(); 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onPrepared(MediaPlayer mp) { 
     Log.w("XXXXX", "Mediaplayer prepared"); 
     mp.start(); 
    } 
} 

这里是布局文件:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <SurfaceView android:id="@+id/video_surface" 
     android:layout_width="480dip" 
     android:layout_height="270dip" 
     android:layout_marginLeft="180dip" 
     android:layout_marginTop="40dip" 
     /> 
    <LinearLayout android:id="@+id/channel_subscribe" android:visibility="invisible" android:orientation="vertical" android:background="#bb161616" android:layout_width="436.0sp" android:layout_height="148.0sp" android:layout_alignParentBottom="true"> 
     <TextView android:textSize="14.0dip" android:textStyle="normal" android:textColor="#ffb7b7b7" android:id="@+id/subscribe_title" android:layout_width="wrap_content" android:layout_height="70.0sp" android:layout_marginLeft="38.0sp" android:layout_marginTop="18.0sp" android:layout_marginRight="34.0sp" android:text="We Hope you enjoyed the channel preview. To subscribe this channel, please press the button below." /> 
     <Button android:id="@+id/subscribe_now_button" android:layout_width="184.0sp" android:layout_height="42.0sp" android:layout_marginLeft="38.0sp" android:layout_marginRight="34.0sp" android:layout_marginBottom="18.0sp" android:text="SubscribeNow" /> 
    </LinearLayout> 



</RelativeLayout> 

回答

13

问题解决了。

过程是:

  1. 的订阅充气活性布局过程对话框窗口小部件为不可见初始化。
  2. 然后将用于播放视频的SurfaceView附加到活动窗口。
  3. 当SurfaceView调用mParent.requestTransparentRegion(this);在回调onAttachedToWindow()中,对话框小部件不可见
  4. 当ViewRoot计算透明区域时,重叠区域被视为不可见,然后该区域的绘制不正确。

要解决此问题,请在更改窗口小部件的可见性时调用requestTransparentRegion,如果它在SurfaceView连接到窗口时不可见。

例如,您可以调用mWidget.getParent()。requestTransparentRegion(mSurfaceView)。

由于ViewRoot是视图层级的根父级,因此调用SurfaceView的父级请求transparentRegion的效果相同。

+1

非常好,为我工作! – mach 2012-03-29 06:42:20

+0

奇怪,但这个工程。在我的情况下,每次都没有在视图顶部显示视图,即使它在那里,我可以点击其不可见的按钮。但使用toolBar.requestTransparentRegion(toolBar)后,它始终显示。谢谢! – Lumis 2013-02-20 13:21:46