package com.example.focus;
import java.util.Random;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class DrawDiagram extends SurfaceView implements SurfaceHolder.Callback {
public static final int MAX_HEIGHT = 255;
private DrawThread drawThread;
private DrawDiagram diagram;
private SurfaceHolder surfaceHolder;
private float yBottom;
private float deltaX;
private float current;
private Paint paint;
private int[] mas;
private int value;
public DrawDiagram(Context context) {
super(context);
getHolder().addCallback(this);
diagram = this;
}
public DrawDiagram(Context context, AttributeSet attrs) {
super(context, attrs);
getHolder().addCallback(this);
diagram = this;
}
public DrawDiagram(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
getHolder().addCallback(this);
diagram = this;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
paint = new Paint();
mas = new int[diagram.getWidth()];
drawThread = new DrawThread(getHolder(), getResources());
// drawThread.setRunning(true);
drawThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
// drawThread.setRunning(false);
while (retry) {
try {
drawThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
class DrawThread extends Thread {
// private final long time = 200;
//
// private boolean runFlag = false;
// private SurfaceHolder surfaceHolder;
//
//
// private float yBottom;
// private float deltaX;
//
// private float current;
//
// private Paint paint;
//
// private Random r;
// private int[] mas;
public DrawThread(SurfaceHolder surfaceHolder, Resources resources) {
diagram.surfaceHolder = surfaceHolder;
init();
}
private void init() {
// paint = new Paint();
//
// r = new Random();
//
// mas = new int[diagram.getWidth()];
}
// public void setRunning(boolean run) {
// runFlag = run;
// }
@Override
public void run() {
Random rand = new Random();
Canvas canvas;
// while (runFlag) {
canvas = null;
try {
// Thread.sleep(time);
if (mas.length != diagram.getWidth()) {
changeArray();
}
addElement();
yBottom = diagram.getY() + diagram.getHeight();
deltaX = diagram.getX();
canvas = surfaceHolder.lockCanvas(null);
for (int i = 0; i < mas.length; i++) {
// int value1 = rand.nextInt(120);
// current = yBottom - value1;// * diagram.getHeight() /
// yBottom;
current = yBottom - mas[i] * diagram.getHeight() / MAX_HEIGHT;
// paint.setShader(new LinearGradient(deltaX, yBottom,
// deltaX, current, Color.CYAN, Color.BLACK,
// TileMode.CLAMP));
paint.setShader(new LinearGradient(deltaX, yBottom, deltaX,
current, Color.BLACK, Color.BLACK, TileMode.CLAMP));
synchronized (surfaceHolder) {
// canvas.drawLine(deltaX, yBottom, deltaX, current,
// paint);
canvas.drawLine(deltaX, yBottom, deltaX, 0, paint);
}
paint.setShader(new LinearGradient(deltaX, yBottom, deltaX,
current, Color.CYAN, Color.BLACK, TileMode.CLAMP));
synchronized (surfaceHolder) {
// canvas.drawLine(deltaX, yBottom, deltaX, current,
// paint);
canvas.drawLine(deltaX, yBottom, deltaX, current, paint);
}
deltaX++;
}
// } catch (InterruptedException e) {
// e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
// }
}
private void addElement() {
for (int i = mas.length - 1; i > 0; i--) {
mas[i] = mas[i - 1];
}
// mas [0] = r.nextInt(201);
mas[0] = value;
}
private void changeArray() {
int[] temp = new int[diagram.getWidth()];
int length = 0;
if (temp.length < mas.length) {
length = temp.length;
} else {
length = mas.length;
}
for (int i = 0; i < length; i++) {
temp[i] = mas[i];
}
mas = temp;
}
}
public void drawLine(short value) {
diagram.value = value;
drawThread.run();
}
}