在this示例中,预定义的函数被绘制到交互式图表中。这是示例中使用的代码:
/**
* The simple math function Y = fun(X) to draw on the chart.
* @param x The X value
* @return The Y value
*/
protected static float fun(float x) {
return (float) Math.pow(x, 3) - x / 4;
}
....
private void drawDataSeriesUnclipped(Canvas canvas) {
mSeriesLinesBuffer[0] = mContentRect.left;
mSeriesLinesBuffer[1] = getDrawY(fun(mCurrentViewport.left));
mSeriesLinesBuffer[2] = mSeriesLinesBuffer[0];
mSeriesLinesBuffer[3] = mSeriesLinesBuffer[1];
float x;
for (int i = 1; i <= DRAW_STEPS; i++) {
mSeriesLinesBuffer[i * 4 + 0] = mSeriesLinesBuffer[(i - 1) * 4 + 2];
mSeriesLinesBuffer[i * 4 + 1] = mSeriesLinesBuffer[(i - 1) * 4 + 3];
x = (mCurrentViewport.left + (mCurrentViewport.width() / DRAW_STEPS * i));
mSeriesLinesBuffer[i * 4 + 2] = getDrawX(x);
mSeriesLinesBuffer[i * 4 + 3] = getDrawY(fun(x));
}
canvas.drawLines(mSeriesLinesBuffer, mDataPaint);
}
我现在想要修改此代码,这样就不会绘制预定义的函数,而是用户用手指在屏幕上绘制的路径。 (我知道我可以轻松地按照用户的手指绘制路径,之前我已经尝试过了。虽然路径被正确绘制,但它的行为并不像我想要的那样,所以我必须尝试这种方法。)
要绘制此路径,我尝试保存用户触摸的点:
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
firstTouchX = event.getX();
firstTouchY = event.getY();
case MotionEvent.ACTION_MOVE:
lastTouchX = event.getX();
lastTouchY = event.getY();
case MotionEvent.ACTION_UP:
lastTouchX = event.getX();
lastTouchY = event.getY();
}
Point lastTouch = new Point();
lastTouch.set((int)lastTouchX, (int)lastTouchY);
pointsList.add(lastTouch);
然后我更改了fun
,如果传递了x值,则返回正确的y值:
protected static float fun(float x) {
float currX = 0;
float currY = 0;
for (int i = 0; i < pointsList.size(); i++) {
Point curr = pointsList.get(i);
currX = curr.x;
currY = curr.y;
}
if (currX == x) {
return currY;
}
我知道这是一个非常漫长而复杂的问题,但我真的不知道还能做什么,我已经尝试了一切,但无法找到解决方案,所以如果有人可以,我会非常感激花点时间看看我的问题。
总结一下我的问题: - 我想用手指触摸后画一条线 - 我需要在没有路径的情况下进行,但使用上述方法