SurfaceView加載視頻時扣掉activity的一塊布局怎么解決
求教
uj5u.com熱心網友回復:
為什么是這樣uj5u.com熱心網友回復:
我也搞不明白 這個SurfaceView好像把這個activity挖空了一塊 直接顯示手機桌面了uj5u.com熱心網友回復:
上代碼 是draw的時候出錯了uj5u.com熱心網友回復:
public class VideoView extends AbsView {
private Button bt; // 用于開始和暫停的按鈕
private SurfaceView pView; // 繪圖容器物件,用于把視頻顯示在螢屏上
private String url; // 視頻播放地址
private MediaPlayer mediaPlayer; // 播放器控制元件
private int postSize; // 保存義播視頻大小
private SeekBar seekbar; // 進度條控制元件
private boolean flag = true; // 用于判斷視頻是否在播放中
private RelativeLayout rl;
private boolean display; // 用于是否顯示其他按鈕
private View view; // ProgressBar
private upDateSeekBar update; // 更新進度條用
public VideoView(Context context) {
super(context);
init(); // 初始化資料
url = "http://flv2.bn.netease.com/videolib3/1607/12/QpHhw9884/SD/QpHhw9884-mobile.mp4"; // 視頻播放地址
setListener(); // 系結相關事件
}
@Override
public int layoutResId() {
return R.layout.view_video;
}
@Override
public void loadData(Object data) {
}
@Override
public boolean isEmpty() {
return false;
}
private void init() {
mediaPlayer = new MediaPlayer(); // 創建一個播放器物件
update = new upDateSeekBar(); // 創建更新進度條物件
seekbar = (SeekBar) findViewById(R.id.seekbar); // 進度條
bt = (Button) findViewById(R.id.play);
bt.setEnabled(false); // 剛進來,設定其不可點擊
pView = (SurfaceView) findViewById(R.id.mSurfaceView);
pView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 不緩沖
pView.getHolder().setKeepScreenOn(true); // 保持螢屏高亮
pView.getHolder().addCallback(new surFaceView()); // 設定監聽事件
rl = (RelativeLayout) findViewById(R.id.rl2);
view = findViewById(R.id.pb);
bt.setVisibility(View.GONE);
rl.setVisibility(View.GONE);
}
class PlayMovie extends Thread { // 播放視頻的執行緒
int post = 0;
public PlayMovie(int post) {
this.post = post;
}
@Override
public void run() {
Message message = Message.obtain();
try {
Log.i("hck", "runrun " + url);
mediaPlayer.reset(); // 回復播放器默認
mediaPlayer.setDataSource(url); // 設定播放路徑
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDisplay(pView.getHolder()); // 把視頻顯示在SurfaceView上
mediaPlayer.setOnPreparedListener(new Ok(post)); // 設定監聽事件
mediaPlayer.prepare(); // 準備播放
} catch (Exception e) {
message.what = 2;
Log.e("hck", e.toString());
}
super.run();
}
}
class Ok implements OnPreparedListener {
int postSize;
public Ok(int postSize) {
this.postSize = postSize;
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.i("hck", "play");
Log.i("hck", "post " + postSize);
view.setVisibility(View.GONE); // 準備完成后,隱藏控制元件
bt.setVisibility(View.GONE);
rl.setVisibility(View.GONE);
bt.setEnabled(true);
display = false;
if (mediaPlayer != null) {
mediaPlayer.start(); // 開始播放視頻
} else {
return;
}
if (postSize > 0) { // 說明中途停止過(activity呼叫過pase方法,不是用戶點擊停止按鈕),跳到停止時候位置開始播放
Log.i("hck", "seekTo ");
mediaPlayer.seekTo(postSize); // 跳到postSize大小位置處進行播放
}
new Thread(update).start(); // 啟動執行緒,更新進度條
}
}
private class surFaceView implements Callback { // 上面系結的監聽的事件
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) { // 創建完成后呼叫
if (postSize > 0 && url != null) { // 說明,停止過activity呼叫過pase方法,跳到停止位置播放
new PlayMovie(postSize).start();
flag = true;
int sMax = seekbar.getMax();
int mMax = mediaPlayer.getDuration();
seekbar.setProgress(postSize * sMax / mMax);
postSize = 0;
view.setVisibility(View.GONE);
} else {
new PlayMovie(0).start(); // 表明是第一次開始播放
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) { // activity呼叫過pase方法,保存當前播放位置
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
postSize = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
flag = false;
view.setVisibility(View.VISIBLE);
}
}
}
private void setListener() {
mediaPlayer
.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
}
});
mediaPlayer
.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { // 視頻播放完成
@Override
public void onCompletion(MediaPlayer mp) {
flag = false;
bt.setBackgroundResource(R.drawable.movie_play_bt);
}
});
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
}
});
/**
* 如果視頻在播放,則呼叫mediaPlayer.pause();,停止播放視頻,反之,mediaPlayer.start()
* ,同時換按鈕背景
*/
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mediaPlayer.isPlaying()) {
bt.setBackgroundResource(R.drawable.movie_play_bt);
mediaPlayer.pause();
postSize = mediaPlayer.getCurrentPosition();
} else {
if (flag == false) {
flag = true;
new Thread(update).start();
}
mediaPlayer.start();
bt.setBackgroundResource(R.drawable.movie_stop_bt);
}
}
});
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int value = seekbar.getProgress() * mediaPlayer.getDuration() // 計算進度條需要前進的位置資料大小
/ seekbar.getMax();
mediaPlayer.seekTo(value);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
/**
* 點擊螢屏,切換控制元件的顯示,顯示則應藏,隱藏,則顯示
*/
pView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (display) {
bt.setVisibility(View.GONE);
rl.setVisibility(View.GONE);
display = false;
} else {
rl.setVisibility(View.VISIBLE);
bt.setVisibility(View.VISIBLE);
pView.setVisibility(View.VISIBLE);
/**
* 設定播放為全屏
*/
ViewGroup.LayoutParams lp = pView.getLayoutParams();
lp.height = LayoutParams.FILL_PARENT;
lp.width = LayoutParams.FILL_PARENT;
pView.setLayoutParams(lp);
display = true;
}
}
});
}
/**
* 更新進度條
*/
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (mediaPlayer == null) {
flag = false;
} else if (mediaPlayer.isPlaying()) {
flag = true;
int position = mediaPlayer.getCurrentPosition();
int mMax = mediaPlayer.getDuration();
int sMax = seekbar.getMax();
seekbar.setProgress(position * sMax / mMax);
} else {
return;
}
};
};
class upDateSeekBar implements Runnable {
@Override
public void run() {
mHandler.sendMessage(Message.obtain());
if (flag) {
mHandler.postDelayed(update, 1000);
}
}
}
}其中這個view繼承的是一個繼承于fragment的基類
uj5u.com熱心網友回復:
1, 是不是沒釋放2, 還沒開始播放吧 ? 是創建播放串列后就這樣顯示了?
3, 創建播放串列為什么不考慮用ListView?
uj5u.com熱心網友回復:
是忘記添加釋放了 已經加上 最上邊截的圖是在加載網路視頻 還沒有播放前出現的背景 我寫的是播放單個網路視頻應該不用ListView吧uj5u.com熱心網友回復:
你好,請問一下,評論里面所說的沒有釋放是指啥,能給一下示范的代碼么。我這邊出現一個問題,是surfaceview頻繁創建銷毀時出現,挖空,透出surfaceview下面的資訊,和你這個有點像,希望看看你的解決方法轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/65708.html
標籤:Android
下一篇:[求助]
