Android 动画操作栏';s图标
我有一个Android 动画操作栏';s图标,android,actionbarsherlock,android-drawable,Android,Actionbarsherlock,Android Drawable,我有一个ActionBar图标(左边的主图标,不是一个动作项),我想给它设置动画 我正在我的活动中设置我的操作栏的图标,如下所示: getSupportActionBar().setIcon(图标) 其中,图标是一个由库生成的可绘制图标,该库将自定义XML视图转换为位图。此XML视图是一个相对视图,上面有一个背景图像和一个文本视图 今天,当我必须更新文本视图时,我只需重新生成图标,然后再次调用设置图标。相反,我想获得我的文本视图,并在其上应用一些动画效果,如淡出,然后在更新后淡入(可能永远不必调
ActionBar
图标(左边的主图标,不是一个动作项),我想给它设置动画
我正在我的活动中设置我的操作栏的图标,如下所示:
getSupportActionBar().setIcon(图标)
其中,图标
是一个由库生成的可绘制图标,该库将自定义XML视图转换为位图。此XML视图是一个相对视图
,上面有一个背景图像和一个文本视图
今天,当我必须更新文本视图时,我只需重新生成图标
,然后再次调用设置图标
。相反,我想获得我的文本视图
,并在其上应用一些动画效果,如淡出,然后在更新后淡入(可能永远不必调用设置图标
,只需重复使用相同的图标)
我不知道该怎么办。有人能推荐一种方法吗
编辑:尝试此方法:
在MyActivity
中:
Drawable myDrawable = new MyDrawable();
supportActionBar.setIcon(myDrawable);
以及:
什么也没出现。我确认调用了onDraw
。我怀疑的是,canvas
的高度和宽度都设置为1。正确的方法是忘记XML布局,创建一个自定义的可绘制的
此自定义绘图的实例将设置为ActionBar上的图标,并在需要重新绘制时调用invalidateSelf()
(例如,由于动画)
drawable可以保存对其他drawable的引用(例如,BitmapDrawable可以从/res/
文件夹中提取某些内容,或者可以为背景着色绘制颜色或渐变),并在onDraw
回调期间调用(例如)bgDraw.draw(canvas)
它还可以在onDraw
回调期间直接在画布上绘制内容。使用画布,您可以直接在其上绘制圆、线、区域、路径和文本
编辑:
非常简单的动画示例(没有检查代码,可能是打字错误):
谢谢我正在尝试这种方法,但到目前为止还没有任何结果。我的自定义drawable的onDraw
方法接收高度和宽度为“1”的画布,我在画布上调用(0,0)-(20,20)RectF的drawRoundRect。任何指针?重写getIntrinsicWidth
和getIntrinsicHeight
并返回一些值。同时覆盖setBounds
并初始化您需要的任何大小。谢谢,我现在有了一个基本的位图+文本。我提供任意的内在和界限值,想知道更多。同样对于动画,我想知道是否应该从onDraw调用invalidateSelf并维护一个状态机。如果有的话,任何指针都会很有用。您可以从任何适合自己的地方调用invalidateSelf()
,包括onDraw
,以保持动画流畅。如何组织完全取决于您,但我只是在答案上给出了一个非常简单的方法(检查编辑)。您还可以使用Drawble上内置的onLevelChange
回调来触发不同的内容(例如,您将drawable.setLevel(1000)
设置为1秒动画),以显示任意的内在大小:您将其用于actionbar图标,因此,我认为您应该返回的大小是actionbar图标的大小。
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;
}
}
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();
}