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.opengl.GLSurfaceView; 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 android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.widget.Toolbar; import me.yokeyword.fragmentation.SupportFragment; import safeluck.drive.evaluation.R; /** * MyApplication2 * Created by lzw on 2019/9/26. 15:20:58 * 邮箱:632393724@qq.com * All Rights Saved! Chongqing AnYun Tech co. LTD */ public class MapFragment extends SupportFragment{ private boolean isDrawing = false; public static SupportFragment newInstance(){ return new MapFragment(); } private SurfaceView mSurfaceView; private static final String TAG = "MapFragment"; private SurfaceHolder holder; Path path = new Path(); private Canvas canvas; private int x=-1; private int y = -1; private Toolbar toolbar; private Bitmap bmp = null; private Canvas canvas2 = null; private Paint paint = null; private int screen_width = 0, screen_height = 0; private String osd = null; private String osd2 = null; private String osd3 = null; private LinearLayout linearLayout;//surfaceview的父容器,为了移动surfaceview而使用,因为scrollto不能移动view, @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout_mapfragment,container,false); initView(view); return view; } private void initView(View view) { toolbar = view.findViewById(R.id.toolbar); toolbar.setTitle("简单地图"); toolbar.setNavigationIcon(R.drawable.ic_arrow_back_white_24dp); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { _mActivity.onBackPressed(); } }); mSurfaceView = view.findViewById(R.id.surfaceview); holder = mSurfaceView.getHolder(); holder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { Canvas canvas = surfaceHolder.lockCanvas(); if (canvas != null) { Log.d(TAG, "W = " + canvas.getWidth() + " H = " + canvas.getHeight()); screen_width = canvas.getWidth(); screen_height = canvas.getHeight(); surfaceHolder.unlockCanvasAndPost(canvas); bmp = Bitmap.createBitmap(screen_width, screen_height, Bitmap.Config.ARGB_8888); canvas2 = new Canvas(bmp); canvas2.drawColor(Color.WHITE); paint = new Paint(); paint.setTextSize(30); paint.setColor(Color.BLACK); paint.setStrokeWidth(1.5f); paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); holder.lockCanvas(); canvas.drawBitmap(bmp, 0, 0, paint); holder.unlockCanvasAndPost(canvas); } new Thread(new NeedForSpeed()).start(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } }); } class NeedForSpeed implements Runnable { @Override public void run() { double map[][] = {{1,1}, {10,1}, {10,10}, {1,10}}; double car[][] = {{3,3}, {8,3}, {8,8}, {3,8}}; DrawMap(map, car); } } public void DrawMap(final double [][]map, final double [][]car) { if (canvas2 == null || bmp == null) { return; } _mActivity.runOnUiThread(new Runnable() { @Override public void run() { double base_x = 100, base_y = 100; double max_x = 0, min_x = 0, max_y = 0, min_y = 0; Log.d(TAG, "DrawMap map size " + map.length + " car size " + car.length); for (int i = 0; i < map.length; i++) { if (i == 0) { max_x = map[0][0]; min_x = map[0][0]; max_y = map[0][1]; min_y = map[0][1]; } else { if (max_x < map[i][0]) { max_x = map[i][0]; } if (min_x > 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]; } } } Log.d(TAG, "DrawMap max_x " + max_x + " max_y " + max_y + " min_x " + min_x + " min_y " + min_y); for (int i = 0; i < car.length; i++) { if (max_x < car[i][0]) { max_x = car[i][0]; } if (min_x > car[i][0]) { min_x = car[i][0]; } if (max_y < car[i][1]) { max_y = car[i][1]; } if (min_y > car[i][1]) { min_y = car[i][1]; } } Log.d(TAG, "DrawMap max_x " + max_x + " max_y " + max_y + " min_x " + min_x + " min_y " + min_y); long scale_x = Math.round(500 / (max_x - min_x)); long scale_y = Math.round(300 / (max_y - min_y)); if (scale_x >= scale_y) { scale_x = scale_y; } else { scale_y = scale_x; } Log.d(TAG, "DrawMap scale_x " + scale_x + " scale_y " + scale_y); canvas2.drawColor(Color.WHITE); paint.setStyle(Paint.Style.STROKE); Path path = new Path(); 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))); path.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)); path.lineTo((float) (base_x + (map[i][0] - min_x) * scale_x), (float) (base_y + (map[i][1] - min_y) * scale_y)); } path.close(); } else { path.moveTo((float) (base_x + (map[0][0] - min_x) * scale_x), (float) (base_y + (map[0][1] - min_y) * scale_y)); path.lineTo((float) (base_x + (map[8][0] - min_x) * scale_x), (float) (base_y + (map[8][1] - min_y) * scale_y)); path.moveTo((float) (base_x + (map[2][0] - min_x) * scale_x), (float) (base_y + (map[2][1] - min_y) * scale_y)); path.lineTo((float) (base_x + (map[1][0] - min_x) * scale_x), (float) (base_y + (map[1][1] - min_y) * scale_y)); path.moveTo((float) (base_x + (map[3][0] - min_x) * scale_x), (float) (base_y + (map[3][1] - min_y) * scale_y)); path.lineTo((float) (base_x + (map[4][0] - min_x) * scale_x), (float) (base_y + (map[4][1] - min_y) * scale_y)); path.moveTo((float) (base_x + (map[6][0] - min_x) * scale_x), (float) (base_y + (map[6][1] - min_y) * scale_y)); path.lineTo((float) (base_x + (map[5][0] - min_x) * scale_x), (float) (base_y + (map[5][1] - min_y) * scale_y)); path.moveTo((float) (base_x + (map[7][0] - min_x) * scale_x), (float) (base_y + (map[7][1] - min_y) * scale_y)); path.lineTo((float) (base_x + (map[8][0] - min_x) * scale_x), (float) (base_y + (map[8][1] - min_y) * scale_y)); } canvas2.drawPath(path, paint); path.moveTo((float) (base_x + (car[0][0] - min_x) * scale_x), (float) (base_y + (car[0][1] - min_y)*scale_y)); for (int i = 1; i < car.length; i++) path.lineTo((float) (base_x + (car[i][0] - min_x) * scale_x), (float) (base_y + (car[i][1] - min_y)*scale_y)); path.close(); canvas2.drawPath(path, paint); paint.setStyle(Paint.Style.FILL_AND_STROKE); if (osd != null) { Path pathText = new Path(); pathText.moveTo(100, 470); pathText.lineTo(700, 470); canvas2.drawTextOnPath(osd, pathText, 0, 0, paint);//逆时针生成 } if (osd2 != null) { Path pathText = new Path(); pathText.moveTo(10, 30); pathText.lineTo(700, 30); canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成 } // 提交画布 Canvas canvas = holder.lockCanvas(); canvas.drawBitmap(bmp, 0, 0, paint); holder.unlockCanvasAndPost(canvas); } }); } public void CCL(final int c, final int who) { _mActivity.runOnUiThread(new Runnable() { @Override public void run() { /*if (canvas2 != null && bmp != null) { if (c == 0) canvas2.drawColor(Color.GREEN); else canvas2.drawColor(Color.GRAY); // 提交画布 Canvas canvas = holder.lockCanvas(); canvas.drawBitmap(bmp, 0, 0, paint); holder.unlockCanvasAndPost(canvas); }*/ // Button button; // if (who == 0) { // button = findViewById(R.id.sample_button); // } else { // button = findViewById(R.id.net_button); // } // // if (c == 0) // button.setBackgroundColor(Color.GREEN); // else // button.setBackgroundColor(Color.RED); } }); } }