2012-01-17 4 views
2

표면 뷰 위에 일반 뷰 객체를 표시하려고 할 때 문제가 발생했습니다. 문제는 다음과 같습니다. 레이아웃 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가 투명 영역을 계산할 때 겹쳐진 영역이 보이지 않는 것으로 간주되어 영역의 페인팅이 올바르지 않습니다.

SurfaceView가 창에 부착되어있는 경우 표시되지 않으면 위젯의 가시성을 변경하면 requestTransparentRegion을 호출하여 문제를 해결하십시오.

예를 들어, mWidget.getParent(). requestTransparentRegion (mSurfaceView)를 호출 할 수 있습니다.

ViewRoot가 뷰 계층 구조의 루트 부모이므로이 메소드는 SurfaceView의 부모를 호출하여 transparentRegion을 요청하는 것과 동일한 효과를 나타냅니다.

+1

훌륭함, 나를 위해 일했습니다! – mach

+0

이상하지만 작동합니다. 제 경우에는보기가 매번 표면보기 위에 표시되지 않았습니다. 비록 거기에 있었고 보이지 않는 단추를 클릭 할 수있었습니다. 그러나 toolBar.requestTransparentRegion (toolBar)을 사용하면 항상 표시됩니다. 감사! – Lumis

관련 문제