图形解锁的代码实现(付源码)




package hong.specialEffects.wight;




import hong.specialEffects.R;
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();



Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.lock);
int defaultBitmapRadius = defaultBitmap.getWidth() / 2;



Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.indicator_lock_area);
int selectedBitmapDiameter = selectedBitmap.getWidth();
int selectedBitmapRadius = selectedBitmapDiameter / 2;


PointInfo[] points = new PointInfo[9];


// 
PointInfo startPoint = null;


// 
int width, height;


// 
int moveX, moveY;


// 
boolean isUp = false;


// 
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) {
// 
width = getWidth();
height = getHeight();
if (width != 0 && height != 0) {
initPoints(points);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}


@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
}


private int startX = 0, startY = 0;


@Override
protected void onDraw(Canvas canvas) {


canvas.drawText("鐢ㄦ埛鐨勬粦鍔ㄩ『搴忥細" + lockString, 0, 40, textPaint);


if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {
// drawLine(canvas, startX, startY, moveX, moveY);
}


drawNinePoint(canvas);
invalidate();
super.onDraw(canvas);
}


// // 
@Override
public boolean onTouchEvent(MotionEvent event) {


boolean flag = true;


if (isUp) {// 


finishDraw();


// 
flag = false;


} else {// 
handlingEvent(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();
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();
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:
startX = startY = moveX = moveY = 0;
isUp = true;
invalidate();
break;
default:
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;


// 
int seletedX = seletedSpacing;
int seletedY = height - width + seletedSpacing;


// 
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 initPaint() {
initLinePaint(linePaint);
initTextPaint(textPaint);
initWhiteLinePaint(whiteLinePaint);
}


/**
* * @param paint
*/
private void initTextPaint(Paint paint) {
textPaint.setTextSize(30);
textPaint.setAntiAlias(true);
textPaint.setTypeface(Typeface.MONOSPACE);
}


/**
*
* @param paint
*/
private void initLinePaint(Paint paint) {
paint.setColor(Color.GRAY);
paint.setStrokeWidth(defaultBitmap.getWidth());
paint.setAntiAlias(true);
paint.setStrokeCap(Cap.ROUND);
}


/**
* * 
* @param paint
*/
private void initWhiteLinePaint(Paint paint) {
paint.setColor(Color.WHITE);
paint.setStrokeWidth(defaultBitmap.getWidth() - 5);
paint.setAntiAlias(true);
paint.setStrokeCap(Cap.ROUND);


}


/**


* @param canvas
*/
private void drawNinePoint(Canvas canvas) {


if (startPoint != null) {
drawEachLine(canvas, startPoint);
}


// 
for(PointInfo pointInfo : points) {

if (pointInfo.isSelected()) {// 
canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),pointInfo.getSeletedY(), null);
}
//
canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),pointInfo.getDefaultY(), null);
}


}


/**
*
* @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());
// 
drawEachLine(canvas, points[n]);
}
}


/**


* @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);
}


/**
* 鐢ㄦ潵琛ㄧず涓�釜鐐�
* @author zkwlx

*/
private class PointInfo {


// 
private int id;


// 
private int nextId;


//
private boolean selected;


// 
private int defaultX;


// 
private int defaultY;


// 
private int seletedX;


// 
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;
}


/**


* @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);
}


}


}






package com.example.imagelock;


import com.example.view.NinePointLineView;


import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;


public class ImageLockActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View v=new NinePointLineView(this);
        setContentView(v);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_image_lock, menu);
        return true;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值