package safeluck.drive.evaluation.fragment;
|
|
import android.graphics.Canvas;
|
import android.graphics.Color;
|
import android.graphics.Paint;
|
import android.graphics.Path;
|
import android.os.Bundle;
|
import android.util.Log;
|
import android.view.LayoutInflater;
|
import android.view.SurfaceHolder;
|
import android.view.SurfaceView;
|
import android.view.View;
|
import android.view.ViewGroup;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
|
import me.yokeyword.fragmentation.SupportFragment;
|
|
public class RoadDriveMapFragment extends SupportFragment implements SurfaceHolder.Callback {
|
|
private static final String TAG = RoadDriveMapFragment.class.getSimpleName();
|
|
private SurfaceView mSurfaceView;
|
private SurfaceHolder mSurfaceHolder;
|
private boolean flag = false;//控制绘制线程drawThread
|
private Canvas mCanvas;
|
private Paint mPaint;
|
private Path mPath;
|
|
private int avaliableWidth,avaliableHeight;
|
|
private int x = 50, y = 50, r = 10; // 圆的坐标和半径
|
|
private ExecutorService generateData = Executors.newSingleThreadExecutor();//产生数据(主要是车辆数据)
|
private ExecutorService drawThread = Executors.newSingleThreadExecutor();//绘制线程
|
|
public static RoadDriveMapFragment newInstance(){
|
return new RoadDriveMapFragment();
|
}
|
|
@Nullable
|
@Override
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
mSurfaceView = new SurfaceView(_mActivity);
|
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
|
|
mSurfaceView.setLayoutParams(layoutParams);
|
mSurfaceView.getHolder().addCallback(this);
|
mSurfaceHolder = mSurfaceView.getHolder();
|
avaliableHeight = mSurfaceView.getHeight();
|
avaliableWidth = mSurfaceView.getWidth();
|
Log.i(TAG,"可用宽度="+avaliableWidth+"可用高度="+avaliableHeight);
|
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
mPath = new Path();
|
|
return mSurfaceView;
|
}
|
|
@Override
|
public void surfaceCreated(SurfaceHolder holder) {
|
drawThread.execute(new DrawRunnable());
|
}
|
|
@Override
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
|
|
}
|
|
@Override
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
flag = false;
|
}
|
|
|
/**
|
* 主要是这个方法,进行坐标点计算,使用mPath画图,可能要用到Canvas
|
* 最好只使用path
|
*/
|
private void calculate() {
|
mPath.addCircle(x,y,r, Path.Direction.CCW);
|
}
|
|
|
/**
|
* 绘制
|
*/
|
private void drawMap() {
|
try {
|
//获得canvas对象
|
mCanvas = mSurfaceHolder.lockCanvas();
|
//绘制背景
|
mCanvas.drawColor(Color.WHITE);
|
//绘制路径
|
mCanvas.drawPath(mPath, mPaint);
|
}catch (Exception e){
|
|
}finally {
|
if (mCanvas != null){
|
//释放canvas对象并提交画布
|
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
|
}
|
}
|
|
}
|
|
class DrawRunnable implements Runnable{
|
|
@Override
|
public void run() {
|
while(flag){
|
|
drawMap();
|
calculate();
|
try {
|
Thread.sleep(50);
|
} catch (InterruptedException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
}
|
|
}
|