SurfaceView高级加MediaPlayer

用SurfaceView和MediaPlayer实现播放mp3和加载歌词

package com.example.surfaceviewmediaplayer_01.fragments;


import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.SeekBar;

import com.example.surfaceviewmediaplayer_01.R;

import java.util.Timer;
import java.util.TimerTask;

/**
 * A simple {@link Fragment} subclass.
 */
public class diyiFragment extends Fragment implements SurfaceHolder.Callback {

    private Button buttonPlay;
    private Button buttonStart;
    private Button buttonStop;
    private SeekBar seekBarId;
    private SurfaceView surfaceId;
    private SurfaceHolder holder;
    private MediaPlayer mediaPlayer;

    public diyiFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.fragment_diyi, container, false);
        buttonPlay = (Button) inflate.findViewById(R.id.button_play);
        seekBarId = (SeekBar) inflate.findViewById(R.id.seekBar_id);
        surfaceId = (SurfaceView) inflate.findViewById(R.id.surface_id);
        buttonStart = (Button) inflate.findViewById(R.id.button_start);
        buttonStop = (Button) inflate.findViewById(R.id.button_stop);

        holder = surfaceId.getHolder();
        holder.addCallback(this);
        mediaPlayer = new MediaPlayer();

        buttonPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.reset();
                try {
                    mediaPlayer.setDataSource("/mnt/sdcard/okgo.mp3");
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            seekBarId.setMax(mediaPlayer.getDuration());
                            mediaPlayer.start();
                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    int x = getActivity().getWindow().getDecorView().getScrollX();
                                    while (true){
                                        x = x-10;
                                        showGeCi(x);
                                        try {
                                            Thread.sleep(196);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                            }).start();

                            Timer timer = new Timer();
                            timer.schedule(new TimerTask() {
                                @Override
                                public void run() {
                                    seekBarId.setProgress(mediaPlayer.getCurrentPosition());
                                }
                            },0,1000);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        seekBarId.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                mediaPlayer.pause();
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mediaPlayer.start();
            }
        });

        buttonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mediaPlayer.isPlaying()){
                    mediaPlayer.start();
                }
            }
        });

        buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                }
            }
        });

        return inflate;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    private void showGeCi(int x){
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setTextSize(48);

        Canvas canvas = holder.lockCanvas();
        canvas.drawColor(PixelFormat.TRANSPARENT, PorterDuff.Mode.CLEAR);
        canvas.drawText(getGeCi(),x,96,paint);
        holder.unlockCanvasAndPost(canvas);
    }

    public String getGeCi(){
        return "喜欢你\n" +
                "作词:黄家驹\n" +
                "作曲:黄家驹\n" +
                "演唱:邓紫棋\n" +
                "细雨带风湿透黄昏的街道\n" +
                "抹去雨水双眼无故地仰望\n" +
                "望向孤单的晚灯\n" +
                "是那伤感的记忆\n" +
                "再次泛起心里无数的思念\n" +
                "以往片刻欢笑仍挂在脸上\n" +
                "愿你此刻可会知\n" +
                "是我衷心的说声\n" +
                "喜欢你 那双眼动人\n" +
                "笑声更迷人\n" +
                "愿再可 轻抚你\n" +
                "那可爱面容\n" +
                "挽手说梦话\n" +
                "像昨天 你共我\n" +
                "满带理想的我曾经多冲动\n" +
                "屡怨与她相爱难有自由\n" +
                "愿你此刻可会知\n" +
                "是我衷心的说声\n" +
                "喜欢你 那双眼动人\n" +
                "笑声更迷人\n" +
                "愿再可 轻抚你\n" +
                "那可爱面容\n" +
                "挽手说梦话\n" +
                "像昨天 你共我\n" +
                "每晚夜里自我独行\n" +
                "随处荡 多冰冷\n" +
                "以往为了自我挣扎\n" +
                "从不知 她的痛苦\n" +
                "喜欢你 那双眼动人\n" +
                "笑声更迷人\n" +
                "愿再可 轻抚你\n" +
                "那可爱面容\n" +
                "挽手说梦话\n" +
                "像昨天 你共我";
    }
}

用SurfaceView和MediaPlayer实现播放mp4和弹幕

package com.example.surfaceviewmediaplayer_01.fragments;


import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.SeekBar;

import com.example.surfaceviewmediaplayer_01.R;

import java.util.Timer;
import java.util.TimerTask;

/**
 * A simple {@link Fragment} subclass.
 */
public class dierFragment extends Fragment implements SurfaceHolder.Callback {

    private Button buttonPlay;
    private Button buttonStart;
    private Button buttonStop;
    private SeekBar seekBarId;
    private SurfaceView surfaceId;
    private SurfaceHolder holder;
    private MediaPlayer mediaPlayer;
    private SurfaceView danmuId;
    private SurfaceHolder danmuholder;

    public dierFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View inflate = inflater.inflate(R.layout.fragment_dier, container, false);
        buttonPlay = (Button) inflate.findViewById(R.id.button_play);
        seekBarId = (SeekBar) inflate.findViewById(R.id.seekBar_id);
        surfaceId = (SurfaceView) inflate.findViewById(R.id.surface_id);
        buttonStart = (Button) inflate.findViewById(R.id.button_start);
        buttonStop = (Button) inflate.findViewById(R.id.button_stop);
        danmuId = (SurfaceView) inflate.findViewById(R.id.danmu_id);

        holder = surfaceId.getHolder();
        holder.addCallback(this);
        mediaPlayer = new MediaPlayer();
        danmuholder = danmuId.getHolder();
        danmuholder.addCallback(this);

        danmuId.setZOrderOnTop(true);
        danmuholder.setFormat(PixelFormat.TRANSLUCENT);

        buttonPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mediaPlayer.reset();
                try {
                    mediaPlayer.setDataSource("/mnt/sdcard/v1.mp4");
                    mediaPlayer.prepareAsync();
                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            seekBarId.setMax(mediaPlayer.getDuration());
                            mediaPlayer.start();
                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    int x = getActivity().getWindow().getDecorView().getScrollX();
                                    while (true){
                                        x = x-10;
                                        showDanMu(x);
                                        if (x == 0){
                                            x = x = getActivity().getWindow().getDecorView().getScrollX();
                                        }
                                        try {
                                            Thread.sleep(196);
                                        } catch (InterruptedException e) {
                                            e.printStackTrace();
                                        }
                                    }
                                }
                            }).start();

                            Timer timer = new Timer();
                            timer.schedule(new TimerTask() {
                                @Override
                                public void run() {
                                    seekBarId.setProgress(mediaPlayer.getCurrentPosition());
                                }
                            },0,1000);
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        seekBarId.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser){
                    mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                mediaPlayer.pause();
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                mediaPlayer.start();
            }
        });

        buttonStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mediaPlayer.isPlaying()){
                    mediaPlayer.start();
                }
            }
        });

        buttonStop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mediaPlayer.isPlaying()){
                    mediaPlayer.pause();
                }
            }
        });

        return inflate;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (holder == this.holder){
            mediaPlayer.setDisplay(this.holder);
        }else {

        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    private void showDanMu(int x){
        String ss = "我是弹幕```我是弹幕``我是弹幕`重要事说三遍!!!";
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setTextSize(48);

        Canvas canvas = danmuholder.lockCanvas();
        canvas.drawColor(PixelFormat.TRANSPARENT, PorterDuff.Mode.CLEAR);
        canvas.drawText(ss,x,56,paint);
        danmuholder.unlockCanvasAndPost(canvas);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值