android中如何根据已知的多点画出弧度曲线 androiduploadondraw 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 但是android里面画法的话就是贝塞尔,java如何利用曲线拟合来话? 建议你用SurfaceView,利用SurfaceViewHolder来绘制 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> 我知道用SurfaceView来画,但是我绘制是不是正弦和余弦,绘制的是随机点弧度,比如先降一下,然后又上升很高的高度,在下降之类,不是很规律的,是根据点出现的位置来决定弧度,所以这个弧度也是随机性。正弦余弦我也知道,但是这个是靠角度来绘制有规律的 直接用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);只能说这么多了 如何使用WebView登陆需要Windows AD帐号验证的网站 EditText做点击事件,结果出错 程序卸载时桌面快捷方式的删除 这个Android的示例程序运行出错,高手进来看一下。 下载了一个相册滑动的效果,想把它引入到自己的项目运行,要怎么做?? 新手求教 android activity模板 android传输参数,在webservice中是空值,求处理 附近搜索 JNI 高手进:jni下调用sigaction注册的handle函数会不会被JVM 释放 这是什么原因呀? 这种titlebar怎么写? 关于android手机内存路径与SD卡路径的问题
但是android里面画法的话就是贝塞尔,java如何利用曲线拟合来话?
{
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>
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);
只能说这么多了