package ua.stu.view.scpview; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; /** * Класс для прорисовки подложки(милеметровки). * Создается с помощью xml. * * Перерисовывается при замене цветовой схемы с помощью вызова метода invalidate() * * @author ivan * */ public class DrawGraphPaper extends View { public Paint mPaint = new Paint(); private static final float InToSm = (float) 2.54; int Width = 0; int Height = 0; float Xcm, Ycm; private float[] mPts; Bitmap BackGround; int MetricsChanged = -1; int MaxSize = 1024; Canvas BkGr; private int colorLinesAndDot=Color.RED; public DrawGraphPaper(Context context) { super(context); GetMetrics(); BackGround = Bitmap.createBitmap(MaxSize, MaxSize, Bitmap.Config.ARGB_8888); BkGr = new Canvas(BackGround); DrawBackGround(BkGr, MaxSize, MaxSize); } public DrawGraphPaper(Context context, AttributeSet attribSet) { super(context, attribSet); GetMetrics(); BackGround = Bitmap.createBitmap(MaxSize, MaxSize, Bitmap.Config.ARGB_8888); BkGr = new Canvas(BackGround); DrawBackGround(BkGr, MaxSize, MaxSize); } private void MakeLines(float Coef, int W, int H) { float YBcm = (float) (Ycm * Coef); float XBcm = (float) (Xcm * Coef); int NumXLines = (int) (H / YBcm) + 1; int NumYLines = (int) (W / XBcm) + 1; mPts = new float[(NumXLines + NumYLines) * 4]; for (int i = 0; i < NumXLines; i++) { mPts[i * 4] = 0; mPts[i * 4 + 1] = mPts[i * 4 + 3] = i * YBcm; mPts[i * 4 + 2] = Width; } for (int i = NumXLines; i < (NumXLines + NumYLines); i++) { mPts[i * 4 + 1] = 0; mPts[i * 4] = mPts[i * 4 + 2] = (i - NumXLines) * XBcm; mPts[i * 4 + 3] = Height; } } private int MakeDots(float Coef, int W, int H) { float YBcm = (float) (Ycm * Coef); float XBcm = (float) (Xcm * Coef); int Rows = (int) (H / YBcm) + 1; int Columns = (int) (W / XBcm) + 1; mPts = new float[((Rows - Rows / 5) * (Columns - Columns / 5)) * 2]; int i = 0; for (int R = 0; R < Rows; R++) { if (R % 5 > 0) for (int C = 0; C < Columns; C++) { if (C % 5 > 0) { mPts[i++] = C * XBcm; mPts[i++] = R * YBcm; } } } return i; } private void DrawBackGround(Canvas canvas, int W, int H) { canvas.drawColor(Color.WHITE); Paint paint = mPaint; paint.setColor(getColorLinesAndDot()); paint.setPathEffect(new DashPathEffect(new float[] { 8, 5 }, 0)); paint.setStrokeWidth(0); MakeLines((float) 0.5, W, H); canvas.drawLines(mPts, paint); paint.setPathEffect(null); paint.setStrokeWidth(0); MakeLines((float) 2.5, W, H); canvas.drawLines(mPts, paint); MakeDots((float) 0.1, W, H); paint.setStrokeWidth(2); canvas.drawPoints(mPts, paint); } private void GetMetrics() { DisplayMetrics metrics = new DisplayMetrics(); ((Activity) getContext()).getWindowManager().getDefaultDisplay() .getMetrics(metrics); Height = metrics.heightPixels; Width = metrics.widthPixels; Xcm = metrics.xdpi / InToSm; Ycm = metrics.ydpi / InToSm; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); GetMetrics(); DrawBackGround(canvas, Width, Height); } public int getColorLinesAndDot() { return colorLinesAndDot; } /** * Установить цвет милиметровки после установки выполнить invalidate() * @param colorLinesAndDot цвет миллиметровки */ public void setColorLinesAndDot(int colorLinesAndDot) { this.colorLinesAndDot = colorLinesAndDot; } }