112 lines
4.2 KiB
Java
112 lines
4.2 KiB
Java
package com.rncamerakit.camera.barcode;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Paint;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffXfermode;
|
|
import android.graphics.Rect;
|
|
import androidx.annotation.ColorInt;
|
|
import android.view.View;
|
|
|
|
|
|
import com.rncamerakit.R;
|
|
|
|
public class BarcodeFrame extends View {
|
|
|
|
private static final int STROKE_WIDTH = 5;
|
|
private static final int ANIMATION_SPEED = 8;
|
|
private static final int WIDTH_SCALE = 7;
|
|
private static final double HEIGHT_SCALE = 2.75;
|
|
|
|
private Paint dimPaint;
|
|
private Paint framePaint;
|
|
private Paint borderPaint;
|
|
private Paint laserPaint;
|
|
private Rect frameRect;
|
|
private int width;
|
|
private int height;
|
|
private int borderMargin;
|
|
|
|
private long previousFrameTime = System.currentTimeMillis();
|
|
private int laserY;
|
|
|
|
public BarcodeFrame(Context context) {
|
|
super(context);
|
|
init(context);
|
|
}
|
|
|
|
private void init(Context context) {
|
|
framePaint = new Paint();
|
|
framePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
|
|
dimPaint = new Paint();
|
|
dimPaint.setStyle(Paint.Style.FILL);
|
|
dimPaint.setColor(context.getResources().getColor(R.color.bg_dark));
|
|
borderPaint = new Paint();
|
|
borderPaint.setStyle(Paint.Style.STROKE);
|
|
borderPaint.setStrokeWidth(STROKE_WIDTH);
|
|
laserPaint = new Paint();
|
|
laserPaint.setStyle(Paint.Style.STROKE);
|
|
laserPaint.setStrokeWidth(STROKE_WIDTH);
|
|
|
|
frameRect = new Rect();
|
|
borderMargin = context.getResources().getDimensionPixelSize(R.dimen.border_length);
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
|
|
width = getMeasuredWidth();
|
|
height = getMeasuredHeight();
|
|
int marginWidth = width / WIDTH_SCALE;
|
|
int marginHeight = (int) (height / HEIGHT_SCALE);
|
|
|
|
frameRect.left = marginWidth;
|
|
frameRect.right = width - marginWidth;
|
|
frameRect.top = marginHeight;
|
|
frameRect.bottom = height - marginHeight;
|
|
}
|
|
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
long timeElapsed = (System.currentTimeMillis() - previousFrameTime);
|
|
super.onDraw(canvas);
|
|
canvas.drawRect(0, 0, width, height, dimPaint);
|
|
canvas.drawRect(frameRect, framePaint);
|
|
drawBorder(canvas);
|
|
drawLaser(canvas, timeElapsed);
|
|
previousFrameTime = System.currentTimeMillis();
|
|
this.invalidate(frameRect);
|
|
}
|
|
|
|
private void drawBorder(Canvas canvas) {
|
|
canvas.drawLine(frameRect.left, frameRect.top, frameRect.left, frameRect.top + borderMargin, borderPaint);
|
|
canvas.drawLine(frameRect.left, frameRect.top, frameRect.left + borderMargin, frameRect.top, borderPaint);
|
|
canvas.drawLine(frameRect.left, frameRect.bottom, frameRect.left, frameRect.bottom - borderMargin, borderPaint);
|
|
canvas.drawLine(frameRect.left, frameRect.bottom, frameRect.left + borderMargin, frameRect.bottom, borderPaint);
|
|
canvas.drawLine(frameRect.right, frameRect.top, frameRect.right - borderMargin, frameRect.top, borderPaint);
|
|
canvas.drawLine(frameRect.right, frameRect.top, frameRect.right, frameRect.top + borderMargin, borderPaint);
|
|
canvas.drawLine(frameRect.right, frameRect.bottom, frameRect.right, frameRect.bottom - borderMargin, borderPaint);
|
|
canvas.drawLine(frameRect.right, frameRect.bottom, frameRect.right - borderMargin, frameRect.bottom, borderPaint);
|
|
}
|
|
|
|
private void drawLaser(Canvas canvas, long timeElapsed) {
|
|
if (laserY > frameRect.bottom || laserY < frameRect.top) laserY = frameRect.top;
|
|
canvas.drawLine(frameRect.left + STROKE_WIDTH, laserY, frameRect.right - STROKE_WIDTH, laserY, laserPaint);
|
|
laserY += (timeElapsed) / ANIMATION_SPEED;
|
|
}
|
|
|
|
public Rect getFrameRect() {
|
|
return frameRect;
|
|
}
|
|
|
|
public void setFrameColor(@ColorInt int borderColor) {
|
|
borderPaint.setColor(borderColor);
|
|
}
|
|
|
|
public void setLaserColor(@ColorInt int laserColor) {
|
|
laserPaint.setColor(laserColor);
|
|
}
|
|
}
|