package safeluck.drive.evaluation.fragment; import android.graphics.Bitmap; 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 com.anyun.exam.lib.MyLog; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import me.yokeyword.fragmentation.SupportFragment; import safeluck.drive.evaluation.Constant; import safeluck.drive.evaluation.bean.ExamMap; import safeluck.drive.evaluation.util.FileUtil; 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 Canvas bitMapCanvas; private Paint mPaint; private Path mPath; private StringBuffer buffer;//存放地图的buffer private Gson gson = new Gson(); private int avaliableWidth,avaliableHeight; private int x = 50, y = 50, r = 10; // 圆的坐标和半径 private int sinx = 0,siny =0 ; float [] pts={50,100,100,200,200,300,300,400}; 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); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(1.5f); mPath = new Path(); int widhtpixels =getResources().getDisplayMetrics().widthPixels; int heightpixels =getResources().getDisplayMetrics().heightPixels; Log.i(TAG,"widhtpixels="+widhtpixels+" heig="+heightpixels); return mSurfaceView; } @Override public void surfaceCreated(SurfaceHolder holder) { // mCanvas = holder.lockCanvas(); // int screen_width = mCanvas.getWidth(); // int screen_height = mCanvas.getHeight(); // Bitmap bmp = Bitmap.createBitmap(screen_width, screen_height, Bitmap.Config.ARGB_8888); // bitMapCanvas = new Canvas(bmp); // bitMapCanvas.drawColor(Color.WHITE); // // mPaint = new Paint(); // // mPaint.setTextSize(30); // mPaint.setColor(Color.BLACK); // mPaint.setStrokeWidth(1.5f); // mPaint.setAntiAlias(true); // mPaint.setStyle(Paint.Style.STROKE); // // mCanvas.drawBitmap(bmp,0,0,mPaint); // holder.unlockCanvasAndPost(mCanvas); flag = true; drawThread.execute(new DrawRunnable()); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { flag = false; } List examMaps = new ArrayList<>(); /** * 主要是这个方法,进行坐标点计算,使用mPath画图,可能要用到Canvas * 最好只使用path */ private void calculate() { int map_id = 863; int map_line = 0; double map[][]={}; if (buffer == null){ buffer = FileUtil.readAssetTxtFile(_mActivity, Constant.ROAD_MAP); Log.i(TAG,"ditu="+buffer.toString().trim()); } Type type = new TypeToken>(){}.getType(); if (buffer != null){ examMaps= gson.fromJson(buffer.toString().trim(), type); } for (int i = 0; i < examMaps.size(); i++) { ExamMap examMap = examMaps.get(i); if (map_id == examMap.getId()){ List pointBeanList = examMap.getPoint(); for(int j=0; j xys = pointBeanList.get(j).getXy(); if(j==0){ map = new double[xys.size()/2][2]; for (int k=0; k map[i][0]) { min_x = map[i][0]; } if (max_y < map[i][1]) { max_y = map[i][1]; } if (min_y > map[i][1]) { min_y = map[i][1]; } } } long scale_x = Math.round((mCanvas.getWidth() - base_x - 10) / (max_x - min_x)); long scale_y = Math.round((mCanvas.getHeight() - base_y - 10) / (max_y - min_y)); if (scale_x >= scale_y) { scale_x = scale_y; } else { scale_y = scale_x; } mPaint.reset(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLACK); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(1.5f); if (map.length > 9) { Log.d(TAG, "DrawMap X = " + String.format("%f", (float) (base_x + (map[0][0] - min_x) * scale_x)) + " Y = " + String.format("%f", (float) (base_y + (map[0][1] - min_y) * scale_y))); mPath.moveTo((float) (base_x + (map[0][0] - min_x) * scale_x), (float) (base_y + (map[0][1] - min_y) * scale_y)); for (int i = 1; i < map.length; i++) { Log.d(TAG, "DrawMap to X = " + (float) (base_x + (map[i][0] - min_x) * scale_x) + " Y = " + (float) (base_y + (map[i][1] - min_y) * scale_y)); mPath.lineTo((float) (base_x + (map[i][0] - min_x) * scale_x), (float) (base_y + (map[i][1] - min_y) * scale_y)); } mPath.close(); mCanvas.drawPath(mPath,mPaint); } mPaint.reset(); mPath = new Path(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(1.5f); mPaint.setColor(Color.RED); mPath.moveTo(300,150); mPath.lineTo(1015,150); mCanvas.drawPath(mPath,mPaint); } /** * 绘制 */ private void drawMap() { try { //获得canvas对象 mCanvas = mSurfaceHolder.lockCanvas(); //绘制背景 mCanvas.drawColor(Color.WHITE); Log.i(TAG,"width="+mCanvas.getWidth()+"height:"+mCanvas.getHeight()); //绘制路径 mCanvas.drawPath(mPath, mPaint); }catch (Exception e){ }finally { // if (mCanvas != null){ // mCanvas.restore(); // //释放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(); } } } } }