设计自定义android锁模式类似应用程序与自定义功能

时间:2016-09-09 11:05:51

标签: android

我想创建包含一些点的android应用程序,用户可以用它们之间的绘图线连接点(类似于android锁定模式,但是在自定义位置有点,用户可以在绘制图案后添加线条)。 我不知道我应该从哪里开始搜索以及搜索此要求的内容。 我该如何设计和编码?

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

这个库可以帮助你,用这个

创建应用程序

https://github.com/Pi-Developers/Pi-Locker

更多参考:https://github.com/n3tr/DrawPoints

答案 1 :(得分:0)

我终于找到了使用自定义视图的解决方案。在类似的情况下,请使用以下代码:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class ConnectDotsView extends View {

private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
private Paint mCirclePaint;
private Point startPoint;
private List<Point> selectPoints;
private static final int TOUCH_TOLERANCE_DP = 30;
private static final int BACKGROUND = 0xFFFFFF;
private List<Point> mPoints = new ArrayList<Point>();
private int mTouchTolerance;

public ConnectDotsView(Context context) {
    super(context);
    mCanvas = new Canvas();
    mPath = new Path();
    selectPoints = new ArrayList<Point>();
    initPaint();
}

public ConnectDotsView(Context context, AttributeSet attrs) {
    super(context, attrs);
    mCanvas = new Canvas();
    mPath = new Path();
    selectPoints = new ArrayList<Point>();
    initPaint();
}

public ConnectDotsView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mCanvas = new Canvas();
    mPath = new Path();
    selectPoints = new ArrayList<Point>();
    initPaint();
}

@Override
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
    super.onSizeChanged(width, height, oldWidth, oldHeight);
    clear();

}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(BACKGROUND);
    canvas.drawBitmap(mBitmap, 0, 0, null);
    canvas.drawPath(mPath, mPaint);

    //Draw Points
    for (Point point : mPoints) {
        canvas.drawCircle(point.x, point.y, 16, mCirclePaint);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_CANCEL:
            touch_up(x, y);
            invalidate();
            break;
    }
    return true;
}

private void touch_start(float x, float y) {
    startPoint = getFeasiblePoint(x, y);
}

private void touch_move(float x, float y) {
    clear();
    Point p = getFeasiblePoint(x, y);
    if (startPoint == null) {
        startPoint = p;
    } else if (p != null) {
        if (p != startPoint) {
            mPath.moveTo(startPoint.x, startPoint.y);
            mPath.lineTo(p.x, p.y);
            selectPoints.add(startPoint);
            selectPoints.add(p);
            startPoint = p;
        }
    } else {
        mCanvas.drawLine(startPoint.x, startPoint.y, x, y, mPaint);
    }
}

private void touch_up(float x, float y) {
    clear();
    Point p = getFeasiblePoint(x, y);
    if (startPoint == null) {
        startPoint = p;
    } else if (p != null) {
        if (p != startPoint) {
            mPath.moveTo(startPoint.x, startPoint.y);
            mPath.lineTo(p.x, p.y);
            selectPoints.add(startPoint);
            selectPoints.add(p);
            startPoint = p;
        }
    }
}

public void setPaint(Paint paint) {
    this.mPaint = paint;
}

public Bitmap getBitmap() {
    return mBitmap;
}

private void clear() {
    mBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    mBitmap.eraseColor(BACKGROUND);
    mCanvas.setBitmap(mBitmap);
    invalidate();
}

private Point getFeasiblePoint(float x, float y) {
    for (Point point : mPoints) {
        if (x > (point.x - mTouchTolerance) && x < (point.x + mTouchTolerance)) {
            if (y > (point.y - mTouchTolerance) && y < (point.y + mTouchTolerance)) {
                return point;
            }
        }
    }
    return null;
}

public List<Point> getPoints() {
    return mPoints;
}

public void setPoints(List<Point> points) {
    this.mPoints = points;
}

public List<Point> getSelectPoints() {
    return selectPoints;
}

public void Reset() {
    selectPoints = new ArrayList<Point>();
    mPath.reset();
    clear();
}

private void initPaint() {
    //Paint
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(Color.GREEN);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(12);
    //CirclePaint
    mCirclePaint = new Paint();
    mCirclePaint.setAntiAlias(true);
    mCirclePaint.setDither(true);
    mCirclePaint.setColor(Color.RED);
    mCirclePaint.setStyle(Paint.Style.FILL);
    mCirclePaint.setStrokeJoin(Paint.Join.ROUND);
    mCirclePaint.setStrokeCap(Paint.Cap.ROUND);
    mCirclePaint.setStrokeWidth(12);
    //Others
    mTouchTolerance = Utility.dp2px(getContext(), TOUCH_TOLERANCE_DP);
}
}