4

ユーザーが場所を変更したときに、Google マップの上でビデオを再生しようとしています。最初に activity_main.xml で、videoview は非表示に設定されています。ビデオが再生されようとしているときに、ビデオビューを表示して setZOrderOnTop(true) に設定します。

ビデオが onLocationChanged によってトリガーされると、ビデオビューは表示されません。しかし、私はビデオからオーディオを聞くことができるので、それが再生されていることを知っています.

ただし、onCreate で最初にビデオを再生すると、正常に再生され、画面に表示されます。また、onLocationChanged ビデオも再生され、画面に表示されます。

onCreate でビデオを再生しないとビデオビデオ ビューが表示されないのはなぜですか?

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:gravity="center" >

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView android:id="@+id/top_message"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:minWidth="110sp" android:textColor="#66CCFF"
        android:textStyle="bold" android:textSize="20sp" android:text="Default Text" />

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_below="@id/top_message"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal" /> 

</RelativeLayout>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <VideoView 
        android:visibility="invisible"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:id="@+id/myVideo"
        android:gravity="center"
        android:layout_centerInParent="true" />

    </RelativeLayout>

</FrameLayout>

MainActivity.java

public class MainActivity extends FragmentActivity implements LocationListener {

private GoogleMap googleMap;
private TextView distanceTextView;
private VideoView videoView;
private LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);        

    // setup overlay for text
    distanceTextView = (TextView)findViewById(R.id.top_message);
    distanceTextView.setText("Text set onCreate");

    // setup overlay for video
    videoView = (VideoView) findViewById(R.id.myVideo);

    // setup google map data
    googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap();
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.getUiSettings().setCompassEnabled(true);
    googleMap.getUiSettings().setZoomControlsEnabled(true);
    googleMap.setMyLocationEnabled(true);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 1, this);
    Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    // set current location and move map to that location
    if (location != null) {
        LatLng myPosition = new LatLng(location.getLatitude(),location.getLongitude());
        googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(myPosition, 15));
    }

    // if below is uncommented then secondvideo will also appear 
    //playVideo(new String("android.resource://" + getPackageName() + "/" + R.raw.firstvideo));

}

public void onLocationChanged(Location location) {
    locationManager.removeUpdates(this);
    distanceTextView.setText("Location has changed");
    playVideo(new String("android.resource://" + getPackageName() + "/" + R.raw.secondvideo));          
}

private void playVideo(String videoFile) {
    videoView.setVisibility(View.VISIBLE);
    videoView.setZOrderOnTop(true);

    MediaController mediaController = new MediaController(this);
    mediaController.setAnchorView(videoView);
    videoView.setMediaController(mediaController);
    videoView.setVideoPath(videoFile);
    videoView.start();
    videoView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            videoView.setVisibility(View.INVISIBLE);
            videoView.setZOrderOnTop(false);
            videoView.stopPlayback();
            return false;
        }
    });
}

@Override
public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub
}

@Override
public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub
}

@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub

}

}
4

1 に答える 1

3

setZOrderOnTop()z レベルを動的に変更するために使用することはできません。ドキュメントから、

これは、サーフェス ビューを含むウィンドウがウィンドウ マネージャーにアタッチされる前に設定する必要があることに注意してください。

ビューがアタッチされると、 を呼び出しsetZOrderOnTop()ても効果はありません。解決策の 1 つは、常に をVideoView一番上に置き、.setVisibility()既に行っているように表示されるかどうかを制御することです。で1 つの呼び出しを使用できますsetZOrderOnTop()onCreate()これが、でビデオを再生したときに機能した理由と思われonCreateます。

于 2013-01-11T00:14:24.520 に答える