Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 动画操作栏';s图标_Android_Actionbarsherlock_Android Drawable - Fatal编程技术网

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();
}