2012-04-06 6 views
-1

세미 정적 (거의 변경되지 않는) 비트 맵을 만드는보기가 아닌 아이콘을 허용하는 사용자 지정보기 (표시)를 만들었습니다. 아이디어는 여러 아이콘을 화면에 표시하여 캔버스에 인쇄하는 것입니다. 내 문제는 디스플레이 실제로 캔버스에 아이콘 비트 맵을 그릴 수 없다는 것입니다.작은 비트 맵을 더 큰 캔버스로 그릴 수없는 이유는 무엇입니까?

아래 코드는 내가 가지고있는 것의 실제 예입니다. (내 말은 작업이 제대로 실행함으로써, 내가 원하는 인쇄하지 않는 것이 그것에)

public class AndroidTestoActivity extends Activity { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FrameLayout fl = new FrameLayout(this); 
     Display tv = new Display(this); 
     tv.setLayoutParams(new LayoutParams(200, 200)); 
     fl.addView(tv); 
     setContentView(fl); 
    } 

    public class Display extends View { 
     Paint vPaint = new Paint(); 
     Icon item = new Icon(); 

     public Display(Context context) { 
      super(context); 
      vPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
      vPaint.setColor(0x0ff000000); 
      setBackgroundColor(0xffffffff); 
     } 

     @Override public void onDraw(Canvas canvas) { 
      canvas.scale(200, 200); 
      item.onDraw(canvas); 
      canvas.drawLine(0.0f, 0.0f, 1.0f, 1.0f, vPaint); 
     } 
    } 

    public class Icon { 
     Bitmap myImage; 
     Paint mPaint = new Paint(); 

     public Icon() { 
      myImage = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888); 
      mPaint.setStyle(Style.FILL); 
      mPaint.setColor(0xffff0000); 
      Canvas c = new Canvas(myImage); 
      c.scale(50, 50); 
      c.drawCircle(0.5f, 0.5f, 0.5f, mPaint); 
     } 

     public void onDraw(Canvas canvas) { 
      canvas.drawBitmap(myImage, 0, 0, null); 
     } 
    } 
} 

이 코드에서 선 밖으로 인쇄해야 오른쪽을 낮추고 0에서 50 픽셀 직경의 원을 그릴 상단을 왼쪽, 0에서 50, 50까지. 내가 얻는 것은 모두 선이다. 그러나 비트 맵을 파일로 인쇄하면 파일은 정확히 무엇을 출력해야합니다.

어떤 일이 일어나고 있는지 실마리가 있습니까?

편집
내 질문에 명확히하기 위해, 나는 DisplayView보다 훨씬 더 작은 비트 맵을 만드는 오전. 내가 비트 맵을 DisplayView에 그리려고 할 때 비트 맵은 그리지 않았고 적절하게 크기가 조정되지 않았습니다. 캔버스가 Bitmap을 제대로 그리지 않는 이유는 무엇입니까? 으로 모니터의 된 onDraw 방법에

UPDATE
, 나는 canvas.scale(200, 200); 이전에 선 items.onDraw(canvas);을 움직였다. 이제 테스트 서클이 올바르게 그려집니다. 그 단순한 변화가 원을 그리는 방식을 완전히 무시하는 것은 무엇입니까?

+0

'scale()','translate()','skew()'및 [언급] (http://developer.android.com/reference/android/graphics/Canvas.html) "현재 행렬"은 [변형 행렬]에서 작동합니다. (http://en.wikipedia.org/wiki/Transformation_matrix) - 원하는 것을 얻기 위해 순차적으로 수행하는 것처럼 간단하지 않습니다.). 그러나 나는이 특별한 경우에 그 선을 움직이는 것에 대한 대답을 지금 당장 기억하지 못합니다. – Izkata

답변

1

을하는 데 사용됩니다 밖으로, 나는 @ MartinAsenov는 대부분 정확했다. 내가해야 할 일은 결국 캐쉬 된 모든 비트 맵을 에 그려 넣기 전에 (또는 저장하고 복원 한 후에) 캔버스를 스케일하고 정상적으로 그립니다. 캔버스의 크기를 조절할 때는 아직 필요하지 않습니다 (문제가없는 드로잉을하기 전에 너비와 높이의 다른 모든 위젯 크기가 필요함).

여기에 최종 작업 테스트 활동이 나와 있습니다.

public class AndroidTestoActivity extends Activity { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FrameLayout fl = new FrameLayout(this); 
     Display tv = new Display(this); 
     tv.setLayoutParams(new LayoutParams(200, 200)); 
     fl.addView(tv); 
     setContentView(fl); 
    } 

    public class Display extends View { 
     Paint vPaint = new Paint(); 
     Icon item = new Icon(); 

     public Display(Context context) { 
      super(context); 
      vPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
      vPaint.setColor(0x0ff000000); 
      setBackgroundColor(0xffffffff); 
     } 

     @Override public void onDraw(Canvas canvas) { 
      item.onDraw(canvas); 
      canvas.save(Canvas.MATRIX_SAVE_FLAG); 
      canvas.scale(getWidth(), getHeight()); 

      canvas.drawLine(0.0f, 0.0f, 1.0f, 1.0f, vPaint); 
      canvas.restore(); 
     } 
    } 

    public class Icon { 
     Bitmap myImage; 
     Paint mPaint = new Paint(); 

     public Icon() { 
      myImage = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888); 
      mPaint.setStyle(Style.FILL); 
      mPaint.setColor(0xffff0000); 
      Canvas c = new Canvas(myImage); 
      c.scale(50, 50); 
      c.drawCircle(0.5f, 0.5f, 0.5f, mPaint); 
     } 

     public void onDraw(Canvas canvas) { 
      canvas.drawBitmap(myImage, 50, 50, null); 
     } 
    } 
} 
+0

