2014-11-28 3 views
0

나는 GridView를 가지고있다. 각 항목은 SurfaceView 형식에서 파생 된 개체가되고 싶습니다. SurfaceView를 확장 한 클래스와 getView()가 인스턴스를 반환하는 어댑터를 만들었습니다.어댑터에서 SurfaceView를 사용하는 방법 (안드로이드)

내가 얻는 것은 각 그리드 항목에 대해 검은 색 사각형입니다. SurfaceView의 draw()는 결코 호출되지 않고 (trace 추가로 표시됨) surfaceCreated()도 마찬가지입니다.

SurfaceView에 물건을 그릴 수있는 방법으로 어떻게해야합니까? 문제의 핵심은 surfaceCreated()가 호출되지 않는다는 것입니다. 왜 안돼?

public class LevelAdapter extends BaseAdapter 
{ 
    ... 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LevelNumberView number = new LevelNumberView(m_context); 
     number.setLayoutParams(new GridView.LayoutParams(70, 70)); 
     number.setPadding(1, 1, 1, 1); 
     number.masDraw(); // Experiment - but it doesn't work 
     return number; 
    } 

}

그럼 내 서피스 뷰 SurfaceView 클래스 :

이 내 어댑터입니다

public class LevelNumberView extends SurfaceView 
          implements SurfaceHolder.Callback 
{ 
    ... 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) 
    { 
     m_surfaceHolder = holder; 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     Log.i("LevelNumberView","Draw"); 
     doDraw(canvas, Color.YELLOW); 
    } 

    public void masDraw() 
    { 
     Log.i("LevelNumberView","masDraw"); 
     if (null != m_surfaceHolder) 
     { 
      Canvas canvas = m_surfaceHolder.lockCanvas(); 
      if (null != canvas) 
      { 
       doDraw(canvas, Color.GREEN); 

       m_surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 

    private void doDraw(Canvas canvas, int colour) 
    { 
     int w = canvas.getWidth(); 
     int h = canvas.getHeight(); 
     int min = Math.min(w,h); 
     Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(colour); 
     paint.setStyle(Paint.Style.FILL); 

     canvas.drawCircle(w/2, h/2, min, paint); 
    } 
} 

감사합니다! - 마크

답변

1

draw()을 무시하는 것은 아마도 원하는 것이 아닙니다. 뷰에 그리려면 onDraw()을 재정의하십시오. 서페이스에서 그리려면 대개 별도의 스레드에서 수행됩니다. SurfaceView는 뷰 기반 UI로 레이어 뒤에 그려지는 완전 분리 된 레이어입니다. SurfaceHolder().addCallback()을 호출하지 않은 경우 객체가 SurfaceView는 자체에 콜백을 보내지 않으므로 SurfaceView를 서브 클래 싱하는 것이 실제로 많은 일을하지는 않습니다.

아마도 원하는 것은 custom View일까요?

+0

감사합니다. 그곳에는 많은 것들이 있는데, 어디로 가야할지 잘 모르겠다 ... onDraw()도 호출되지 않는다. getHolder()를 호출하여 SurfaceHolder를 가져올 수 있으며 드로어는 별도의 스레드 (Hander 사용)에서 작동하지만, 앱에서 나가서 다시 돌아 왔을 때 검은 색 사각형으로 돌아 왔습니다. 정확한 시간에 (다시) 반복하여 그려야합니까? (반복해서 반복하는 것 이외에 불필요하게) 제발요. –

+0

Activity 및 SurfaceView 수명주기는 느슨하게 결합됩니다. 이에 대한 설명과 권장 사항은 https://source.android.com/devices/graphics/architecture.html#activity에서 확인할 수 있습니다. 내 생각 엔 당신이 정적에 SurfaceHolder를 저장하지 않았고 잃어 버렸습니다. 그리고 Surface가 다시 생성되지 않았기 때문에 새로운 것을 얻지 못했을 것입니다. 뷰가 무효화되고 렌더링이 필요한 경우에만 onDraw()가 호출됩니다. 게임 루프에서 사용자 정의보기를 구동하려는 경우 수동으로 무효화를 실행합니다. – fadden

+0

좋은 해결책 (답은 답)은 SurfaceView가 아닌 ​​View의 하위 클래스 인 것 같습니다. 나는 그 다음에 필요한 그림을 그리기 위해 Draw()를 무효로 만들었고, 내가 시도한 모든 상황에서 대접을 받는다. –

관련 문제