yy1717
2020-03-17 4ff195404b21f74ca11e26a69cbf0418eaa4595f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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();
                }
            }
        }
    }
 
}