本文实例为大家分享了android九宫格锁屏控件的具体代码,供大家参考,具体内容如下

代码:

public class lockview extends view {
    //半径
    private int radius;
    //中心小圆半径
    private int smallradius;
    //一行个数
    private int column;
    //选中颜色
    private int selectcolor;
    //未选中颜色
    private int normalcolor;
    //阴影颜色
    private int shadercolor;
    //连线的颜色
    private int linecolor;
    //圆线宽
    private int circlestrokewidth;
    //连线的线宽
    private int linestrokewidth;
    private paint normalpaint;
    private paint selectpaint;
    private paint linepaint;
    private paint centerpaint;
    private int width;
    //每个圆宽度
    private int everywidth;
    //是否是选中绘制
    private boolean isselect;
    //所有圆信息
    private list<point> allcirclelist = new arraylist<>();
    //选中圆的标志
    private list<integer> selectlist = new arraylist<>();
    //是否是重置
    private boolean isreset;
    private lockviewfinishlistener lockviewfinishlistener;
    public lockview(context context, @nullable attributeset attrs) {
        super(context, attrs);
        init(context, attrs);
    }
    public lockviewfinishlistener getlockviewfinishlistener() {
        return lockviewfinishlistener;
    }
    public void setlockviewfinishlistener(lockviewfinishlistener lockviewfinishlistener) {
        this.lockviewfinishlistener = lockviewfinishlistener;
    }
    private void init(context context, attributeset attrs) {
        typedarray typedarray = context.obtainstyledattributes(attrs,r.styleable.lockview);
        radius = typedarray.getinteger(r.styleable.lockview_lock_radius,100);
        smallradius = typedarray.getinteger(r.styleable.lockview_smallradius,30);
        column = typedarray.getinteger(r.styleable.lockview_column,3);
        selectcolor =typedarray.getcolor(r.styleable.lockview_selectcolor,color.red);
        normalcolor = typedarray.getcolor(r.styleable.lockview_lock_normalcolor,color.gray);
        shadercolor = typedarray.getcolor(r.styleable.lockview_shadercolor,color.argb(80, 0xff, 0x00, 0x00));
        linecolor = typedarray.getcolor(r.styleable.lockview_linecolor,color.red);
        circlestrokewidth = typedarray.getinteger(r.styleable.lockview_circlestrokewidth,5);
        linestrokewidth = typedarray.getinteger(r.styleable.lockview_linestrokewidth,15);
        normalpaint = new paint();
        normalpaint.setcolor(normalcolor);
        normalpaint.setantialias(false);//设置为无锯齿
        normalpaint.setstrokewidth(circlestrokewidth);//线宽
        normalpaint.setstyle(paint.style.stroke);
        selectpaint = new paint();
        selectpaint.setcolor(selectcolor);
        selectpaint.setantialias(false);
        selectpaint.setstrokewidth(circlestrokewidth);
        selectpaint.setstyle(paint.style.stroke);
        centerpaint = new paint();
        centerpaint.setcolor(selectcolor);
        centerpaint.setantialias(false);
        centerpaint.setstrokewidth(radius - smallradius);
        centerpaint.setstyle(paint.style.fill_and_stroke);
        linepaint = new paint();
        linepaint.setcolor(linecolor);
        linepaint.setantialias(false);//设置为无锯齿
        linepaint.setstrokewidth(linestrokewidth);//线宽
        linepaint.setalpha(150);
        linepaint.setstyle(paint.style.stroke);
    }
    @override
    protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
        width = measurewidth(widthmeasurespec);
        setmeasureddimension(width, width);
        everywidth = (width - getpaddingleft() - getpaddingright()) / column;
        allcirclelist.clear();
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < column; j++) {
                float cx = getpaddingleft() + everywidth / 2 * (2 * j + 1);
                float cy = getpaddingtop() + everywidth / 2 * (2 * i + 1);
                point point = new point();
                point.cx = cx;
                point.cy = cy;
                allcirclelist.add(point);
            }
        }
    }
    @override
    protected void ondraw(canvas canvas) {
        super.ondraw(canvas);
        for (int i = 0; i < allcirclelist.size(); i++) {
            point point = allcirclelist.get(i);
            canvas.drawcircle(point.cx, point.cy, radius, normalpaint);
        }
        if (isreset) {//重置
            isreset = false;
            postinvalidate();
        } else {
            if (isselect) {
                for (int i = 0; i < selectlist.size(); i++) {
                    int index = selectlist.get(i);
                    point point = allcirclelist.get(index);
                    canvas.drawcircle(point.cx, point.cy, radius, selectpaint);
                    shader mshader = new radialgradient(point.cx, point.cy, smallradius, new int[]{selectcolor, shadercolor},
                            new float[]{0.9f, 1f}, shader.tilemode.clamp);
                    centerpaint.setshader(mshader);
                    canvas.drawcircle(point.cx, point.cy, smallradius, centerpaint);
                    if (i >= 1) {
                        int lastindex = selectlist.get(i - 1);
                        point lastpoint = allcirclelist.get(lastindex);
                        canvas.drawline(lastpoint.cx, lastpoint.cy, point.cx, point.cy, linepaint);
                    }
                }
            }
        }
    }
    @override
    public boolean ontouchevent(motionevent event) {
        switch (event.getaction()) {
            case motionevent.action_down:
                isreset = true;
                selectlist.clear();
                int index = calculatewhich(event.getx(), event.gety());
                if (index != -1) {
                    selectlist.add(index);
                    isselect = true;
                }
                break;
            case motionevent.action_move:
                index = calculatewhich(event.getx(), event.gety());
                if (index != -1) {
                    if (!selectlist.contains(index)) {
                        selectlist.add(index);
                    }
                }
                break;
            case motionevent.action_up:
                if (lockviewfinishlistener != null) {
                    stringbuffer result = new stringbuffer();
                    for (int i = 0; i < selectlist.size(); i++) {
                        result.append(selectlist.get(i));
                    }
                    lockviewfinishlistener.onsuccess(result + "");
                }
                break;
        }
        postinvalidate();
        return true;
    }
    /**
     * 计算控件宽高
     *
     * @param widthmeasurespec
     * @return
     */
    private int measurewidth(int widthmeasurespec) {
        int result;
        int specsize = measurespec.getsize(widthmeasurespec);
        int specmode = measurespec.getmode(widthmeasurespec);
        if (specmode == measurespec.exactly) {
            result = specsize;
        } else {
            result = getpaddingleft() + getpaddingright() + radius * 2 * column ;
            if (specmode == measurespec.at_most) {
                result = math.min(result, specsize);
            }
        }
        return result;
    }
    /**
     * 计算是在哪个圆中
     *
     * @return
     */
    private int calculatewhich(float lx, float ly) {
        for (int i = 0; i < allcirclelist.size(); i++) {
            point point = allcirclelist.get(i);
            if (lx > point.cx - radius && lx < point.cx + radius) {
                if (ly > point.cy - radius && ly < point.cy + radius) {
                    return i;
                }
            }
        }
        return -1;
    }
    public interface lockviewfinishlistener {
        void onsuccess(string result);
    }
    private class point {
        private float cx;
        private float cy;
    }
}
<!--九宫格锁屏控件-->
    <declare-styleable name="lockview">
        <!--大圆半径-->
        <attr name="lock_radius" format="integer"/>
        <!--小圆半径-->
        <attr name="smallradius" format="integer"/>
        <!--一行个数-->
        <attr name="column" format="integer"/>
        <!--选中颜色-->
        <attr name="selectcolor" format="color"/>
        <!--未选中颜色-->
        <attr name="lock_normalcolor" format="color"/>
        <!--阴影颜色-->
        <attr name="shadercolor" format="color"/>
        <!--连线的颜色-->
        <attr name="linecolor" format="color"/>
        <!--圆线宽-->
        <attr name="circlestrokewidth" format="integer"/>
        <!--连线的线宽-->
        <attr name="linestrokewidth" format="integer"/>
</declare-styleable>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。