今天是內容是給遊戲添加一個視頻,用於開場公司logo播放。
要求:
1.不要出現播放器那種 "開始","暫停" "快進""快退"等按鈕。
2.播放完成後需要事件監聽移除掉視頻。
首先在android中播放視頻預設支援3GP,MP4格式,如果你需要支援其他格式必須軟解碼其他格式檔案。
因為我做的不是一個播放器只需要在遊戲開頭播放一下視頻就行了,所以這裡選用MP4格式。
然後API的選擇有 MediaPlayer和VideoView
用MediaPlayer要自己編寫響應的代碼,如果你熟悉MediaPlayer只是稍微複雜一點而已。
用VideoView 是android已經封裝好的View 它繼承自SurfaceView並實現了MediaPlayerControl介面。
稍微想了下,毫不猶豫的選擇了VideoView 。
首先要重寫VideoView因為他預設不是全屏的,我需要全屏
package ss.ss;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.VideoView;
public class MyVideoView extends VideoView {
public static int WIDTH;
public static int HEIGHT;
public MyVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(WIDTH, widthMeasureSpec);
int height = getDefaultSize(HEIGHT, heightMeasureSpec);
setMeasuredDimension(width,height);
}
}
XML代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ss.ss.MyVideoView
android:id="@+id/surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>
注意在
這裡設定為fill_parent或者wrap_content都是無影響的,他不會因為你設定成fill_parent就讓視頻全屏播放,感興趣的朋友可以查VideoView.onMeasure()源碼,視頻的尺寸由
這個方法控制,它是根據比例來顯示的,所以我上面需要重寫VideoView.onMeasure();
然後我們看下Activity的代碼:
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ss.ss;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;
public class VideoViewDemo extends Activity implements OnCompletionListener {
/**
* TODO: Set the path variable to a streaming video URL or a local media
* file path.
*/
private String path = "/sdcard/main.mp4";
private MyVideoView mVideoView;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.videoview);
mVideoView = (MyVideoView) findViewById(R.id.surface_view);
mVideoView.setOnCompletionListener(this);
DisplayMetrics dm = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(dm);
MyVideoView.WIDTH=dm.widthPixels;
MyVideoView.HEIGHT=dm.heightPixels;
if (path == "") {
// Tell the user to provide a media file URL/path.
Toast.makeText(
VideoViewDemo.this,
"Please edit VideoViewDemo Activity, and set path"
+ " variable to your media file URL/path",
Toast.LENGTH_LONG).show();
} else {
/*
* Alternatively,for streaming media you can use
* mVideoView.setVideoURI(Uri.parse(URLstring));
*/
//mVideoView.setVideoPath(path);
mVideoView.setVideoURI(Uri.parse("android.resource://ss.ss/"+R.raw.main));
//如果你需要添加控制條就取消改注釋
//mVideoView.setMediaController(new MediaController(this));
//1.6中測試自動播放的播放代碼是不需要.start()
//2.1中測試自動播放的播放代碼
// mVideoView.start();
//所以為了相容性 我們選擇mVideoView.start();保證所有版本都在開始時自動播放
mVideoView.start();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
System.exit(0);
}
@Override
public void onCompletion(MediaPlayer mp) {
System.out.println("播放完成");
}
}
這裡大部分是API demo中的源碼,稍微做了下修改。
1.如果需要播放工程資源中的視頻則需要使用 mVideoView.setVideoURI(Uri.parse("android.resource://ss.ss/"+R.raw.main));
2.如果需要播放SD卡中的檔案則請看上面代碼中
private String path = "/sdcard/main.mp4";
//mVideoView.setVideoPath(path);
3.播放完成後的事件處理
@Override
public void onCompletion(MediaPlayer mp) {
System.out.println("播放完成");
}
實現implements OnCompletionListener並且設定 mVideoView.setOnCompletionListener(this);
4.吧裝置的解析度傳到VideoView中用於適用不同解析度的裝置
總結:
在播放視頻的問題上 我遇到了以下這些問題
1.首先全屏播放時需要重寫onMeasure的
2.不同版本下 有的會自動播放,有的不會自動播放。所以為了統一請採用VideoView.start()因為在1.6中 你不設定VideoView.start()他也會自動播放,但在2.1測試中必須明確