代码例子下载:http://pan.baidu.com/s/1nCsP8
代码
HLWaveFormFigure.java
package com.huluo.testwaveformfigure;
import java.util.ArrayList;
import java.util.Iterator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class HLWaveFormFigure extends View{
private Paint m_Paint = null;
//private Point m_WaveformFigure[] = new Point[1000];
private ArrayList<PointF> m_WaveformFigure = new ArrayList<PointF>();
private int kMaxKeyPoints = 1000;
private int kHillSegmentWidth = 10;
PointF pt0;
PointF pt1;
public HLWaveFormFigure(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
pt0 = new PointF();
pt1 = new PointF();
generatePoint();
m_Paint = new Paint();
m_Paint.setColor(Color.RED);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawColor(Color.RED);
//canvas.save();
for (int i = 1; i < kMaxKeyPoints; i++) {
PointF p0 = (PointF)m_WaveformFigure.get(i-1);
PointF p1 = (PointF)m_WaveformFigure.get(i);
double hSegments = Math.floor((double)(p1.x - p0.x) / kHillSegmentWidth);//Math.floor((double)((p1.x - p0.x) / kHillSegmentWidth));
float dx = (p1.x - p0.x) / (float)hSegments;
float da = (float)(Math.PI / hSegments);
float ymid = (p0.y + p1.y) / 2;
float ampl = (p0.y - p1.y) / 2;
pt0.set(p0.x, p0.y);
for (int j = 0; j < hSegments + 1; ++j) {
pt1.set(p0.x + j * dx, (float)(ymid + ampl * Math.cos(da * j)));
canvas.drawLine(pt0.x, pt0.y, pt1.x, pt1.y, m_Paint);
pt0.set(pt1.x, pt1.y);
}
}
//
canvas.restore();
}
private void generatePoint()
{
float minDX = 50;
float minDY = 30;
float rangeDX = 10;
float rangeDY = 40;
float x = -minDX;
float y = 197.5f;
float dy= 0f,ny=0f;
float sign = 1;
float paddingTop = 0;
float paddingBottom = 0;
for (int i = 0; i < kMaxKeyPoints; i++) {
m_WaveformFigure.add(new PointF(x, y));
if (i == 0) {
x = 0;
y = 97.5f / 2;
}
else {
x += Math.random() % rangeDX + minDX ;
while (true) {
dy = (float)Math.random() % rangeDY + minDY;
ny = y + dy * sign;
if (ny < 480f- paddingTop && ny > paddingBottom) {
break;
}
}
y = ny;
}
sign *= -1;
}
}
}