先上效果图,利用SVG中国地图实现不规则图形,点击各省的不规则图像,让省份颜色变红。
原理解析
svg矢量图是一种体积小,放大后都不会模糊的图片格式,适用于纯色或者简单的图案,svg矢量图其实也可以看成类似xml的文件,使用文本编辑器就可以打开,svg都有一个path,类似于java中的path,我们可以利用DocumentBuilderFactory对svg进行解析,从而拿到svg的path路径,然后重新绘制,但是解析是一个耗时的事情,我们开启一个子线程进行解析。
代码实现
首先是定义一个Map类继承自View,在构造方法中对画笔等进行初始化,然后开启一个线程解析svg
public Map(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init();
}
private void init() {
provices = new ArrayList();
paint = new Paint();
paint.setAntiAlias(true);
provices = new ArrayList<>();
new LoadThread().start();//读取数据
}
然后我们定义一个省份的JavaBean,每个省份都是一个对象,每个省份包括自己的path路径和绘制颜色,完了我们在创建一个绘制path的方法,最后关于点击,我们创建一个方法public boolean isTouch(float x, float y),传入坐标点,判断坐标是否在该省份的path范围内。
public class ProviceBean {
private Path mPath;
private int drawColor;
public ProviceBean(Path path) {
mPath = path;
}
public void setDrawColor(int drawColor) {
this.drawColor = drawColor;
}
void drawItem(Canvas canvas, Paint paint, boolean isSelect) {
if (isSelect) {
// 绘制内部的颜色
paint.clearShadowLayer();
paint.setStrokeWidth(1);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
canvas.drawPath(mPath, paint);
// 绘制边界
paint.setStyle(Paint.Style.STROKE);
int strokeColor = 0xFFD0E8F4;
paint.setColor(strokeColor);
canvas.drawPath(mPath, paint);
} else {
// 绘制内部的颜色
paint.setStrokeWidth(2);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);
paint.setShadowLayer(8, 0, 0, 0xffffff);
canvas.drawPath(mPath, paint);
// 绘制边界
paint.clearShadowLayer();
paint.setCol