2017-11-18 11 views
0

私は、リモートホストに接続し、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); 
    } 

} 

enter image description here enter image description here

EDIT 私はforループinitializeSurfaceに40に20から行くために変更した場合は()をdrawArcは同心円を描くように表示されたとき、I = 20及びI = 40が、他にはありません。以下のスクリーンショット。 I/20整数の除算として行われ、円弧を描画するときに0に評価された:問題が見つかっ

enter image description here

答えて

0

。それをi/10fに変更すると、その問題が修正されました。 20fがあまりにも多くの円を描きました。 lockCanvas()はいくつかのバッファ付きキャンバスのうち1つを返します。私はそれらのキャンバスのうちの1つだけにサークルを描画していました。その結果、後でdrawPoint()を呼び出すと、その円が描画されていないキャンバスに描画されていました。これを修正するには、lockCanvas()を3回呼び出して、それぞれにサークルを描画する必要がありました。これはあまり優雅な解決策ではありませんが、うまくいくようです。下記の修正されたコード:

public void initializeSurface() { 
     for (int j = 0; j <= 3; j++) { 
      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); 
      Paint font = new Paint(); 
      font.setTextSize(16); 
      font.setColor(Color.WHITE); 
      float width = ivWidth; 
      float height = ivHeight; 
      for (int i = 1; i <= 10; i++) 
       canvas.drawCircle(width/2, height/2, i/10f * height/2f, paint); 
      ivHolder.unlockCanvasAndPost(canvas); 
     } 
    } 

enter image description here

関連する問題