У меня проблемы с анимацией холста в Zxing Android - PullRequest
0 голосов
/ 27 июня 2019

У меня проблема с анимацией прямоугольника в Zxing, я создаю qr-ридер с этой библиотекой, и мой клиент попросил у меня анимированный лазер.Нет проблем, лазерная анимация работает нормально.

Но он попросил у меня текстуру поверх лазера: / а я не могу анимировать это.

С уважением, код для лазера является копией прошлого.

    @Override
    public void drawLaser(Canvas canvas) {
        // Draw a red "laser scanner" line through the middle to show decoding is active
        mLaserPaint.setAlpha(155);
        int middle = mFramingRect.height() / 2 + mFramingRect.top;
        middle = middle + cntr;
        if ((cntr < 300) && (!goingup)) {
            canvas.drawRect(mFramingRect.left + 2,
                    middle - 5,
                    mFramingRect.right - 1,
                    middle + 10,
                    mLaserPaint);
            cntr = cntr + 4;
        }

        if ((cntr >= 300) && (!goingup)) goingup = true;

        if ((cntr > -300) && (goingup)) {
            canvas.drawRect(mFramingRect.left + 4,
                    middle - 5,
                    mFramingRect.right - 1,
                    middle + 10,
                    mLaserPaint);
            cntr = cntr - 4;
        }

        if ((cntr <= -300) && (goingup)) goingup = false;

        postInvalidateDelayed(ANIMATION_DELAY,
                mFramingRect.left - POINT_SIZE,
                mFramingRect.top - POINT_SIZE,
                mFramingRect.right + POINT_SIZE,
                mFramingRect.bottom + POINT_SIZE);
    }

И мой код для попытки анимировать текстуру поверх лазера

    public void drawTexture (Canvas canvas) {
        int a = 200;
        int b = 220;
        int c = 400;
        int d = 440;

        Paint paint = new Paint();
        paint.setColor(Color.RED);

        c = c + 100;
        d = d + 100;

        canvas.drawRect(a,b,c,d,paint);
        invalidate();
    }

оба метода вызываются в методе onDraw

    public void onDraw(Canvas canvas) {
        if (this.getFramingRect() != null) {
            ...
            this.drawLaser(canvas);
            this.drawTexture(canvas);
        }
    }

Я не знаю, какоживить мой прямоугольник :(, спасибо за вашу помощь.

Вот мой полный код

https://gist.github.com/memoadian/2266fbfe6bdf5a3345f2776bdbe7bf2c

ОБНОВЛЕНИЕ

Хорошо, анимация была такой:

public void drawTexture (Canvas canvas) {
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.codi_texture);
    BitmapShader fillBMPshader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

    Paint paint = new Paint();
    paint.setShader(fillBMPshader);

    int middle = mFramingRect.height() / 2 + mFramingRect.top;
    middle = middle + cntr;

    if ((cntr < 300) && (!goingup)) {
        canvas.drawRect(mFramingRect.left,
                mFramingRect.top,
                mFramingRect.right,
                middle,
                paint);

        cntr = cntr + 4;
    }

    if ((cntr >= 300) && (!goingup)) goingup = true;

    if ((cntr > -300) && (goingup)) {
        canvas.drawRect(mFramingRect.left,
                mFramingRect.top,
                mFramingRect.right,
                middle,
                paint);
        cntr = cntr - 4;
    }

    if ((cntr <= -300) && (goingup)) goingup = false;
}

И результат

enter image description here

1 Ответ

0 голосов
/ 27 июня 2019

enter image description here

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

mScannerView.setLaserColor(mContext.getResources().getColor(R.color.btn_color));
    mScannerView.setLaserEnabled(false);
    mScannerView.setBorderColor(mContext.getResources().getColor(android.R.color.transparent));
    mScannerView.setMaskColor(mContext.getResources().getColor(android.R.color.transparent));
    List<BarcodeFormat> enableFormat = new ArrayList<>();
    enableFormat.add(BarcodeFormat.QR_CODE);
    mScannerView.setFormats(enableFormat);
    mScannerView.setAutoFocus(true);

    try {
        int padding = paddingInDp(100);
        lottieView.setPadding(-padding, -padding, -padding, -padding);
        lottieView.setAnimation("barcode_scan.json");
        lottieView.setSpeed(0.5f);
        lottieView.playAnimation();
        lottieView.loop(true);
    } catch (Exception e){
        e.printStackTrace();
    }
...