我有以下代码:
public class MainActivity extends Activity {
MediaPlayer player;
Button playBtn;
FrameLayout frame;
boolean plaing = false;
Uri uri;
volatile boolean surfaceReady;
boolean drawCanvas = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playBtn = (Button) findViewById(R.id.play);
playBtn.setOnClickListener(new CKL());
frame = (FrameLayout) findViewById(R.id.FrameForVideo);
createSurfaceView(frame);
player = new MediaPlayer();
player.setLooping(true);
String urri = "android.resource://com.example.videoplayer/raw/id_1_l_belen";
uri = Uri.parse(urri);
Log.d("atf", urri);
}
@Override
protected void onPause() {
player.stop();
player.reset();
player.release();
super.onPause();
}
private class CKL implements OnClickListener{
@Override
public void onClick(View v) {
if (!plaing)
{
try
{
player.setDataSource(MainActivity.this, uri);
player.setLooping(true);
player.prepare();
player.start();
plaing = true;
Log.d("atf", "Player started");
} catch (Throwable e) {
Error er = new Error(e);
throw er;
}
}
else
{
surfaceReady = false;
player.stop();
player.reset();
plaing = false;
createSurfaceView(frame);
}
}
}
private class SurfaceCreationLisatener implements SurfaceHolder.Callback{
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {
player.setDisplay(holder);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {}
}
private void createSurfaceView(FrameLayout frame){
frame.removeAllViews();
SurfaceView surfaceView = new SurfaceView(MainActivity.this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
surfaceView.setLayoutParams(lp);
surfaceView.getHolder().addCallback(new SurfaceCreationLisatener());
frame.addView(surfaceView);
}
}
基本上,我使用MediaPlayer在SurfaceView上渲染视频。问题是这个SurfaceView是黑色的,设置背景颜色是没用的,因为它的行为不像普通的View。
基本上,我需要使视图的黑色背景不可见。在视频不播放时使整个表面看不见的解决方法不适合我。 我需要将表面放在ListView中,即使正在播放视频,滚动时黑色表面也会闪烁。 (看起来很难看) 我也尝试使用TextureView,但还有另一个问题: 当一次浏览多个视频时,这些视频会出现故障,因为在TextureView上渲染会消耗更多资源。
对我来说,一个解决方案是将SurfaceView涂成白色,这样MediaPlayer可以在白色表面上渲染它的内容,但我不知道如何做到这一点。 以下代码无效。
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas cnvs = holder.lockCanvas();
cnvs.drawColor(Color.WHITE);
holder.unlockCanvasAndPost(cnvs);
player.setDisplay(holder);
}
绘制曲面后,MediaPlayer未显示任何内容。看起来它不使用表面。为什么?......不知道。
我很感激您的任何想法。 感谢。
答案 0 :(得分:0)
也许你可以试试这个:把你的surfaceview放在一个framelayout上(它可能是你已经在你的createSurfaceView上使用的那个),另一个视图放在你的surfaceview上。这个新视图可以只是一个带有白色背景的按钮(甚至更好,缩略图或视频的静止帧),并将其设置为与surfaceview相同的宽度和高度。然后,在单击此按钮的同时隐藏它以显示表面视图并播放视频。