2012-07-30 5 views
0

invalidate()OnDraw() 메서드를 호출하지 않습니다. 내가 OnDraw()가있는 것과 같은 클래스의 setter 메소드에 invalidate()를 사용합니다.invalidate()가 OnLraw 메서드를 호출하지 않습니다

public class PuzzleDraw extends View { 

    // defining some variables // 

    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     // codes for painting puzzle // 
    } 

    public PuzzleDraw(Context context) { 
     super(context); 
    } 

    // Method for giving cursor X/Y from MainActivity OnTouch() method and using it in OnDraw() method in some part of painting code // 

    public void setCursor(int i, int j) { 
     this.xx = i; 
     this.yy = j; 
     invalidate(); 
    } 

내 코드를 디버깅 할 때, 모든 invalidate()을 위해 아무것도하지 않고있다, invalidate()가 실행될 때 ... 사실 을 OnDraw()을 불러 오기를 제외하고 좋은 나를! 무엇이 잘못 되었나요? postInvalidate(), this.invalidate(), this.postInvalidate()도 사용했지만 아무 것도 변경되지 않았습니다.

답변

3

invalidate()을 호출하면 onDraw이 직접 실행되지 않고 View 클래스에 적절한 플래그 만 설정됩니다. 다음 번에 뷰 계층 구조가 통과 할 때 onDraw 메서드가 프레임 워크에 의해 호출됩니다.

+0

그래서 어떻게해야합니까? OnTouch() 이벤트를 실행할 때마다 OnDraw()가 필요합니다 ... 필요합니다. – androidprogrammer2012

+0

'invalidate '를 호출하면'onDraw' 메소드는 시스템이 뷰를 그리는 데 사용할 수있을만큼 빨리 실행됩니다. 드로잉 프로세스를보다 잘 제어하고 싶다면'SurfaceView' 사용을 고려해야합니다. –

+1

문제는 Fast 또는 Slow에 관한 문제가 아닙니다! ... 문제는 invalidate()가 호출 될 때 내 OnDraw() 메서드가 작동하지 않는다는 것입니다. ("작동하지 않음", 작동하지 않음) – androidprogrammer2012

1

setCursor (float, float) 메서드는 activity에서 호출하여 한 번만 호출 할 수 있지만 프레임 워크 자체에서 onDraw 메서드를 호출하려면 invalidate 메서드를 다시 호출해야합니다.

희망 하시겠습니까?