私は、リモートホストに接続し、x、yタプルの行を読み取り、それらをリアルタイムで散布図に描画するアプリケーションを作成しようとしています。データは期待どおりに表示されていますが、データを測定するためのマーキングを試して表示するようにコードを修正したとき、期待どおりに動作していません。私は、20の同心円の灰色の円で黒い背景を見ることを期待していました。データロールは、同心円上に緑色の点として表示する必要があります。代わりに、リモートホストがダウンしたときに表示されるのは、initializeSurface()が呼び出され、外側の灰色の円(i = 20)だけが表示されることです。そして、リモートホストが起動しているときに、initializeSurface()がすぐにdrawPoint()によって呼び出され、灰色の円は表示されず、緑色の点のみが表示されます。コードは以下のとおりで、前に説明した2つのスクリーンショットが続きます。Android:描画同心円
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);
}
}
EDIT 私はforループinitializeSurfaceに40に20から行くために変更した場合は()をdrawArcは同心円を描くように表示されたとき、I = 20及びI = 40が、他にはありません。以下のスクリーンショット。 I/20整数の除算として行われ、円弧を描画するときに0に評価された:問題が見つかっ