android九宫格隐藏,android九宫格锁屏控件

allCircleList = new ArrayList<>();

//选中圆的标志

private ListselectList = 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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值