/*
* Copyright (C) 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.zxing.view;
import java.util.Collection;
import java.util.HashSet;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import com.google.zxing.ResultPoint;
import com.joyplus.R;
import com.zxing.camera.CameraManager;
/**
* This view is overlaid on top of the camera preview. It adds the viewfinder
* rectangle and partial transparency outside it, as well as the laser scanner
* animation and result points. �Զ����View������ʱ�м���ʾ��
*/
public final class ViewfinderView extends View {
private static final int[] SCANNER_ALPHA = { 0, 64, 128, 192, 255, 192,
128, 64 };
private static final long ANIMATION_DELAY = 100L;
private static final int OPAQUE = 0xFF;
private final Paint paint;
private Bitmap resultBitmap;
private final int maskColor;
private final int resultColor;
private final int frameColor;
private final int laserColor;
private final int resultPointColor;
private int scannerAlpha;
private Collection<ResultPoint> possibleResultPoints;
private Collection<ResultPoint> lastPossibleResultPoints;
private int bmpDTY = 0;
private int maxDTY = 0;
Rect frame;
int width;
// This constructor is used when the class is built from an XML resource.
public ViewfinderView(Context context, AttributeSet attrs) {
super(context, attrs);
// Initialize these once for performance rather than calling them every
// time in onDraw().
paint = new Paint();
Resources resources = getResources();
maskColor = resources.getColor(R.color.viewfinder_mask);
resultColor = resources.getColor(R.color.result_view);
frameColor = resources.getColor(R.color.viewfinder_frame);
laserColor = resources.getColor(R.color.viewfinder_laser);
resultPointColor = resources.getColor(R.color.possible_result_points);
scannerAlpha = 0;
possibleResultPoints = new HashSet<ResultPoint>(5);
}
@Override
public void onDraw(Canvas canvas) {
resultBitmap = (Bitmap) BitmapFactory.decodeResource(getResources(),
R.drawable.saomiao);
frame = CameraManager.get().getFramingRect();
if (frame == null) {
return;
}
width = canvas.getWidth();
if (width <= 480) {
if (bmpDTY == 0) {
bmpDTY = frame.top + 20;
maxDTY = frame.top +200;
}
if (resultBitmap != null) {
paint.setAlpha(OPAQUE);
canvas.drawBitmap(resultBitmap, frame.left + 70, bmpDTY, paint);
}
} else if (width >= 540 && width <640) {
if (bmpDTY == 0) {
bmpDTY = frame.top - 80;
maxDTY = frame.top + 220;
}
if (resultBitmap != null) {
paint.setAlpha(OPAQUE);
canvas.drawBitmap(resultBitmap, frame.left + 90, bmpDTY, paint);//5
}
} else if (width >= 640 && width < 720)
{
if (bmpDTY == 0) {
bmpDTY = frame.top - 80;
maxDTY = frame.top + 220;
}
if (resultBitmap != null) {
paint.setAlpha(OPAQUE);
canvas.drawBitmap(resultBitmap, frame.left + 90, bmpDTY, paint);//5
}
}
else if (width >= 720 && width < 1080)
{
if (bmpDTY == 0) {
bmpDTY = frame.top - 80;
maxDTY = frame.top + 220;
}
if (resultBitmap != null) {
paint.setAlpha(OPAQUE);
canvas.drawBitmap(resultBitmap, frame.left + 10, bmpDTY, paint);//5
}
} else if ( width >= 1080)
{
if (bmpDTY == 0) {
bmpDTY = frame.top - 200;
maxDTY = frame.top + 220;
}
if (resultBitmap != null) {
paint.setAlpha(OPAQUE);
canvas.drawBitmap(resultBitmap, frame.left-60, bmpDTY, paint);//5
}
}
handler.postDelayed(runnable, 50);
}
public void drawViewfinder() {
resultBitmap = (Bitmap) BitmapFactory.decodeResource(getResources(),
R.drawable.saomiao);
invalidate();
}
/**
* Draw a bitmap with the result points highlighted instead of the live
* scanning display.
*
* @param barcode
* An image of the decoded barcode.
*/
public void drawResultBitmap(Bitmap barcode) {
resultBitmap = barcode;
invalidate();
}
public void addPossibleResultPoint(ResultPoint point) {
possibleResultPoints.add(point);
}
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (bmpDTY != 0 && bmpDTY < maxDTY) {
bmpDTY += 4;
} else if (bmpDTY == maxDTY) {
bmpDTY = 0;
}
ViewfinderView.this.postInvalidate();
}
};
}