Android пользовательский вид чертежа - PullRequest
0 голосов
/ 26 апреля 2019

Android пользовательский вид чертежа: Снимок экрана:

enter image description here

Это не может сохранить последнюю трассировку, я хочу перерисовать растровое изображение, но эффект не очень хороший.

Скриншот:

enter image description here

код:

public class CustomView extends View {

private float sX, sY, eX, eY;

private Paint paint = new Paint();
private Canvas canvas = new Canvas();
private Bitmap bitmap;

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    canvas.setBitmap(bitmap);
    setBackgroundColor(Color.WHITE);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            eX = event.getX();
            eY = event.getY();
            canvas.drawLine(sX, sY, eX, eY, paint);
            break;
        case MotionEvent.ACTION_DOWN:
            sX = event.getX();
            sY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    invalidate();
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(bitmap, getMatrix(), null);
}
}

Вы когда-нибудь сталкивались с такой же проблемой?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Вам следует обновить переменную sX sY, когда ваш палец движется

  1. Точка ACTION_DOWN равна [100, 100] sX = 100, sY = 100
  2. ACTION_MOVE теперь палец находится в [130, 150] eY = 130, eY = 150
  3. invalidate(), поэтому вызовет draw() рисование линии [100, 100] до [130, 150]
  4. палец продолжает двигаться
  5. ACTION_MOVE теперь начало [130, 150] sX = 130, sY = 150 , а не значение точки ACTION_DOWN
  6. ACTION_MOVE теперь палец находится в [160, 180]
  7. invalidate(), поэтому вызовет draw() рисование линии [130, 150] до [160, 180]
  8. продолжайте делать то же самое .....
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            eX = event.getX();
            eY = event.getY();
            invalidate()
            sX = eX;
            sY = eY;
            break;
        case MotionEvent.ACTION_DOWN:
            sX = event.getX();
            sY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            canvas.drawLine(sX, sY, eX, eY, paint);
            break;
    }
    //invalidate();
    return true;
}

Я не запускаю код, но, возможно, вы поняли, что я имею в виду.

вы должны обновить как startX startY, так и endX endY

0 голосов
/ 26 апреля 2019

Я нашел решение, но я не хочу решать проблему таким способом. Моя цель - решить проблему только с новым холстом.

скриншот

public class CustomView extends View {

private float sX, sY, eX, eY;

private Paint paint = new Paint();
private Canvas canvas = new Canvas();
private Bitmap bitmap;

public CustomView(Context context) {
    super(context);
    init();
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    paint.setColor(Color.RED);
    paint.setStrokeWidth(3);
    paint.setAntiAlias(true);
    paint.setDither(true);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStyle(Paint.Style.STROKE);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    canvas.setBitmap(bitmap);
    setBackgroundColor(Color.WHITE);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            eX = event.getX();
            eY = event.getY();
            break;
        case MotionEvent.ACTION_DOWN:
            sX = event.getX();
            sY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            canvas.drawLine(sX, sY, eX, eY, paint);
            break;
    }
    invalidate();
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(bitmap, getMatrix(), null);
    canvas.drawLine(sX, sY, eX, eY, paint);
}
}

или

public class CustomView extends View {

private Paint paint = new Paint();
private List<Path> cache = new ArrayList<>();
private Path currentPath;

public CustomView(Context context) {
    super(context);
    init();
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

private void init() {
    paint.setColor(Color.RED);
    paint.setStrokeWidth(3);
    paint.setAntiAlias(true);
    paint.setDither(true);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStyle(Paint.Style.STROKE);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
            if (currentPath != null) {
                currentPath.eX = event.getX();
                currentPath.eY = event.getY();
            }
            break;
        case MotionEvent.ACTION_DOWN:
            currentPath = new Path();
            currentPath.sX = event.getX();
            currentPath.sY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            if (currentPath != null) {
                cache.add(currentPath);
                currentPath = null;
            }
            break;

    }
    invalidate();
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    for (Path path : cache) {
        canvas.drawLine(path.sX, path.sY, path.eX, path.eY, paint);
    }
    if (currentPath == null) return;
    canvas.drawLine(currentPath.sX, currentPath.sY, currentPath.eX, currentPath.eY, paint);
}

static class Path {
    float sX;
    float sY;
    float eX;
    float eY;
}
}
...