package com.zzw.TestSurfaceView; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder;
import android.view.SurfaceView; /**
* Created by zzw on 2016/6/28.
* 描述:
*/
public class SinSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable { private int mWidth;
private int mHeight; private double angle = 0; private SurfaceHolder mHolder;
/**
* 与SurfaceHolder绑定的Canvas
*/
private Canvas mCanvas;
/**
* 用于绘制的线程
*/
private Thread t;
/**
* 线程的控制开关
*/
private boolean isRunning; public SinSurfaceView(Context context) {
this(context, null);
} public SinSurfaceView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public SinSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); DisplayMetrics dm = getResources().getDisplayMetrics();
mWidth = dm.widthPixels;
mHeight = dm.heightPixels; mHolder = getHolder();
mHolder.addCallback(this); // setZOrderOnTop(true);// 设置画布 背景透明
// mHolder.setFormat(PixelFormat.TRANSLUCENT); //设置可获得焦点
setFocusable(true);
setFocusableInTouchMode(true);
//设置常亮
this.setKeepScreenOn(true); } @Override
public void surfaceCreated(SurfaceHolder holder) {
isRunning = true;
t = new Thread(this);
t.start();
} @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 通知关闭线程
isRunning = false;
} @Override
public void run() { // 不断的进行draw
while (isRunning) {
draw();
}
} private void drawCoordinates() {
Path mPath = new Path();
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);//设置画笔类型
paint.setAntiAlias(true);//抗锯齿
paint.setStyle(Paint.Style.STROKE);//设置为空心 mCanvas.translate(20, mHeight / 2);// 将画布坐标原点移动到中心位置
//绘制坐标原点
paint.setColor(Color.RED);//设置画笔颜色
paint.setStrokeWidth(10);//为了看得清楚,设置了较大的画笔宽度
//绘制坐标轴4个断点
mCanvas.drawPoints(new float[]{0, 0,
mWidth * 0.9f, 0
, mWidth * 0.9f * 0.75f, 0
, mWidth * 0.9f * 0.5f, 0
, mWidth * 0.9f * 0.25f, 0}, paint); paint.setStrokeWidth(1);//恢复画笔默认宽度 mCanvas.drawLine(0, 0, mWidth * 0.9f, 0, paint);
mCanvas.drawLine(0, -mHeight / 2 * 0.9f, 0, mHeight / 2 * 0.9f, paint); mPath.moveTo(mWidth * 0.9f * 0.95f, -mWidth * 0.9f * 0.05f);
mPath.lineTo(mWidth * 0.9f, 0);
mPath.lineTo(mWidth * 0.9f * 0.95f, mWidth * 0.9f * 0.05f);
//绘制Path
mCanvas.drawPath(mPath, paint);
} private void drawSin() {
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);//设置画笔类型
paint.setAntiAlias(true);//抗锯齿
paint.setStyle(Paint.Style.STROKE);//设置为空心
paint.setStrokeWidth(5);
//绘制坐标原点
paint.setColor(Color.RED);//设置画笔颜色 double x = mWidth * 0.9f * (angle / 360);
// double y = Math.sin((Math.PI / 180) * angle) * mWidth * 0.9f * 0.2;// π/180乘于角度为弧度
// mCanvas.drawPoint((float) x, -(float) y, paint);
for (int i = 1; i < 6; i++) {
double y = Math.sin((Math.PI / 180) * angle) * mWidth * 0.9f * 0.15 * i;// π/180乘于角度为弧度
mCanvas.drawPoint((float) x, -(float) y, paint);
} angle += 1;
if (angle > 360) {
isRunning = false;
}
} private void draw() {
try {
Thread.sleep(1);
// 获得canvas
mCanvas = mHolder.lockCanvas();
if (mCanvas != null) {
drawCoordinates();
drawSin();
}
} catch (Exception e) {
} finally {
if (mCanvas != null)
mHolder.unlockCanvasAndPost(mCanvas);
}
}
}