2017-11-18 31 views
0

원격 호스트에 연결하고 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); 
    } 

} 

enter image description here enter image description here

편집 나는 for 루프 initializeSurface 40에 20에서 이동 변경하는 경우() 다음 drawArc이 동심원을 그리는 나타날 때 I = 20 전 = 40 만 기타 없음. 아래 스크린 샷.

enter image description here

답변

0

문제 발견 : 입/20의 정수 분할로 수행하고 호를 그릴 때 0으로 평가되고 있었다. 그것을 i/10f로 바꾸면 그 문제가 해결되었습니다. 20f가 너무 많은 원을 그렸습니다. lockCanvas()는 몇 개의 버퍼가있는 캔버스 중 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