android slide to unlock boot instance source code learning

  • 2020-05-07 20:29:15
  • OfStack

The effect drawing can not be uploaded due to the website account, make up for later.
NinePointLineView.java
 
package org.demo.custon_view; 
import org.demo.utils.MLog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Cap; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
public class NinePointLineView extends View { 
Paint linePaint = new Paint(); 
Paint whiteLinePaint = new Paint(); 
Paint textPaint = new Paint(); 
//  Because both pictures are square, so get 1 length  
Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(), 
R.drawable.lock); 
int defaultBitmapRadius = defaultBitmap.getWidth() / 2; 
//  Initializes the diameter and radius of the selected image  
Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(), 
R.drawable.indicator_lock_area); 
int selectedBitmapDiameter = selectedBitmap.getWidth(); 
int selectedBitmapRadius = selectedBitmapDiameter / 2; 
//  defined 9 An array of points  
PointInfo[] points = new PointInfo[9]; 
//  The corresponding ACTION_DOWN The point of  
PointInfo startPoint = null; 
//  The width and height of the screen  
int width, height; 
//  when ACTION_MOVE When get the X . Y coordinates  
int moveX, moveY; 
//  whether ACTION_UP 
boolean isUp = false; 
//  The resulting user lock sequence  
StringBuffer lockString = new StringBuffer(); 
public NinePointLineView(Context context) { 
super(context); 
this.setBackgroundColor(Color.WHITE); 
initPaint(); 
} 
public NinePointLineView(Context context, AttributeSet attrs) { 
super(context, attrs); 
this.setBackgroundColor(Color.WHITE); 
initPaint(); 
} 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
MLog.i("onMeasure"); 
//  Initializes the screen size  
width = getWidth(); 
height = getHeight(); 
if (width != 0 && height != 0) { 
initPoints(points); 
} 
MLog.i("width , height = " + width + " , " + height); 
super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 
@Override 
protected void onLayout(boolean changed, int left, int top, int right, 
int bottom) { 
MLog.i("onLayout"); 
super.onLayout(changed, left, top, right, bottom); 
} 
private int startX = 0, startY = 0; 
@Override 
protected void onDraw(Canvas canvas) { 
canvas.drawText(" Sliding order of users: " + lockString, 0, 40, textPaint); 
if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) { 
//  Draws the currently active line segment  
drawLine(canvas, startX, startY, moveX, moveY); 
} 
drawNinePoint(canvas); 
super.onDraw(canvas); 
} 
//  Remember, this DOWN and MOVE , UP It's in pairs, if not from UP Release, and you won't get DOWN ;  
//  To gain DOWN When, 1 Be sure to confirm the consumption of the event, otherwise MOVE and UP Not by this View the onTouchEvent receive  
@Override 
public boolean onTouchEvent(MotionEvent event) { 
boolean flag = true; 
if (isUp) {//  If finished, reset the sum of properties for each point lockString 
finishDraw(); 
//  when UP After that, return false , release the event to the system, otherwise it cannot be obtained Down The event  
flag = false; 
} else {//  Continue drawing until you finish  
handlingEvent(event); 
//  I'm going to return true , on behalf of the View Consume this event, otherwise it will not be received MOVE and UP The event  
flag = true; 
} 
return flag; 
} 
private void handlingEvent(MotionEvent event) { 
switch (event.getAction()) { 
case MotionEvent.ACTION_MOVE: 
moveX = (int) event.getX(); 
moveY = (int) event.getY(); 
MLog.i("onMove:" + moveX + " , " + moveY); 
for (PointInfo temp : points) { 
if (temp.isInMyPlace(moveX, moveY) && temp.isNotSelected()) { 
temp.setSelected(true); 
startX = temp.getCenterX(); 
startY = temp.getCenterY(); 
int len = lockString.length(); 
if (len != 0) { 
int preId = lockString.charAt(len - 1) - 48; 
points[preId].setNextId(temp.getId()); 
} 
lockString.append(temp.getId()); 
break; 
} 
} 
invalidate(0, height - width, width, height); 
break; 
case MotionEvent.ACTION_DOWN: 
int downX = (int) event.getX(); 
int downY = (int) event.getY(); 
MLog.i("onDown:" + downX + " , " + downY); 
for (PointInfo temp : points) { 
if (temp.isInMyPlace(downX, downY)) { 
temp.setSelected(true); 
startPoint = temp; 
startX = temp.getCenterX(); 
startY = temp.getCenterY(); 
lockString.append(temp.getId()); 
break; 
} 
} 
invalidate(0, height - width, width, height); 
break; 
case MotionEvent.ACTION_UP: 
MLog.i("onUp"); 
startX = startY = moveX = moveY = 0; 
isUp = true; 
invalidate(); 
break; 
default: 
MLog.i(" Received other events!! "); 
break; 
} 
} 
private void finishDraw() { 
for (PointInfo temp : points) { 
temp.setSelected(false); 
temp.setNextId(temp.getId()); 
} 
lockString.delete(0, lockString.length()); 
isUp = false; 
invalidate(); 
} 
private void initPoints(PointInfo[] points) { 
int len = points.length; 
int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4; 
//  Displays the upper-left coordinates of the image when selected  
int seletedX = seletedSpacing; 
int seletedY = height - width + seletedSpacing; 
//  The upper-left coordinate of the image when not selected  
int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius; 
int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius; 
//  I'm going to plot each point  
for (int i = 0; i < len; i++) { 
if (i == 3 || i == 6) { 
seletedX = seletedSpacing; 
seletedY += selectedBitmapDiameter + seletedSpacing; 
defaultX = seletedX + selectedBitmapRadius 
- defaultBitmapRadius; 
defaultY += selectedBitmapDiameter + seletedSpacing; 
} 
points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY); 
seletedX += selectedBitmapDiameter + seletedSpacing; 
defaultX += selectedBitmapDiameter + seletedSpacing; 
} 
} 
private void initPaint() { 
initLinePaint(linePaint); 
initTextPaint(textPaint); 
initWhiteLinePaint(whiteLinePaint); 
} 
/** 
*  Initializes the text brush  
* @param paint 
*/ 
private void initTextPaint(Paint paint) { 
textPaint.setTextSize(30); 
textPaint.setAntiAlias(true); 
textPaint.setTypeface(Typeface.MONOSPACE); 
} 
/** 
*  Initializes the black line brush  
* 
* @param paint 
*/ 
private void initLinePaint(Paint paint) { 
paint.setColor(Color.GRAY); 
paint.setStrokeWidth(defaultBitmap.getWidth()); 
paint.setAntiAlias(true); 
paint.setStrokeCap(Cap.ROUND); 
} 
/** 
*  Initializes the white line brush  
* 
* @param paint 
*/ 
private void initWhiteLinePaint(Paint paint) { 
paint.setColor(Color.WHITE); 
paint.setStrokeWidth(defaultBitmap.getWidth() - 5); 
paint.setAntiAlias(true); 
paint.setStrokeCap(Cap.ROUND); 
} 
/** 
*  Draw the finished part  
* 
* @param canvas 
*/ 
private void drawNinePoint(Canvas canvas) { 
if (startPoint != null) { 
drawEachLine(canvas, startPoint); 
} 
//  Draw a picture of each point  
for (PointInfo pointInfo : points) { 
if (pointInfo.isSelected()) {//  Draw the circle  
canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(), 
pointInfo.getSeletedY(), null); 
} 
//  Plot points  
canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(), 
pointInfo.getDefaultY(), null); 
} 
} 
/** 
*  Recursively draws a line segment between every two points  
* 
* @param canvas 
* @param point 
*/ 
private void drawEachLine(Canvas canvas, PointInfo point) { 
if (point.hasNextId()) { 
int n = point.getNextId(); 
drawLine(canvas, point.getCenterX(), point.getCenterY(), 
points[n].getCenterX(), points[n].getCenterY()); 
//  recursive  
drawEachLine(canvas, points[n]); 
} 
} 
/** 
*  Draw the black line first, then draw the white line above, to achieve the effect of the black edge white line  
* 
* @param canvas 
* @param startX 
* @param startY 
* @param stopX 
* @param stopY 
*/ 
private void drawLine(Canvas canvas, float startX, float startY, 
float stopX, float stopY) { 
canvas.drawLine(startX, startY, stopX, stopY, linePaint); 
canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint); 
} 
/** 
*  Used to represent 1 A point  
* 
* @author zkwlx 
* 
*/ 
private class PointInfo { 
// 1 A point of ID 
private int id; 
//  The current point points down 1 A point of ID , for myself when there is none ID 
private int nextId; 
//  Whether or not selected  
private boolean selected; 
//  The top left corner of the image by default X coordinates  
private int defaultX; 
//  The top left corner of the image by default Y coordinates  
private int defaultY; 
//  The top left corner of the image when selected X coordinates  
private int seletedX; 
//  The top left corner of the image when selected Y coordinates  
private int seletedY; 
public PointInfo(int id, int defaultX, int defaultY, int seletedX, 
int seletedY) { 
this.id = id; 
this.nextId = id; 
this.defaultX = defaultX; 
this.defaultY = defaultY; 
this.seletedX = seletedX; 
this.seletedY = seletedY; 
} 
public boolean isSelected() { 
return selected; 
} 
public boolean isNotSelected() { 
return !isSelected(); 
} 
public void setSelected(boolean selected) { 
this.selected = selected; 
} 
public int getId() { 
return id; 
} 
public int getDefaultX() { 
return defaultX; 
} 
public int getDefaultY() { 
return defaultY; 
} 
public int getSeletedX() { 
return seletedX; 
} 
public int getSeletedY() { 
return seletedY; 
} 
public int getCenterX() { 
return seletedX + selectedBitmapRadius; 
} 
public int getCenterY() { 
return seletedY + selectedBitmapRadius; 
} 
public boolean hasNextId() { 
return nextId != id; 
} 
public int getNextId() { 
return nextId; 
} 
public void setNextId(int nextId) { 
this.nextId = nextId; 
} 
/** 
*  coordinates (x,y) Is it within the range of the current point  
* 
* @param x 
* @param y 
* @return 
*/ 
public boolean isInMyPlace(int x, int y) { 
boolean inX = x > seletedX 
&& x < (seletedX + selectedBitmapDiameter); 
boolean inY = y > seletedY 
&& y < (seletedY + selectedBitmapDiameter); 
return (inX && inY); 
} 
} 
} 