아래 투표 이유가 무엇입니까? 나는 상관하지 않지만, 당신이 나에게 말하지 않으면 내가 잘못한 것을 배울 수 없다. – AedonEtLIRA

0

코드를 통해보고 나는 큰 문제는 0f..1f 할 좌표를 생각하지만, 사실이라고 생각 0f..width/0f..height - 플로트는이 돌 때 서브 픽셀

+0

어디까지 구니? DisplayView에서 0-1.0f를 사용하여 선을 잘 그릴 수 있으므로 뷰 캔버스에서 드로잉과 뷰에서 생성 된 비트 맵의 ​​차이는 어디에 있습니까? – AedonEtLIRA

0

내 추측은 ((-5이며, 즉 왼쪽 상단 모서리 -10)) 원이 (그 200 배 배율)이 너무 커지고, 따라서 그 좌표가 부정적인를 얻을 수 있습니다. 안드로이드 시스템은 음의 좌표로 뷰를 그려 내지 않습니다 (이것을 원한다면 onMeasure() 메소드를 오버라이드해야합니다)

+0

View # drawBitmap (Bitmap, float, float, Paint) 호출이 비트 맵의 ​​크기를 변경한다고 생각하지 않습니다. 내가 맞다면 원이 어떻게 커지겠습니까? 크기가 해당 비트 맵의 ​​크기와 직접 관련이없는 경우 (이 경우 50x50 픽셀입니까?) – AedonEtLIRA

+0

Icon 클래스의 생성자에서 반경 25 픽셀의 원을 그립니다.이 원형은 괜찮습니다. 그러나 ondraw 메서드에서는 Display 클래스의 onDraw() 메서드에서 캔버스를 가져옵니다. 이 캔버스는 200 배로 크기가 조정되어 200 배 더 크게 표시됩니다. 이제 원이 화면의 왼쪽 상단에 그려지고 반지름이 25 픽셀 인 경우 200 * 25 = 5000 픽셀이됩니다. 이제 왜 화면이 화면 외부로 나올지 이해할 것입니다. – asenovm

+0

현상금은 올바른 방향으로 나를 가리켜 주었기 때문에 현상금을 선물로 받았지만 직접적인 해결책은 아니 었습니다. – AedonEtLIRA

0

캔버스가 어떻게 작동하는지 약간 혼란 스럽습니다. (직관적이지 않으므로, 혼동하기 쉽습니다). 비트 맵을 매개 변수로 사용하여 캔버스를 호출하는 방식은 비트 맵을 페인트 할 것으로 간주하므로 비트 맵의 ​​크기에 따라 제약을받습니다. 매개 변수 (빈 캔버스)없이 캔버스를 만들고 그 안에 비트 맵을 그려 넣으면 실제로 비트 맵을 변경하지 않고 그냥 캔버스에 그립니다. 그 상황에서 당신은 사각형 내에서 비트 맵을 그릴 수 있고 주위에 원을 그릴 수 있습니다.

또한 onDraw 메서드를 재정의하고 해당 캔버스 (콜백을 호출 할 때 사용자에게 넘겨주는)를 수집하여 원하는 캔버스를 그릴 수 있습니다. 실제로 캔버스에 표시되는 캔버스입니다. 화면에 액세스 할 수있는 가장 쉬운 방법입니다.

+0

나는 당신이 말하는 것을 뒤쫓을 것이지만, 작은 모범을 보여줄 수 있습니까? – AedonEtLIRA

+0

나는 내 전화 인 atm에있어, 코드 예제를 입력하기가 어렵다. (음성 인식은이 주석과 같은 것들에 대해 잘 작동한다.) 당신은 당신이하고 싶은 일에 아주 가깝습니다. onDraw 메서드로 작업하고 Icon 메서드에서 수행하는 것처럼 * 해당 캔버스를 사용하여 비트 맵에 그리는 대신 그림을 그립니다. –

관련 문제