2012-03-11 4 views
2

OvalShape()의 알파 값을 점차적으로 변경하려고합니다. 이 경우 무효화를 호출하여 자체 호출을 계속하고 증가 된 자체 렌더링을 수행해야합니다. 알파 값 .. drawable.invalidate를 설정하여 캔버스에 연속적으로 그리기

하지만 난 이것에 대해 많은 생각을 가지고 있겠지로 설정이 잘못입니다 ..

public class xml_anim_testing_sub_class extends View { 
    private ShapeDrawable mDrawable; 
    int x = 10; 
    int y = 10; 
    int width = 300; 
    int height = 50; 
    int my_alpha = 255,add_to_my_alpha = 0; 

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

    protected void onDraw(Canvas canvas) { 
     x++; 
     mDrawable = new ShapeDrawable(new OvalShape()); 
     mDrawable.getPaint().setColor(0xff74AC23); 
     mDrawable.setAlpha(my_alpha += add_to_my_alpha); 
     mDrawable.setBounds(x, y, x + width, y + height); 
     if (my_alpha == 0) 
      add_to_my_alpha = 1; 
     if (my_alpha == 255) 
      add_to_my_alpha = -1; 
     mDrawable.draw(canvas); 
     mDrawable.invalidateSelf(); 
    } 
} 

좋아, 내가 솔루션, invalidate()을 찾았지만, 다음 invalidate과의 차이점은 무엇입니까 postInvalidate? 둘 다 작동하고있어 ..

또한 무엇을 사용합니까?

mDrawable.invalidateSelf()(cb); 

답변

6

대신 mDrawable.invalidateSelf()를 호출, postInvalidate() (뷰 자체)를 호출합니다. 이것은 현재 도면이 완료된 후에 다른 도면 패스를 스케쥴합니다.

또한 onDraw를 통해 매번 새로운 ShapeDrawable을 할당 할 필요가 없습니다. 한 번만 생성자에 할당하십시오. 이것은 쓰레기 발생을 줄입니다. 워드 프로세서 당으로

+0

나는 믿을 수는 없지만 새로운 것을 시도해 보니 onDraw ...의 끝에서 무효화되었습니다. :) 효율적인 ... ni가 "new ShapeDrawable "생성자에서 .. :) thanks .. 많이 .. 그래서 무효와 postInvalidate의 차이점은 무엇입니까 ??? 둘 다 일하고있어. 또한 무엇입니까? mDrawable.invalidateSelf() (cb); – Mahesh

+3

@Mahesh -'postInvalidate()'는 프레임 워크가 드로잉 중에 큐에 올 수있는 다른 이벤트를 처리 할 수있는 기회를줍니다. 필자는'invalidate() '대신에 샘플 코드의 일부를 사용하기 때문에 그렇게 제안했다. 'Drawable.invalidateSelf()'는 뷰의'invalidateDrawable()'메소드를 호출합니다.이 메소드는 드로어 블의 현재 경계 만 무효화합니다. 드로어 블을 움직이지 않으면'invalidate (mDrawable.getBounds()) '를 호출하는 것과 같은 효과를 갖습니다. 'mDrawable'을 움직이면 그리기가 필요한 부분을 놓칠 수 있습니다. –

+0

hmm .. der는 버튼과 같지 않습니다.하지만 여전히 Jargon Ted에게 감사드립니다. – Mahesh

0

: http://developer.android.com/reference/android/view/View.html#invalidate()

invalidate() 

전체보기를 무효로합니다. 뷰가 표시되면 미래의 어느 시점에서 onDraw (android.graphics.Canvas)가 호출됩니다.

UI 스레드에서 호출해야합니다. 비 UI 스레드에서 호출하려면 postInvalidate()를 호출하십시오.

게시물 무효화는 UI 스레드 (메인 루퍼)가 FIFO 방식으로 실행되도록 무효화 작업을 대기열에 넣습니다.