用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);
}
}