SurfaceView画板画正余弦
class DrawsinLine extends Thread {
// private boolean os = false;//判断是否已经画完了
private int xStartX = 10; //X轴的起始X坐标
private int xStartY = 520; //X轴的起始Y坐标
private int xEndX = 1000; //X轴的结束X坐标
private int xEndY = 520; //X轴的结束Y坐标
private int yStartX = 10; //Y轴的起始X坐标
private int yStartY = 30; //Y轴的起始y坐标
private int yEndX = 10; //Y轴的结束X坐标
private int yEndY = 1000; //Y轴的结束y坐标
private Path Sinpath = new Path();
private Path Sinpath1 = new Path();
@Override
public void run() {
super.run();
paint.setColor(Color.BLUE);
int x = yStartX;//正弦波的起始X坐标
int y = xStartY;//正弦波的起始Y坐标
Sinpath.moveTo(x, y);
Sinpath1.moveTo(x, y);
while (true) {
canvas = surfaceHolder.lockCanvas();//让该线程占有画布
// 画x轴
canvas.drawLine(xStartX, xStartY, xEndX, xEndY, paint);
//画y轴
canvas.drawLine(yStartX, yStartY, yEndX, yEndY, paint);
//正余弦公式 -余弦 + 正弦
int newy = y - (int) (100 * Math.sin((x - 5) * 2 * Math.PI / 150));//计算y坐标
int newy1 = y + (int) (100 * Math.sin((x - 5) * 2 * Math.PI / 150));//计算y坐标
Sinpath.lineTo(x, newy);//将path 链接 构成新的坐标点
Sinpath1.lineTo(x, newy1);//将path 链接 构成新的坐标点
x++;
canvas.drawPath(Sinpath, paint);
canvas.drawPath(Sinpath1, paint);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (x > 1000) {
break;
}
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
如何启动 以及如何初始化控件请链接————https://blog.youkuaiyun.com/SageDeceiveFiend/article/details/91471220
//布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MidPlayer.VideoActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<SeekBar
android:id="@+id/sb"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<SurfaceView
android:id="@+id/vidosv"
android:layout_width="match_parent"
android:layout_height="500dp" />
<Button
android:id="@+id/startbtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放" />
<Button
android:id="@+id/stopbtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停"></Button>
</LinearLayout>
</RelativeLayout>
//Activity代码
package com.example.day04.MidPlayer;
import android.annotation.TargetApi;
import android.media.MediaPlayer;
import android.media.TimedText;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.SeekBar;
import com.example.day04.R;
import java.io.IOException;
//视频播放
public class VideoActivity extends AppCompatActivity implements View.OnClickListener, SurfaceHolder.Callback, SeekBar.OnSeekBarChangeListener {
private SurfaceView videoSurfaceView;
private SurfaceHolder surfaceHolder;
private MediaPlayer mediaPlayer;
private SeekBar seekBar;
private int time;
private boolean isPlaying;//标志位,来判断当前视频是否正在播放
private boolean isPause;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
initView();
initMediaPlayer();
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(isPause==false){
seekBar.setProgress(time * 1000);
Message message = new Message();
time++;
handler.sendMessageDelayed(message, 1000);
}
}
};
private void initMediaPlayer() {
mediaPlayer = new MediaPlayer();
try {
//mediaPlayer.setDataSource("/sdcard/newyear.mp4");//配置播放MP4文件源。
Uri uri = Uri.parse("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
mediaPlayer.setDataSource(this, uri);
} catch (IOException e) {
e.printStackTrace();
}
//设置一个回调函数,当mediaplayer准备好之后,会回调该函数。
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.setLooping(true);
play();
}
});
}
public void play(){
int duration = mediaPlayer.getDuration();//获取视频的时间长度
seekBar.setMax(duration);//设置seek的max为视频播放的长度.
mediaPlayer.start();
Message message = new Message();
message.arg1 = time;
handler.sendMessage(message);
isPlaying = true;
}
private void initView() {
videoSurfaceView = findViewById(R.id.vidosv);
findViewById(R.id.startbtn).setOnClickListener(this);
findViewById(R.id.stopbtn).setOnClickListener(this);
surfaceHolder = videoSurfaceView.getHolder();
surfaceHolder.addCallback(this);
seekBar = findViewById(R.id.sb);
seekBar.setOnSeekBarChangeListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.startbtn:
mediaPlayer.start(); //重新播放
isPause = false;
if(isPlaying==true){
play();
}
break;
case R.id.stopbtn:
//如果正在播放
mediaPlayer.pause();//暂停
isPause = true;
break;
default:
break;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer.setDisplay(holder);//设置让surfaceview来播放视频.
mediaPlayer.prepareAsync();//异步准备.
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (isPlaying) {
mediaPlayer.stop();//停止播放
mediaPlayer.release(); //释放资源
}
}
//进度条改变的进度
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
//开始拖动
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
//停止拖动
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());//调整mediaplayer的播放进度
handler.removeCallbacksAndMessages(null);//删除所有handler的信息.
Message message = new Message();
time = (seekBar.getProgress() / 1000);
handler.sendMessage(message);
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeCallbacksAndMessages(null);//防止内存泄漏
}
}