2014-06-13 2 views
0

나는 움직이기를 원하는 ActionBar 아이콘 (왼쪽에있는 하나의 액션 아이템)이 있습니다.ActionBar의 아이콘으로 애니메이션하기

나는이처럼 내 ActivityActionBar의 아이콘을 설정하고 있습니다 :

getSupportActionBar().setIcon(icon)

icon 비트 맵에 사용자 정의 XML 뷰를 변환하는 라이브러리에 의해 생성되는 Drawable이다. 이 XML보기는 배경 이미지가 있고 TextView이 맨 위에있는 RelativeLayout입니다.

오늘 TextView을 업데이트해야 할 때 나는 icon을 다시 생성하고 setIcon으로 다시 전화합니다. 그 대신, TextView을 잡고 그 중 일부를 페이드 아웃 한 다음 업데이트 한 후 (예 : setIcon을 호출 할 필요없이 동일한 효과를 다시 사용) 애니메이션 효과를 적용하고 싶습니다.

잘 모르시는가요? 누군가가 접근법을 추천 할 수 있습니까?

편집 :이 방법을 시도 :

MyActivity에서 :

Drawable myDrawable = new MyDrawable(); 
supportActionBar.setIcon(myDrawable); 

과 :

public class MyDrawable extends Drawable { 
    private Paint paint; 
    private RectF rect; 

    public MyDrawable() { 
     this.paint = new Paint(); 
     this.rect = new RectF(); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     paint.setARGB(255, 0, 255, 0); 
     paint.setStrokeWidth(2); 
     paint.setStyle(Paint.Style.FILL); 

     rect.right = 20f; 
     rect.bottom = 20f; 

     canvas.drawRoundRect(rect, 0.5f, 0.5f, paint); 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     paint.setAlpha(alpha); 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     paint.setColorFilter(cf); 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.OPAQUE; 
    } 
} 

아무것도까지 보여줍니다. onDraw이 호출됨을 확인했습니다. 나에게 의심스러운 뭔가가 XML 레이아웃을 잊고 정의 Drawable을 생성하는 것입니다 위해 canvas 1.

답변

3

적절한 접근 방식 모두 높이 & 폭 세트를 가지고 있다는 것입니다.

이 사용자 정의 드로어 블의 인스턴스는 ActionBar의 아이콘으로 설정되고 필요에 따라 invalidateSelf() (애니메이션 등으로 인해) 할 때마다 호출됩니다.

드로어 블 다른 드로어 블을 참조를 저장할 수있는 onDraw 콜백시와 (예를 들어) 전화 bgDraw.draw(canvas) (예를 들어, BitmapDrawable은 배경 음영의 /res/ 폴더 또는 색상 또는 그라데이션 당김에서 뭔가를하기 위해).

onDraw 콜백 중에 주어진 캔버스에 직접 그릴 수 있습니다. 캔버스를 사용하면 원, 선, 영역, 패스 및 텍스트를 직접 그릴 수 있습니다.

편집 :

매우 간단한 애니메이션 예 (코드 가능성 오타 확인하지 않았다) :

private long animationTime; 
public void doAnimation(){ 
    animationTime = System.currentTimeMilis() + 3000; // 3 seconds 
    invalidateSelf(); 
} 

public void onDraw(Canvas canvas){ 
    // do your drawing. 
    // You can use difference between 
    // currentTimeMilis and animationTime for status/position 
    ... 

    // at the end 
    if(animationTime > System.currentTimeMilis()) 
     invalidateSelf(); 
} 
+0

감사합니다. 나는이 접근법을 시도하고 있지만 지금까지 그릴 것이 아무것도 없다. 내 사용자 정의 drawable의 onDraw 메소드는 (0,0) - (20,20) RectF에 대해 drawRoundRect를 호출하는 높이와 너비 '1'의 캔바스를받습니다. 어떤 포인터? – siger

+0

는'getIntrinsicWidth'와'getIntrinsicHeight'를 오버라이드하고 어떤 값을 반환합니다. 또한'setBounds'를 오버라이드하고 거기에 필요한 크기를 초기화하십시오. – Budius

+0

감사합니다. 기본 비트 맵 + 텍스트가 작동 중입니다. 난 임의의 본질적인 & 바운드 값을 제공하고 더 알고 싶습니다. 또한 애니 메이팅을 위해 onDraw에서 invalidateSelf를 호출하고 상태 시스템을 유지해야하는지 궁금합니다. 어떤 포인터라도 도움이 될 것입니다. – siger