package com.dayu.recharge.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; import android.util.Log; import android.view.Display; import android.view.View; import android.view.WindowManager; import com.dayu.recharge.R; /** * 视频取景器控件 * * @author fangcm 2012-09-06 */ public class ViewfinderView extends View { private int width, height; private Paint paint; private Context mContext; private int mWidth, mHeight; private float lineLeft, lineRight, lineTop, lineBottom; private int lineModel = 0; private float marginW = 0f; private float marginH = 0f; private float marginT = 0f; private int dLineWidth = 12; private int dLen = 60; private int m_nImageWidth; private int m_nImageHeight; boolean l = false, r = false, t = false, b = false, L = false; public ViewfinderView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub this.mContext = context; } public ViewfinderView(Context context) { super(context); // TODO Auto-generated constructor stub this.mContext = context; } public ViewfinderView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub this.mContext = context; } /** * 大小 85.6*54 * 长是宽的1.58倍 * * @param pWidth * @param pHeight */ public float[] initFinder(int pWidth, int pHeight, Handler mHandler, int typeFront) { m_nImageWidth = pWidth; m_nImageHeight = pHeight; WindowManager manager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); Display display = manager.getDefaultDisplay(); width = display.getWidth(); height = display.getHeight(); Log.d("tag", "-1-------->>" + width); marginT = mContext.getResources().getDimension(R.dimen.public_46_dp); marginW = (float) ((width - pWidth) / 2.0); marginH = (float) ((height - pHeight) / 2.0); mWidth = width / 2; mHeight = height / 2; float g = height - marginT * 2; float k = g * 1.58f; float x = 10.0f; Log.d("ocr", k + "<<--k---高度----g--1---->>" + g); while (k > pWidth) { x--; k = k * (x / 10.0f); g = g * (x / 10.0f); } Log.d("ocr", k + "<<--k---高度----g--2---->>" + g); lineLeft = (float) (mWidth - k / 2.0); lineRight = (float) (mWidth + k / 2.0); lineTop = (float) (mHeight - g / 2.0); lineBottom = (float) (mHeight + g / 2.0); int nDisplayWidth = display.getWidth(); int nDisplayHeight = display.getHeight(); int nImageWidth = m_nImageWidth; int nImageHeight = m_nImageHeight; double nFitWidth; double nFitHeight; double nUseWidth = 0; double nUseHeight = 0; double dRealRegionWidth = 0; // double dRealRegionHeight = 0; if (nImageWidth * nDisplayHeight < nDisplayWidth * nImageHeight) { nFitHeight = nDisplayHeight; nFitWidth = (nImageWidth / (double) nImageHeight) * nFitHeight; } else { nFitWidth = nDisplayWidth; nFitHeight = nFitWidth * (nImageHeight / (double) nImageWidth); } if (nFitWidth / nFitHeight >= 4 / 3) { nUseHeight = nFitHeight; nUseWidth = 4 * nUseHeight / 3.0f; } else { nUseWidth = nFitWidth; nUseHeight = 3 * nUseWidth / 4.0f; } dRealRegionWidth = nUseWidth / 480.0f * 420.0f; // dRealRegionHeight = nUseHeight/360.0f*270.0f; // lineLeft = (int)((nDisplayWidth - dRealRegionWidth)/2.0f);//- (nDisplayWidth - nFitWidth)/2.0f); // lineRight = (int)( nDisplayWidth - lineLeft);//- (nDisplayWidth - nFitWidth) ); // lineTop = (int)(nDisplayHeight - dRealRegionHeight)/2.0f; // lineBottom = nDisplayHeight - lineTop; paint = new Paint(); dLineWidth = (int) dRealRegionWidth / 28; //30 dLineWidth = 4; paint.setStrokeWidth(dLineWidth); dLen = (int) dRealRegionWidth / 6; //160 float imgX = 10000; float imgY = 10000; switch (typeFront) { case 1: imgX = (mWidth - k / 2) + k * 0.56f; imgY = lineTop + g * 0.18f; break; case 2: imgX = lineLeft + k * 0.1f; imgY = lineTop + g * 0.1f; break; default: break; } float[] img = {imgY, imgX}; return img; } public void initFinder(int w, int h, int d) { } public Rect getFinder() { return new Rect((int) (lineLeft - marginW), (int) (lineTop - marginH), (int) (lineRight + marginW), (int) (lineBottom + marginH)); } public void setLineRect(int model) { lineModel = model; invalidate(); } @Override public void draw(Canvas canvas) { // TODO Auto-generated method stub super.draw(canvas); paint.setColor(Color.GREEN); canvas.drawLine(lineLeft - dLineWidth / 2, lineTop, lineLeft + dLen, lineTop, paint); canvas.drawLine(lineLeft, lineTop - dLineWidth / 2, lineLeft, lineTop + dLen, paint); canvas.drawLine(lineRight, lineTop - dLineWidth / 2, lineRight, lineTop + dLen, paint); canvas.drawLine(lineRight + dLineWidth / 2, lineTop, lineRight - dLen, lineTop, paint); canvas.drawLine(lineLeft, lineBottom + dLineWidth / 2, lineLeft, lineBottom - dLen, paint); canvas.drawLine(lineLeft - dLineWidth / 2, lineBottom, lineLeft + dLen, lineBottom, paint); canvas.drawLine(lineRight + dLineWidth / 2, lineBottom, lineRight - dLen, lineBottom, paint); canvas.drawLine(lineRight, lineBottom + dLineWidth / 2, lineRight, lineBottom - dLen, paint); switch (lineModel) { case 0: break; case 1://左边框线 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); break; case 2://右边框线 canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); break; case 3://左右 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); break; case 4://上边框 canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); break; case 5://左上 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); break; case 6://右上 canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); break; case 7://左右上 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); break; case 8://下边框 canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); break; case 9://左下 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); break; case 10://右下边框 canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); break; case 11://左右下 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); break; case 12://上下 canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); break; case 13://上下左 canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); break; case 14://上下右 canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); break; case 15://全 canvas.drawLine(lineLeft, lineTop, lineLeft, lineBottom, paint); canvas.drawLine(lineRight, lineTop, lineRight, lineBottom, paint); canvas.drawLine(lineLeft, lineTop, lineRight, lineTop, paint); canvas.drawLine(lineLeft, lineBottom, lineRight, lineBottom, paint); break; default: break; } paint.setColor(Color.BLACK); paint.setAlpha(100); // canvas.drawRect(lineLeft + dLineWidth / 2, lineTop + dLineWidth / 2, lineRight - dLineWidth / 2, lineBottom - dLineWidth / 2, paint); //画四周 canvas.drawRect(0, 0, width, lineTop - dLineWidth / 2, paint); canvas.drawRect(0, lineTop - dLineWidth / 2, lineLeft - dLineWidth / 2, lineBottom + dLineWidth / 2, paint); canvas.drawRect(0, lineBottom + dLineWidth / 2, width, height, paint); canvas.drawRect(lineRight + dLineWidth / 2, lineTop - dLineWidth / 2, width, lineBottom + dLineWidth / 2, paint); } }