SurfaceView播放视频发送弹幕+实现滚动歌词

SurfaceView使用步骤

使用SurfaceView的步骤:

  • 首先要继承SurfaceView,实现SurfaceHolder.Callback接口。
  • 重写方法:
    surfaceChanged:surface大小或格式发生变化时触发,在surfaceCreated调用后该函数至少会被调用一次。
  • surfaceCreated:Surface创建时触发,一般在这个函数开启绘图线程(新的线程,不要再这个线程中绘制Surface)。
  • surfaceDestroyed:销毁时触发,一般不可见时就会销毁。
  • 利用getHolder()获取SurfaceHolder对象,调用SurfaceHolder.addCallback添加回调
  • SurfaceHolder.lockCanvas 获取Canvas对象并锁定画布,调用Canvas绘图, SurfaceHolder.unlockCanvasAndPost 结束锁定画布,提交改变。

SurfaceHolder

SurfaceHolder回调自己的三个生命周期:

  • surfaceCreated(SurfaceHolder holder)创建时
  • surfaceChanged(SurfaceHolder holder, int format, int width, int height)改变时
  • surfaceDestroyed(SurfaceHolder holder)销毁时

SurfaceView播放视频并可以发送弹幕

需要准备两个SurfaceView,一个是负责播放视频,一个负责展示弹幕。弹幕是展示在视频上面的,所以我们要给展示弹幕的SurfaceView设置两个方法:
surfaceView_danmu.setZOrderOnTop(true); ——置于上方
surfaceView_danmuHolder.setFormat(PixelFormat.TRANSPARENT); ——背景透明

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
   
    
    public static final int PROGRESS = 101;

    SurfaceView  surfaceView,surfaceView_danmu;
    SurfaceHolder surfaceHolder,surfaceView_danmuHolder;
    MediaPlayer mediaPlayer = new MediaPlayer();
    String path = "/sdcard/aa.mp4";
    SeekBar seekBar;
    Timer timer;
    EditText editText;
    Button button,bt_start,bt_stop;
    int x = 0;

    ArrayList<DanMu> list = new ArrayList<>();
    Handler handler = new Handler(){
   
        @Override
        public void handleMessage(Message msg) {
   
            super.handleMessage(msg);
            if (msg.what == PROGRESS){
   
                seekBar.setProgress((Integer) msg.obj);
                mediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
   
                    @Override
                    public void onSeekComplete(MediaPlayer mp) {
   
                        Toast.makeText(MainActivity.this, "播放完毕!", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = findViewById(R.id.sufaceview);
        surfaceView_danmu = findViewById(R.id.sufaceview_danmu);
        editText = findViewById(R.id.et);
        button = findViewById(R.id.bt_send);
        seekBar = findViewById(R.id.bar);
        bt_start = findViewById(R.id.bt_start);
        bt_stop = findViewById(R.id.bt_stop);

        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);

        surfaceView_danmuHolder = surfaceView_danmu.getHolder();
        surfaceView_danmuHolder.addCallback(this);
        surfaceView_danmu.setZOrderOnTop(true);
        surfaceView_danmuHolder.setFormat(PixelFormat.TRANSPARENT);

        if (mediaPlayer!=null) {
   
            
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值