2011-04-12 4 views
0

안드로이드에 캔버스로 그래프를 그린다. 왼쪽이나 오른쪽으로 이동하고 싶다. 나는 그것을 스크롤하고 싶지 않다, 나는 단지 당신이 그래프가 활발하게 움직이는 것을 볼 수있는 한 페이지에서 그것을 이동하고 싶다. 어떤 시체라도 나를 도와 주시면 감사하겠습니다.안드로이드의 캔버스 이동 그래프

+0

"는 그래프가 활발 이동하고 볼 수있는 하나의 페이지를 이동"그 문은 몇 가지 작업이 필요합니다, 당신이 말하려고하는지 모르겠어요. 일부 소스 코드도 도움이 될 수 있습니다. – Ralphleon

답변

0

이 질문에 대한 답변을 찾고 있습니다. 솔루션이 있지만 속도가 느려지고 많은 CPU 시간이 사용됩니다. 200 픽셀 너비의 두 그래프 그리기 및 값을 배열에 저장되어 있습니다. 난 그냥 배열의 값을 이동하고 경로로 이동합니다. 캔버스가 왼쪽으로 1 픽셀 씩 이동하고 200 번째 열이 새 값으로 그려지는 해결책을 얻는 것이 좋을 것입니다. 두 경로 모두 비어있는 경우 경로를 그리려면 약 2ms (Droid Incredible)가 필요합니다. 2 개의 경로가 채워지면 40ms 이상 걸릴 수 있습니다. 이것은 여전히 ​​25fps를 줄 것이지만 동시에 다른 스레드를 실행하고 CPU 시간을 낭비하고 싶지는 않습니다. 여기에 소스가 있습니다.

public class OSCI extends View

{ Integer[] codebuffer = new Integer[200]; Integer[] codebuffer1 = new Integer[200]; private static final String TAG = "MyActivity"; long start; int code=0;

// private static final String TAG = "MyActivity"; public OSCI(Context context) { super(context); Arrays.fill(codebuffer, 1); Arrays.fill(codebuffer1, 1); } public OSCI(Context context, AttributeSet attrs) { super(context, attrs);; Arrays.fill(codebuffer, 1); Arrays.fill(codebuffer1, 1); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2); paint.setColor(Color.YELLOW); Path path = new Path(); path.moveTo(0, 70); Paint paint1 = new Paint(Paint.ANTI_ALIAS_FLAG); paint1.setStyle(Paint.Style.STROKE); paint1.setStrokeWidth(2); paint1.setColor(Color.GREEN); Path path1 = new Path(); path1.moveTo(0, 70); int max = Collections.max(Arrays.asList(codebuffer)); if(max==0)max=1; for (int a = 0; a < codebuffer.length; a++) { if (codebuffer[a] < 0)code=0; code = 70 * codebuffer[a]/max; path.lineTo(a * 2 + 2, 70 - code); path1.lineTo(a * 2+ 2, 70 - (codebuffer1[a])); } start=(SystemClock.elapsedRealtime()); canvas.drawPath(path1, paint); canvas.drawPath(path, paint1); Log.v(TAG, " "+(SystemClock.elapsedRealtime()-start)); } public void newValue(int value, int valuew) { System.arraycopy(codebuffer, 1, codebuffer, 0, 199); codebuffer[199] = value; System.arraycopy(codebuffer1, 1, codebuffer1, 0, 199); codebuffer1[199] = valuew; invalidate(); }

}

+0

해결책 주셔서 대단히 감사합니다. newValue (int value, int valuew) 메소드를 어디에 호출하는지 알려 주실 수 있습니까? – ScorpionGroup

+0

좋은 답변 주셔서 감사합니다.하지만 두 가지 질문이 있습니다. 처음으로 코드에서 newValue (int value, int valuew) 메서드를 호출 할 때. 둘째, 교대 이동을 보려면 스레드 또는 시간을 사용하고 어떻게 사용하는지. – ScorpionGroup