解决方案 »

  1.   


    但是android里面画法的话就是贝塞尔,java如何利用曲线拟合来话?
      

  2.   

    建议你用SurfaceView,利用SurfaceViewHolder来绘制
      

  3.   

    public class ShowWave extends Activity
    {
    private SurfaceHolder holder;
    private Paint paint;
    final int HEIGHT = 320;
    final int WIDTH = 320;
    final int X_OFFSET = 5;
    private int cx = X_OFFSET;
    //实际的Y轴的位置
    int centerY = HEIGHT / 2;
    Timer timer = new Timer();
    TimerTask task = null;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final SurfaceView surface = (SurfaceView) findViewById(R.id.show);
    // 初始化SurfaceHolder对象
    holder = surface.getHolder();
    paint = new Paint();
    paint.setColor(Color.GREEN);
    paint.setStrokeWidth(3);
    Button sin = (Button)findViewById(R.id.sin);
    Button cos = (Button)findViewById(R.id.cos);

    OnClickListener listener = (new OnClickListener()
    {
    @Override
    public void onClick(final View source)
    {
    drawBack(holder);
    cx = X_OFFSET;
    if(task != null)
    {
    task.cancel();
    }
    task = new TimerTask()
    {
    public void run()
    {
    int cy = source.getId() == 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));
    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 , 30);
    }
    });
    sin.setOnClickListener(listener);
    cos.setOnClickListener(listener);
    holder.addCallback(new Callback()
    {
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format,
    int width, int height)
    {
    drawBack(holder);
    } @Override
    public void surfaceCreated(final SurfaceHolder myHolder)
    {
    } @Override
    public void surfaceDestroyed(SurfaceHolder holder)
    {
    timer.cancel();
    }
    });
    }
    private void drawBack(SurfaceHolder holder)
    {
    Canvas canvas = holder.lockCanvas();
    //绘制白色背景
    canvas.drawColor(Color.WHITE);
    Paint p = new Paint();
    // p.setColor(Color.BLACK);
    // p.setStrokeWidth(2);
    // //绘制坐标轴
    // 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);
    }
    }布局代码:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    >
    <Button android:id="@+id/sin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/sin"
    />
    <Button android:id="@+id/cos"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cos"
    />
    </LinearLayout>
    <SurfaceView android:id="@+id/show"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    />
    </LinearLayout>
      

  4.   

    我知道用SurfaceView来画,但是我绘制是不是正弦和余弦,绘制的是随机点弧度,比如先降一下,然后又上升很高的高度,在下降之类,不是很规律的,是根据点出现的位置来决定弧度,所以这个弧度也是随机性。正弦余弦我也知道,但是这个是靠角度来绘制有规律的
      

  5.   

    直接用canvas画,有个Path的类可以生成贝塞尔曲线,下面是部分代码
    mBitmap = Bitmap.createBitmap(screenWidth, screenHeight,
    Bitmap.Config.ARGB_8888);
    // 保存一次一次绘制出来的图形
    mCanvas = new Canvas(mBitmap);
    mPaint = new Paint();
    mPath = new Path();
    mPath.moveTo(x1, y1);
    //从x1,y1到x2,y2画一条贝塞尔曲线
    mPath.quadTo(x1, y1, (x2 + x1) / 2, (y2 + y1) / 2);
    mCanvas.drawPath(mPath, mPaint);
    最后在onDraw里面调用
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
    只能说这么多了