2012-01-17 72 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

相關問題