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