원격 호스트에 연결하고 x, y 튜플 라인을 읽고이를 실시간으로 분산 형 그림으로 그려주는 앱을 작성하려고합니다. 데이터가 예상대로 표시되지만 데이터를 측정하기 위해 일부 표시를 표시하도록 코드를 수정했을 때 예상대로 작동하지 않습니다. 나는 20 개의 동심원이있는 검은 색 배경을 볼 것으로 예상했다. 데이터 롤은 동심원에 녹색 점으로 표시되어야합니다. 대신 원격 호스트가 다운되었을 때 initializeSurface()가 호출되고 외부 회색 원 (i = 20) 만 표시된다는 것을 알 수 있습니다. 그리고 원격 호스트가 초기화 될 때 initializeSurface()에 의해 drawPoint()가 빠르게 호출되고 회색 원이 표시되지 않고 녹색 점 만 표시됩니다. 코드는 아래에 설명되어 있으며 앞에서 설명한 2 개의 스크린 샷이 뒤 따른다.안드로이드 : 동심원 그리기
package com.balaguru.ggdiagram;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.Socket;
class ToastThread implements Runnable {
private String ivMessage;
private View ivView;
ToastThread(View pView, String pMessage) { ivView = pView; ivMessage = pMessage; }
public void run() {
Toast.makeText(ivView.getContext(), ivMessage, Toast.LENGTH_LONG).show();
}
}
class ConnectionThread extends Thread {
private GGView ivGGView;
ConnectionThread(GGView pGGView) {
ivGGView = pGGView;
}
public void run() {
try {
ivGGView.initializeSurface();
//Toast.makeText(MainActivity.context, "office-main", Toast.LENGTH_LONG).show();
Socket socket = new Socket("192.168.1.197", 10000);
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = input.readLine();
while (line != null) {
if (line.equals("not connected")) {
ivGGView.drawPoint(0, 0, Color.GREEN);
} else {
String[] gg = line.split(",");
float x = Float.parseFloat(gg[0]);
float y = Float.parseFloat(gg[1]);
ivGGView.drawPoint(x, y, Color.GREEN);
}
line = input.readLine();
}
} catch (Throwable e) {
StringWriter error = new StringWriter();
e.printStackTrace(new PrintWriter(error));
ToastThread toast = new ToastThread(ivGGView, error.toString());
Activity activity = (Activity) ivGGView.getContext();
activity.runOnUiThread(toast);
}
}
}
class GGView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder ivHolder;
public Context ivContext;
private int ivWidth;
private int ivHeight;
public GGView(Context context){
super(context);
ivContext = context;
ivHolder = getHolder();
ivHolder.addCallback(this);
}
public void surfaceDestroyed(SurfaceHolder pHolder) {}
public void surfaceCreated(SurfaceHolder pHolder) {
ConnectionThread thread = new ConnectionThread(this);
thread.start();
}
public void surfaceChanged(SurfaceHolder pHolder, int pFormat, int pWidth, int pHeight) {}
public void initializeSurface() {
Canvas canvas = ivHolder.lockCanvas();
ivWidth = canvas.getWidth();
ivHeight = canvas.getHeight();
canvas.drawColor(Color.BLACK);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GRAY);
paint.setStrokeWidth(4);
paint.setStyle(Paint.Style.STROKE);
for (int i = 1; i <= 20; i++) {
canvas.drawArc(ivWidth/2 - i/20*ivHeight/2,
ivHeight/2 - i/20*ivHeight/2,
ivWidth/2 + i/20*ivHeight/2,
ivHeight/2 + i/20*ivHeight/2,
0, 360, false, paint);
}
ivHolder.unlockCanvasAndPost(canvas);
}
public void drawPoint(float pX, float pY, int pColor) {
float x = pX/20 * ivHeight/2 + ivWidth/2;
float y = pY/20 * ivHeight/2 + ivHeight/2;
Canvas canvas = ivHolder.lockCanvas(
new Rect((int) x-4, (int)y-4, (int) x+4, (int)y+4));
Paint paint = new Paint();
paint.setColor(pColor);
paint.setStrokeWidth(4);
canvas.drawPoint(x, y, paint);
ivHolder.unlockCanvasAndPost(canvas);
}
}
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
GGView ggView = new GGView(this);
setContentView(ggView);
}
}
편집 나는 for 루프 initializeSurface 40에 20에서 이동 변경하는 경우() 다음 drawArc이 동심원을 그리는 나타날 때 I = 20 전 = 40 만 기타 없음. 아래 스크린 샷.