跳转到主内容
极星编程网:以代码为星,赴技术山海!

android九宫格锁屏控件使用详解

本文实例为大家分享了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 allCircleList = new ArrayList<>();//选中圆的标志private List 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;}

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

您可能感兴趣的文章:Android 仿小米锁屏实现九宫格解锁功能(无需图片资源) Android唤醒、解锁屏幕代码实例设置Android系统永不锁屏永不休眠的方法Android屏幕锁屏弹窗的正确姿势DEMO详解Android编程实现禁止系统锁屏与解锁亮屏的方法Android编程实现一键锁屏的方法Android如何实现锁屏状态下弹窗android禁止锁屏保持常亮(示例代码) Android系统永不锁屏永不休眠的方法Android 监听锁屏、解锁、开屏 功能代码

相关文章