需求:做小型地图的一个显示功能
实现思路:自定义view解析对应的svg文件,在利用canvas的画笔画出相应的地图线条。各个线条围成的区域可以表示成各个元素比如树,街道,路灯,汽车等等一切事物。然后通过view的点击事件可以给自定义控件添加点击,长按,放大缩小等等操作。
需要美工给一个svg格式的图片。
//当然这里并不止一个path路径,这里的path路径就是地图的线条
android:width="3000dp"
android:height="3000dp"
android:viewportWidth="3000"
android:viewportHeight="3000">
android:dataName="CCCC"
android:cabinId="9a43312887844fa3a2815dfac018f6ee"
android:pathData="M7,2297H157v60H7v-60Z"
android:strokeWidth="8.333"
android:fillType="evenOdd"
android:strokeColor="#000"/>
path标签内可存放一切你想要存放的信息,可以是表示一棵树,一栋房子都随意,只需要按照相应的格式解析出来存放到对象内就行了。
//控件自适应请重写onMeasure方法,我这里是直接全屏了。
public class MapView extends View {
private Paint paint;
private Context mContext;
private int[] colors = new int[]{Color.BLUE,Color.CYAN,Color.YELLOW,Color.GREEN};
private List pathItemList = new ArrayList<>();
GestureDetector gestureDetector;
ScaleGestureDetector scaleGestureDetector;
//双指操作下的中心位置
float focusX = 0,focusY = 0;
float posX = 0, posY = 0;
int viewWidth, viewHeight;
//是否初始化了
boolean hasInitViewSize;
float widthScale, heightScale;
float scaleFactor = 1.0f;
private int imgWidth = 3000,imgHeight=3000;
private MapPathItem selectPathItem;
//地图最大的矩阵
private RectF mapRectF;
private List users;
private List usersLocationInfo;
private Bitmap userLocationIcon;
private itemClickListener itemClickListener;
public MapView(Context context) {
super(context);
}
public MapView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
this.mContext = context;
this.paint = new Paint();
users = new ArrayList<>();
usersLocationInfo = new ArrayList<>();
userLocationIcon = BitmapFactory.decodeResource(getResources(),R.drawable.avtar_icon);
gestureDetector = new GestureDetector(context, new MySimpleOnGestureDetector());
scaleGestureDetector = new ScaleGestureD