本文实例为大家分享了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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。