NinePointView.java
 
package org.demo.custon_view; 
import org.demo.utils.MLog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.Paint.Cap; 
import android.graphics.Path; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
public class NinePointView extends View { 
Paint linePaint = new Paint(); 
Paint textPaint = new Paint(); 
Path path = new Path(); 
//  Because both pictures are square, so get 1 length  
Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(), 
R.drawable.lock); 
int defaultBitmapRadius = defaultBitmap.getWidth() / 2; 
//  Initializes the diameter and radius of the selected image  
Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(), 
R.drawable.indicator_lock_area); 
int selectedBitmapDiameter = selectedBitmap.getWidth(); 
int selectedBitmapRadius = selectedBitmapDiameter / 2; 
//  Initializes a picture of the indicator  
Bitmap indicateBitmap = BitmapFactory.decodeResource(getResources(), 
R.drawable.indicator_lock_area_next); 
Bitmap tempBitmap = null; 
//  defined 9 An array of points  
PointInfo[] points = new PointInfo[9]; 
//  The width and height of the screen  
int width, height; 
//  when ACTION_MOVE When get the X . Y coordinates  
int moveX, moveY; 
//  whether ACTION_UP 
boolean isUp = false; 
//  The resulting user lock sequence  
StringBuffer lockString = new StringBuffer(); 
Matrix matrix = new Matrix(); 
public NinePointView(Context context) { 
super(context); 
this.setBackgroundColor(Color.WHITE); 
initLinePaint(linePaint); 
initTextPaint(textPaint); 
} 
public NinePointView(Context context, AttributeSet attrs) { 
super(context, attrs); 
this.setBackgroundColor(Color.WHITE); 
initLinePaint(linePaint); 
initTextPaint(textPaint); 
} 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
MLog.i("onMeasure"); 
width = getWidth(); 
height = getHeight(); 
if (width != 0 && height != 0) { 
initPoints(points); 
} 
MLog.i("width , height = " + width + " , " + height); 
super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 
@Override 
protected void onLayout(boolean changed, int left, int top, int right, 
int bottom) { 
MLog.i("onLayout"); 
super.onLayout(changed, left, top, right, bottom); 
} 
private int startX = 0, startY = 0; 
@Override 
protected void onDraw(Canvas canvas) { 
canvas.drawText(" Sliding order of users: " + lockString, 0, 40, textPaint); 
if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) { 
//  Draws the currently active line segment  
canvas.drawLine(startX, startY, moveX, moveY, linePaint); 
} 
drawNinePoint(canvas, linePaint); 
super.onDraw(canvas); 
} 
//  Remember, this DOWN and MOVE , UP It's in pairs, if not from UP Release, and you won't get DOWN ;  
//  To gain DOWN When, 1 Be sure to confirm the consumption of the event, otherwise MOVE and UP Not by this VIEW the onTouchEvent receive  
@Override 
public boolean onTouchEvent(MotionEvent event) { 
boolean flag = true; 
if (isUp) {//  If you have finished, slide the whole thing Canvas reset  
finishDraw(); 
//  when UP After that, return false , release the event to the system, otherwise it cannot be obtained Down The event  
flag = false; 
} else {//  Continue drawing until you finish  
handlingEvent(event); 
//  I'm going to return true , otherwise it means it should View Do not consume this event, to the system processing, will not be received MOVE and UP The event  
flag = true; 
} 
return flag; 
} 
private void handlingEvent(MotionEvent event) { 
switch (event.getAction()) { 
case MotionEvent.ACTION_MOVE: 
moveX = (int) event.getX(); 
moveY = (int) event.getY(); 
MLog.i("onMove:" + moveX + " , " + moveY); 
for (PointInfo temp : points) { 
if (temp.isInMyPlace(moveX, moveY) && temp.isNotSelected()) { 
temp.setSelected(true); 
startX = temp.getCenterX(); 
startY = temp.getCenterY(); 
int len = lockString.length(); 
if (len != 0) { 
int preId = lockString.charAt(len - 1) - 48; 
points[preId].setNextId(temp.getId()); 
} 
lockString.append(temp.getId()); 
break; 
} 
} 
invalidate(0, height - width, width, height); 
break; 
case MotionEvent.ACTION_DOWN: 
int downX = (int) event.getX(); 
int downY = (int) event.getY(); 
MLog.i("onDown:" + downX + " , " + downY); 
for (PointInfo temp : points) { 
if (temp.isInMyPlace(downX, downY)) { 
temp.setSelected(true); 
startX = temp.getCenterX(); 
startY = temp.getCenterY(); 
lockString.append(temp.getId()); 
break; 
} 
} 
invalidate(0, height - width, width, height); 
break; 
case MotionEvent.ACTION_UP: 
MLog.i("onUp"); 
startX = startY = moveX = moveY = 0; 
isUp = true; 
invalidate(); 
break; 
default: 
MLog.i(" Received other events!! "); 
break; 
} 
} 
private void finishDraw() { 
for (PointInfo temp : points) { 
temp.setSelected(false); 
temp.setNextId(temp.getId()); 
} 
lockString.delete(0, lockString.length()); 
isUp = false; 
invalidate(); 
} 
private void initPoints(PointInfo[] points) { 
int len = points.length; 
int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4; 
//  Displays the upper-left coordinates of the image when selected  
int seletedX = seletedSpacing; 
int seletedY = height - width + seletedSpacing; 
//  The upper-left coordinate of the image when not selected  
int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius; 
int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius; 
for (int i = 0; i < len; i++) { 
if (i == 3 || i == 6) { 
seletedX = seletedSpacing; 
seletedY += selectedBitmapDiameter + seletedSpacing; 
defaultX = seletedX + selectedBitmapRadius 
- defaultBitmapRadius; 
defaultY += selectedBitmapDiameter + seletedSpacing; 
} 
points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY); 
seletedX += selectedBitmapDiameter + seletedSpacing; 
defaultX += selectedBitmapDiameter + seletedSpacing; 
} 
} 
private void initTextPaint(Paint paint) { 
textPaint.setTextSize(30); 
textPaint.setAntiAlias(true); 
textPaint.setTypeface(Typeface.MONOSPACE); 
} 
/** 
*  Initializes the line brush  
* 
* @param paint 
*/ 
private void initLinePaint(Paint paint) { 
paint.setColor(Color.GRAY); 
paint.setStrokeWidth(defaultBitmap.getWidth()); 
paint.setAntiAlias(true); 
paint.setStrokeCap(Cap.ROUND); 
} 
/** 
*  Draw the finished part  
* 
* @param canvas 
*/ 
private void drawNinePoint(Canvas canvas, Paint paint) { 
//  Draw the line drawn by the user first  
for (PointInfo pointInfo : points) { 
if (pointInfo.hasNextId()) { 
int n = pointInfo.getNextId(); 
canvas.drawLine(pointInfo.getCenterX(), pointInfo.getCenterY(), 
points[n].getCenterX(), points[n].getCenterY(), paint); 
} 
} 
//  Draw a picture of each point  
for (PointInfo pointInfo : points) { 
if (pointInfo.isSelected()) { 
if (pointInfo.hasNextId()) { 
matrix.reset(); 
int i = (int) Math.abs(Math.random() * 1000 - 640); 
MLog.i(" Angle of random arrival: " + i); 
matrix.setRotate(i); 
tempBitmap = Bitmap.createBitmap(indicateBitmap, 0, 0, 
indicateBitmap.getWidth(), 
indicateBitmap.getHeight(), matrix, false); 
canvas.drawBitmap(tempBitmap, pointInfo.getSeletedX(), 
pointInfo.getSeletedY(), paint); 
} else { 
canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(), 
pointInfo.getSeletedY(), paint); 
} 
} 
canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(), 
pointInfo.getDefaultY(), paint); 
} 
} 
private class PointInfo { 
// 1 A point of ID 
private int id; 
//  The current point points down 1 A point of ID , for myself when there is none ID 
private int nextId; 
//  Whether or not selected  
private boolean selected; 
//  The top left corner of the image by default X coordinates  
private int defaultX; 
//  The top left corner of the image by default Y coordinates  
private int defaultY; 
//  The top left corner of the image when selected X coordinates  
private int seletedX; 
//  The top left corner of the image when selected Y coordinates  
private int seletedY; 
public PointInfo(int id, int defaultX, int defaultY, int seletedX, 
int seletedY) { 
this.id = id; 
this.nextId = id; 
this.defaultX = defaultX; 
this.defaultY = defaultY; 
this.seletedX = seletedX; 
this.seletedY = seletedY; 
} 
public boolean isSelected() { 
return selected; 
} 
public boolean isNotSelected() { 
return !isSelected(); 
} 
public void setSelected(boolean selected) { 
this.selected = selected; 
} 
public int getId() { 
return id; 
} 
public int getDefaultX() { 
return defaultX; 
} 
public int getDefaultY() { 
return defaultY; 
} 
public int getSeletedX() { 
return seletedX; 
} 
public int getSeletedY() { 
return seletedY; 
} 
public int getCenterX() { 
return seletedX + selectedBitmapRadius; 
} 
public int getCenterY() { 
return seletedY + selectedBitmapRadius; 
} 
public boolean hasNextId() { 
return nextId != id; 
} 
public int getNextId() { 
return nextId; 
} 
public void setNextId(int nextId) { 
this.nextId = nextId; 
} 
/** 
*  coordinates (x,y) Is it within the range of the current point  
* 
* @param x 
* @param y 
* @return 
*/ 
public boolean isInMyPlace(int x, int y) { 
boolean inX = x > seletedX 
&& x < (seletedX + selectedBitmapDiameter); 
boolean inY = y > seletedY 
&& y < (seletedY + selectedBitmapDiameter); 
if (inX && inY) { 
return true; 
} else { 
return false; 
} 
} 
} 
} 

Related articles: