2012-03-28 2 views
3

그래서 사용자 정의보기의 onDraw() 메서드에서 비트 맵을 끌어 와서 애니메이션을 만듭니다. onDraw() 메서드로 그려지는 비트 맵의 ​​위치를 ​​변경하는 사용자 정의보기의 메서드를 호출하는 업데이트 스레드가 있습니다. 내가 뭘하고 싶은지 비트 맵을 내가 업데이 트 스레드가 끝날 때마다 내가 저장 비트 맵에서 gif를 만들 수 있도록 만들어 저장하는 것입니다. onDraw 메서드를 통해 애니메이션이 진행되는 사용자 정의보기에서 비트 맵을 저장합니다.

나는 SD 카드에 메모리에 저장된 비트 맵에서 PNG를 저장하기 위해 아래의 코드를 발견하고 그 저장된 비트 맵과 함께 작동하지만 난 getDrawingCache()에 문제가 있어요 :

public void saveView(){ 
    if(counter < 200){ 
     try { 
      counter++; 
      System.out.println("Counter : " + counter); 
      File file = new File(path, "star"+counter+".png"); 
      file.delete(); 
      OutputStream fOut = new FileOutputStream(file); 
      buildDrawingCache(); 
      getDrawingCache().compress(Bitmap.CompressFormat.PNG, 100, fOut); 
      destroyDrawingCache(); 
      fOut.flush(); 
      fOut.close(); 
      MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

이렇게을 본질적으로 두 가지 일을합니다.

1) 약 50 개의 이미지가 필요하고 SD 카드에 저장됩니다. @ 약 50 그것은 힙이 큰 (내가 destroyDrawingCache()이 별도의 스레드에 있기 때문에 실제로 끝낼 수없는 것 같아요)

2) 촬영 한 사진에서 스캔 라인을 볼 수 있습니다 버퍼를 업데이트하는 버퍼에서 가져 오기 때문에 버퍼 업데이트.

getDrawingCache가 onDraw()를 호출하는 것처럼 보이기 때문에 onDraw 자체의 UI 스레드에서이 작업을 수행 할 수 없습니다.

가능한 경우 도움을주세요.

+0

UI 스레드에서'saveView()가 호출 되었습니까? –

+0

은 onDraw가 호출 될 때마다 새 스레드에 없습니다. – L7ColWinters

답변

1

UI 스레드 외부에서 getDrawingCache()으로 전화하지 않아야합니다. 그것이 당신이 얻는 비트 맵이 스캔 라인을 부분적으로 업데이트 한 이유입니다. onDraw()에서 직접 saveView()으로 전화하십시오. 파일 작업 만 캐시 된 비트 맵의 ​​복제를 만든 후에 별도의 스레드에서 실행할 수 있습니다.

참고 :setDrawingCacheEnabled(true)으로 전화 할 수 있습니까? 따라서 buildDrawingCache()destroyDrawingCache()으로 전화하지 않아도됩니다. 또한 기기에 하드웨어 가속 기능이 설정되어있는 경우 setLayerType(LAYER_TYPE_SOFTWARE, null)으로 전화해야합니다.

다른 해결책은 빈 비트 맵을 포함하는 새 캔버스에서 View.draw(android.graphics.Canvas)을 호출하여 비트 맵을 가져 오는 것입니다.

+0

UI 스레드에서 코드를 실행할 때 반복해서 동일한 이미지가 반복적으로 표시됩니다. 다른 것들 대신에 setDrawingCacheEnabled (true)가있는 것들. – L7ColWinters

+0

View.draw (캔버스)를 사용하는 것은 내가해야만하는 길이었습니다. 그래서 기본적으로 update 메소드에서 saveView를 호출했습니다. saveview 내에서 임시 비트 맵을 만들고 수동으로 draw (canvas)를 수행 한 다음 구성된 비트 맵을 가져 와서 sd에 저장하고 저장했습니다. – L7ColWinters

+0

애니메이션에서 화면을 캡처하기 위해 이미지 스위처를 확장했습니다. onDraw() 메서드를 재정의했습니다. 필요에 따라 사진을 찍고 있지만 시간이 조금 깜박이고 전혀 애니메이션이 적용되지 않습니다. 이미지를 캡처 할 수 있지만 제대로 그릴 수 없는지 궁금합니다. 도와주세요. –

관련 문제