Как я могу проверить, что полный путь был удален? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать приложение для тестирования дисплея. Redmi Mobile - тестовый экран дисплеяShot enter image description here

Для этого я использую Canvas. Вы можете проверить код ниже для получения более подробной информации.

Я пытаюсь использовать эту функцию, но приложение застряло во время выполнения этого кода

 boolean CheckPixelColor() {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int height = displayMetrics.heightPixels;
    int width = displayMetrics.widthPixels;
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            if (bitmapData.getPixel(i, j) == Color.MAGENTA) {
                System.out.println("Not Done");
           return false;
            }
        }
    }
    return true;
}

Этот код работает. Этот код предназначен для создания пути во время инициализации и удаления его позже.

public class DrawingView extends View {
private static final float TOUCH_TOLERANCE = 4;
    private Bitmap bitmap;
    private Canvas canvas;
    private Path path;
    private Paint bitmapPaint;
    private Paint paint;
    private boolean drawMode;
    private float x, y;
    private float penSize = 20;
    private float eraserSize = 50;
    private Bitmap bitmapData;
    Context context;
    public DrawingView(Context c) {
        this(c, null);
    }
    public DrawingView(Context c, AttributeSet attrs) {
        this(c, attrs, 0);
    }
    public DrawingView(Context c, AttributeSet attrs, int defStyle) {
        super(c, attrs, defStyle);
        this.context = c;
        init();
    }
    private void init() {
        path = new Path();
        bitmapPaint = new Paint(Paint.DITHER_FLAG);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(penSize);
        drawMode = true;
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
        this.setDrawingCacheEnabled(true);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        }
        canvas = new Canvas(bitmap);
        canvas.drawColor(Color.TRANSPARENT);
        Init();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(bitmap, 0, 0, bitmapPaint);
        canvas.drawPath(path, paint);
        bitmapData = this.getDrawingCache(true);
    }
    private void touchStart(float x, float y) {
        path.reset();
        path.moveTo(x, y);
        this.x = x;
        this.y = y;
        canvas.drawPath(path, paint);
    }
    private void touchMove(float x, float y) {
        float dx = Math.abs(x - this.x);
        float dy = Math.abs(y - this.y);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            path.quadTo(this.x, this.y, (x + this.x) / 2, (y + this.y) / 2);
            this.x = x;
            this.y = y;
        }
        canvas.drawPath(path, paint);
    }
    private void touchUp() {
        path.lineTo(x, y);
        canvas.drawPath(path, paint);
        path.reset();
        if (drawMode) {
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
        } else {
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        }
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (!drawMode) {
                    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                } else {
                    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
                }
                touchStart(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touchMove(x, y);
                if (!drawMode) {
                    path.lineTo(this.x, this.y);
                    path.reset();
                    path.moveTo(x, y);
                }
                canvas.drawPath(path, paint);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touchUp();
                invalidate();
                break;
            default:
                break;
        }
        return true;
    }
    public void initializePen() {
        drawMode = true;
        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(penSize);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
    }
    public void initializeEraser() {
        drawMode = false;
        paint.setColor(Color.parseColor("#f4f4f4"));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(eraserSize);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    }
    public void clear() {
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        invalidate();
    }
    @Override
    public void setBackgroundColor(int color) {
        if (canvas == null) {
            canvas = new Canvas();
        }
        canvas.drawColor(color);
        super.setBackgroundColor(color);
    }
    public void setEraserSize(float size) {
        eraserSize = size;
        initializeEraser();
    }
    public void setPenSize(float size) {
        penSize = size;
        initializePen();
    }
    public float getEraserSize() {
        return eraserSize;
    }
    public float getPenSize() {
        return penSize;
    }
    public void setPenColor(@ColorInt int color) {
        paint.setColor(color);
    }
    public @ColorInt
    int getPenColor() {
        return paint.getColor();
    }
    public void loadImage(Bitmap bitmap) {
        this.bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        canvas.setBitmap(this.bitmap);
        bitmap.recycle();
        invalidate();
    }
    public boolean saveImage(String filePath, String filename, Bitmap.CompressFormat format,
                             int quality) {
        if (quality > 100) {
            Log.d("saveImage", "quality cannot be greater that 100");
            return false;
        }
        File file;
        FileOutputStream out = null;
        try {
            switch (format) {
                case PNG:
                    file = new File(filePath, filename + ".png");
                    out = new FileOutputStream(file);
                    return bitmap.compress(Bitmap.CompressFormat.PNG, quality, out);
                case JPEG:
                    file = new File(filePath, filename + ".jpg");
                    out = new FileOutputStream(file);
                    return bitmap.compress(Bitmap.CompressFormat.JPEG, quality, out);
                default:
                    file = new File(filePath, filename + ".png");
                    out = new FileOutputStream(file);
                    return bitmap.compress(Bitmap.CompressFormat.PNG, quality, out);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
    void Init() {
        initializePen();
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;
        System.out.println("height: " + height);
        System.out.println("width: " + width);
        path.reset();
        path.moveTo(0, 0);
        path.lineTo(0, height);
        path.lineTo(width, height);
        path.lineTo(width, 0);
        path.lineTo(0, 0);
        path.lineTo(width, height);
        path.moveTo(width, 0);
        path.lineTo(0, height);
        canvas.drawPath(path, paint);
        invalidate();
        initializeEraser();
    }
    boolean CheckPixelColor() {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                if (bitmapData.getPixel(i, j) == Color.MAGENTA) {
                    System.out.println("Not Done");
                }
            }
        }
        return false;
    }
}

Теперь я хочу проверить, что все пути были стерты.

1 Ответ

0 голосов
/ 22 октября 2019

Спасибо @Radhey. Согласно вашему предложению, я сравниваю полный рисунок с начальным, и теперь он работает.

Рабочий код:

  @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (bitmap == null) {
            bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            bitmapSateSave = bitmap;
        }
        canvas = new Canvas(bitmap);
        canvas.drawColor(Color.TRANSPARENT);
        Init();
    }

   private void init() {
        path = new Path();
        bitmapPaint = new Paint(Paint.DITHER_FLAG);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeCap(Paint.Cap.ROUND);
        paint.setStrokeWidth(penSize);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN));
        this.setDrawingCacheEnabled(true); // Enable Cache
    }


    @Override
    protected void onDraw(Canvas canvas) 
    {       super.onDraw(canvas);
            canvas.drawBitmap(bitmap,0,0,bitmapPaint);
            canvas.drawPath(path,paint);
            bitmapData = this.getDrawingCache(true); // Save Bitmap data
        }


      boolean CompareBitmap() {
            if (bitmapData.sameAs(bitmapSateSave)) {
                System.out.println("Same");
            } else {
                System.out.println("Different");        }

            return false;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...