您的位置:首页 > 其它

正弦余弦曲线的绘制动画

2014-12-27 17:27 615 查看
使用SurfaceView实现正弦余弦曲线的绘制动画!



主要代码如下:

package com.example.surfaceviewtest;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class ShowWave extends Activity {

SurfaceView surfaceView;
SurfaceHolder holder;
Paint paint;
final int HEIGHT = 320;
final int WIDTH = 320;
final int X_OFFSET = 5;
private int cx = X_OFFSET;
int CenterY = HEIGHT / 2;
Timer timer;
TimerTask task = null;

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.show);

holder = surfaceView.getHolder();
holder.addCallback(new Callback() {

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.i("csx", "surfaceDestroyed");
timer.cancel();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.i("csx", "surfaceCreated");
timer = new Timer();
drawBack(holder);

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.i("csx", "surfaceChanged");

}
});

paint = new Paint();
paint.setColor(Color.GREEN);
paint.setStrokeWidth(3);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();
drawWave(id);
return super.onOptionsItemSelected(item);
}

public void drawWave(final int item_id) {
if (task != null) {
task.cancel();
}
drawBack(holder);
cx = X_OFFSET;

task = new TimerTask() {

@Override
public void run() {
int cy = item_id == R.id.sin ? CenterY
- (int) (100 * Math.sin((cx - 5) * 2 * Math.PI / 150)) : CenterY
- (int) (100 * Math.cos((cx - 5) * 2 * Math.PI / 150));

try {
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);
} catch (NullPointerException e) {
return;
}

}
};

timer.schedule(task, 0, 30);

}

private void drawBack(SurfaceHolder holder) {
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
Paint p = new Paint();
p.setColor(Color.BLACK);
p.setStrokeWidth(3);
canvas.drawLine(X_OFFSET, CenterY, WIDTH, CenterY, p);
canvas.drawLine(X_OFFSET, 40, X_OFFSET, HEIGHT, p);
holder.unlockCanvasAndPost(canvas);
holder.lockCanvas(new Rect(0, 0, 0, 0));
holder.unlockCanvasAndPost(canvas);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: