画板
package com.example.work;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private SurfaceView sfvView;
private SurfaceHolder holder;
private Path path = new Path();
private Button btReset;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
sfvView = findViewById(R.id.sfv_view);
btReset = findViewById(R.id.bt_reset);
holder = sfvView.getHolder();
holder.addCallback(this);
btReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
path.reset();
}
});
sfvView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
float x = event.getX();
float y = event.getY();
if (action == MotionEvent.ACTION_DOWN) {
path.moveTo(x, y);
} else if (action == MotionEvent.ACTION_MOVE) {
path.lineTo(x, y);
}
return true;
}
});
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
new MyThread().start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
class MyThread extends Thread {
@Override
public void run() {
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
while (true) {
Canvas canvas = holder.lockCanvas();
if (canvas == null) {
break;
}
canvas.drawColor(Color.WHITE);
canvas.drawPath(path, paint);
holder.unlockCanvasAndPost(canvas);
}
}
}
}
播放器
package com.example.work.video;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import com.example.work.R;
import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;
public class VideoActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private SurfaceView sfvVideo;
private SeekBar seekBar;
private static final String TAG = "---";
private SurfaceHolder holder;
private MediaPlayer mediaPlayer = new MediaPlayer();
private String url = "http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4";
private Timer timer;
private boolean flag = true;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
int duration = mediaPlayer.getDuration();
int currentPosition = mediaPlayer.getCurrentPosition();
int values = currentPosition * 100 / duration;
Log.i(TAG, "handleMessage: "+currentPosition);
seekBar.setProgress(values);
}
}
};
private Button btPause;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video);
initView();
}
private void initView() {
sfvVideo = findViewById(R.id.sfv_video);
seekBar = findViewById(R.id.seek_bar);
btPause = findViewById(R.id.bt_pause);
holder = sfvVideo.getHolder();
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holders) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
mediaPlayer.setDisplay(holder);
initSeekBar();
myButton();
mySeekBar();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
private void mySeekBar() {
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){
mediaPlayer.seekTo(progress*mediaPlayer.getDuration()/100);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
private void myButton() {
btPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (flag){
flag = false;
mediaPlayer.pause();
}else{
flag = true;
mediaPlayer.start();
}
}
});
}
private void initSeekBar() {
seekBar.setMax(100);
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(0);
}
}, 0, 500);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer != null) {
mediaPlayer.release();
}
if (timer != null) {
timer.cancel();
}
}
}
歌词
package com.example.test;
import android.Manifest;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.example.test.bean.MusicBean;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private static final String TAG = "---";
private SurfaceView sfvTest;
private SurfaceHolder holder;
private String str = "{\"sgc\":false,\"sfy\":false,\"qfy\":false,\"lyricUser\":{\"id\":29418062,\"status\":0,\"demand\":0,\"userid\":12907497,\"nickname\":\"Simfre\",\"uptime\":1441503572343},\"lrc\":{\"version\":5,\"lyric\":\"[by:简单de频率]\\n[00:00.000] 作曲 : 张超\\n[00:01.000] 作词 : 张超\\n[00:22.600]苍茫的天涯是我的爱\\n[00:26.280]绵绵的青山脚下花正开\\n[00:30.130]什么样的节奏是最呀最摇摆\\n[00:33.880]什么样的歌声才是最开怀\\n[00:37.750]弯弯的河水从天上来\\n[00:41.310]流向那万紫千红一片海\\n[00:45.330]火辣辣的歌谣是我们的期待\\n[00:48.880]一路边走边唱才是最自在\\n[00:52.630]我们要唱就要唱得最痛快\\n[00:56.610]你是我天边最美的云彩\\n[01:00.280]让我用心把你留下来(留下来)\\n[01:04.340]悠悠的唱着最炫的民族风\\n[01:07.840]让爱卷走所有的尘埃\\n[01:10.470](我知道)你是我心中最美的云彩\\n[01:15.380]斟满美酒让你留下来(留下来)\\n[01:19.380]永远都唱着最炫的民族风\\n[01:22.760]是整片天空最美的姿态\\n[01:26.700]哟啦啦呵啦呗\\n[01:28.520]伊啦嗦啦呵啦呗呀\\n[01:30.700]我听见你心中动人的天籁\\n[01:34.260]登上天外云霄的舞台\\n[01:37.530]\\n[01:53.250]苍茫的天涯是我的爱\\n[01:56.940]绵绵的青山脚下花正开\\n[02:00.820]什么样的节奏是最呀最摇摆\\n[02:04.570]什么样的歌声才是最开怀\\n[02:08.440]弯弯的河水从天上来\\n[02:12.000]流向那万紫千红一片海\\n[02:15.810]火辣辣的歌谣是我们的期待\\n[02:19.620]一路边走边唱才是最自在\\n[02:23.310]我们要唱就要唱得最痛快\\n[02:27.220]你是我天边最美的云彩\\n[02:30.920]让我用心把你留下来(留下来)\\n[02:34.920]悠悠的唱着最炫的民族风\\n[02:38.410]让爱卷走所有的尘埃\\n[02:41.410](我知道)你是我心中最美的云彩\\n[02:46.210]斟满美酒让你留下来(留下来)\\n[02:50.140]永远都唱着最炫的民族风\\n[02:53.460]是整片天空最美的姿态\\n[02:57.810]\\n[03:18.290]你是我天边最美的云彩\\n[03:21.910]让我用心把你留下来(留下来)\\n[03:26.030]悠悠的唱着最炫的民族风\\n[03:29.510]让爱卷走所有的尘埃\\n[03:32.260](我知道)你是我心中最美的云彩\\n[03:37.010]斟满美酒让你留下来(留下来)\\n[03:41.070]永远都唱着最炫的民族风\\n[03:44.570]是整片天空最美的姿态\\n[03:48.990]\\n[03:50.300]我听见你心中那动人的天籁\\n[03:53.990]就忽如一夜春风袭来满面桃花开\\n[03:57.860]我忍不住去采 我忍不住去摘\\n[04:01.620]我敞开胸怀为你等待\\n[04:04.340]\\n[04:05.840]你是我天边最美的云彩\\n[04:09.280]让我用心把你留下来\\n[04:13.010]悠悠的唱着最炫的民族风\\n[04:16.750]让爱卷走所有的尘埃\\n[04:19.500](我知道)你是我心中最美的云彩\\n[04:24.250]斟满美酒让你留下来(留下来)\\n[04:28.380]永远都唱着最炫的民族风\\n[04:31.750]是整片天空最美的姿态\\n[04:36.190]\\n\"},\"klyric\":{\"version\":0,\"lyric\":null},\"tlyric\":{\"version\":0,\"lyric\":null},\"code\":200}";
private String lyric = "";
private String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
};
private int position;
private List<MusicBean> musicBeanList = new ArrayList<>();
private MediaPlayer mediaPlayer = new MediaPlayer();
private Timer timer = new Timer();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(permissions,123);
}
initView();
myJson();
myMusic();
myTimer();
}
private void myTimer() {
timer.schedule(new TimerTask() {
@Override
public void run() {
int currentPosition = mediaPlayer.getCurrentPosition();
for (int i = 0; i < musicBeanList.size(); i++) {
if(musicBeanList.get(i).getTime() >= currentPosition){
Log.i(TAG, "run: "+position);
position = i-1;
break;
}
}
}
},0,100);
}
private void myMusic() {
if (mediaPlayer != null) {
mediaPlayer.reset();
try {
mediaPlayer.setDataSource("/sdcard/凤凰传奇 - 最炫民族风(Live).mp3");
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void myJson() {
try {
JSONObject jsonObject = new JSONObject(str);
JSONObject lrc = jsonObject.getJSONObject("lrc");
lyric = lrc.getString("lyric");
} catch (JSONException e) {
e.printStackTrace();
}
String[] split = lyric.split("\n");
for (int i = 0; i < split.length; i++) {
String[] strings = split[i].split("\\[|:|\\.|]");
if (strings.length > 4) {
String minute = strings[1];
String second = strings[2];
String millisecond = strings[3];
String lyric = strings[4];
int m = Integer.parseInt(minute) * 60 * 1000;
int s = Integer.parseInt(second) * 1000;
int ms = Integer.parseInt(millisecond);
musicBeanList.add(new MusicBean(lyric, (m + s + ms)));
}
}
Log.i(TAG, "myJson: "+musicBeanList.toString());
}
private void initView() {
sfvTest = findViewById(R.id.sfv_test);
holder = sfvTest.getHolder();
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
new MyThread().start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
class MyThread extends Thread{
@Override
public void run() {
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTextSize(50);
paint.setAntiAlias(true);
while (true) {
Canvas canvas = holder.lockCanvas();
if (canvas == null) {
break;
}
canvas.drawColor(Color.WHITE);
for (int i = 0; i <= position-1; i++) {
paint.setColor(Color.GREEN);
canvas.drawText(musicBeanList.get(i).getStr_music(),200,500-(position-i)*50,paint);
}
paint.setColor(Color.RED);
canvas.drawText(musicBeanList.get(position).getStr_music(),200,500,paint);
for(int i = position+1 ; i < musicBeanList.size()-1 ; i ++){
paint.setColor(Color.GREEN);
canvas.drawText(musicBeanList.get(i).getStr_music(),200,500+(i-position)*100,paint);
}
holder.unlockCanvasAndPost(canvas);
}
}
}
}