使用SurfaceView简单绘制正弦余弦:
1.首先在布局文件中创建SurfaceView,和两个按钮:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/sin"
android:text="正弦"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/cos"
android:text="余弦"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<SurfaceView
android:id="@+id/sv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
2.定义轴线:
//定义控件:
private Button but1;
private Button but2;
private SurfaceHolder holder;
private SurfaceView sv;
private Paint paint;
private Canvas canvas;
//轴线宽高:
final int HEIGHT=320;
final int WIDTH=320;
//实际的Y轴的位置:
final int X_OFFSET=5;
private int cx=X_OFFSET;
int centerY=HEIGHT/2;
//Timer异步方法:
Timer timer=new Timer();
TimerTask task=null;
3.SurfaseView获取到Holder,实现回调方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
//回调方法:
holder=sv.getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
paints();//开始绘制
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, intwidth,int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
timer.cancel();//方法停止
}
});
}
4.为按钮设置点击事件+Timer异步执行方法:
private void initView() {
but1 = (Button) findViewById(R.id.but1);
but2 = (Button) findViewById(R.id.but2);
but1.setOnClickListener(listener);
but2.setOnClickListener(listener);
sv = (SurfaceView) findViewById(R.id.sv);
}
View.OnClickListener listener=new View.OnClickListener() {
@Override
public void onClick(final View v) {
paints();
cx=X_OFFSET;
if(task!=null){
task.cancel();
}
task=new TimerTask() {
@Override
public void run() {
int cy=v.getId()==R.id.but1 ? centerY-(int)(100*Math.sin((cx-5)*2*Math.PI/150)): centerY-(int)(100*Math.cos(cx-5)*2*Math.PI/150);
Canvas canvas = holder.lockCanvas(new Rect(cx, cy - 2, cx + 2, cy + 2));
canvas.drawPoint(cx,cy,paint);
cx++;
if(cx> WIDTH){
task.cancel();
task=null;
}
holder.unlockCanvasAndPost(canvas);
}
};
timer.schedule(task,0,50);
}
};
5.设置画笔,定义坐标轴:
/**
* 设置paint画笔的方法:
*/
private void paints(){
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
paint=new Paint();
paint.setColor(Color.BLUE);
// paint.setStrokeWidth(1);
// paint.setStyle(Paint.Style.FILL);
//绘制坐标轴:
canvas.drawLine(X_OFFSET,centerY,WIDTH,centerY,paint);
canvas.drawLine(X_OFFSET,40,X_OFFSET,HEIGHT,paint);
holder.unlockCanvasAndPost(canvas);
holder.lockCanvas(new Rect(0,0,0,0));
holder.unlockCanvasAndPost(canvas);
}
6.效果如下: