自定义View之SVG矢量图实现不规则图像及点击事件

先上效果图,利用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值