2014-06-22 3 views
0

전 전화기 화면에 6 각형 그리드를 그립니다. Canvas을 사용하여 여섯 줄을 그려서 육각형을 그립니다. 너무 많은 줄이 그려져 앱이 응답하지 않습니다. 응용 프로그램은 이제 충돌하지 않는안드로이드 - 캔버스로 선 그리기

06-22 14:11:46.664: A/libc(5743): Fatal signal 6 (SIGABRT) at 0x0000166f (code=-6), thread 5743 (.nadeem.sensus4) 

있지만,이 그리드를 그리는 너무 많은 시간이 소요 :이어야가 내 넥서스 4 그렇지 않으면 응용 프로그램이 오류로 추락 작동하도록 내가 android:HardwareAccelerated=false을해야했다.

public DrawView(Context context, Hexagon hex) { 
    super(context); 
    this.context = context; 
    setLayerType(View.LAYER_TYPE_HARDWARE, null); 
    this.hex = hex; 

} 

@Override 
public void onDraw(Canvas canvas) { 

    double xOff = Math.cos(Math.PI/6) * hex.radius;//radius is 12 for now 
    double yOff = Math.sin(Math.PI/6) * hex.radius; // third of the hex 
                 // height 

    for (int i = 0; i < 60; ++i) { 
     for (int j = 0; j < 40; ++j) { 
      double xPos = j * xOff * 2; 

      if (i % 2 != 0) { // if the current line is not even 
       xPos += xOff; // extra offset of half the width on x axis 
      } 


      double yPos = i * yOff * 3; 
      createHexagon(xPos, // X pos for hexagon center on the scene 
        yPos, canvas); 
     } 

    } 

} 

public void createHexagon(double x, double y, Canvas canvas) { 

    paint.setColor(Color.BLACK); 
    paint.setStyle(Style.STROKE); 

    // paint.setStyle(Style.FILL); 
    for (int i = 0; i < 6; i++) { 
     double angle = 2 * Math.PI/6 * (i + 0.5); 


     double x_i = x + hex.radius * Math.cos(angle); 
     double y_i = y + hex.radius * Math.sin(angle); 
     if (i == 0) 
      wallpath.moveTo((float) x_i, (float) y_i); 
     else 
      wallpath.lineTo((float) x_i, (float) y_i); 
    } 
    canvas.drawPath(wallpath, paint); 
    canvas = null; 
} 

나는 성능이 그리드를 달성하기 위해 다른 대체 방법을 높일 수있는 방법이 있는지 물어보고 싶은 :이 그리드를 끌어 내있는 CustomView의 코드입니다.

+2

왜 육각형으로 반복 비트 맵을 그리지 않으시겠습니까? – pskink

+0

@pskink 육각형의 모든 꼭지점의 좌표를 원합니다. – Naddy

+0

그 점을 이해하지 못합니다, 죄송합니다 ... – pskink

답변

1

도면을 레이어로 처리하십시오. 처음으로 그릴 때 모든 육각형을 단일 비트 맵으로 그립니다. 그런 다음 앞으로의 모든 작업에서 비트 맵을 화면에 그립니다. 그런 다음 그 위에 그릴 필요가있는 것을 추가하십시오. 14000 회선 명령을 저장합니다.

다른 유용한 옵션은 드로잉을 위해 OpenGL로 이동하는 것입니다. 그러나 실제 속도로 하드웨어 가속없이 14K 라인을 그릴 수있는 방법은 없습니다.

0

직선을 그리고 DashPathEffect을 사용하면 배경색과 눈에 보이는 색을 바꿀 수 있습니다. 특정 선분이 해제 될 경우 희미한 선이 속하지 않는

enter image description here

이다. 패턴이 예측 가능하기 때문에 스트로크 효과도 있습니다. 주석에서 모든 정점의 좌표가 필요하다고 말했기 때문에 시작점을 계산하고 거기에서 정점 목록을 전파하는 별도의 루프를 실행하십시오.