【问题标题】:Animating ActionBar's icon动画 ActionBar 的图标
【发布时间】:2014-06-24 16:29:28
【问题描述】:

我有一个 ActionBar 图标(左侧的主图标,不是操作项),我想制作动画。

我正在我的Activity 中设置我的ActionBar 的图标,如下所示:

getSupportActionBar().setIcon(icon)

其中icon 是由将自定义XML 视图转换为位图的库生成的Drawable。这个 XML 视图是一个带有背景图像的 RelativeLayout 和顶部的 TextView

今天,当我必须更新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 被调用。让我怀疑的是canvas 的高度和宽度都设置为 1。

【问题讨论】:

    标签: android actionbarsherlock android-drawable


    【解决方案1】:

    一个适当的方法是忘记 XML 布局并创建一个自定义 Drawable

    此自定义可绘制对象的实例将设置为 ActionBar 上的图标,并在需要重绘时调用 invalidateSelf()(例如,由于动画)。

    drawable 可以保存对其他drawables 的引用(例如,BitmapDrawable 具有来自/res/ 文件夹的某些内容,或者用于背景阴影的 Color 或 Gradient 可绘制对象)并在onDraw 回调期间调用(例如)bgDraw.draw(canvas)

    它还可以直接在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();
    }
    

    【讨论】:

    • 谢谢。我正在尝试这种方法,但到目前为止无法绘制任何东西。我的自定义可绘制对象的onDraw 方法接收高度和宽度为“1”的画布,我在该画布上调用 drawRoundRect 以获得 (0,0)-(20,20) RectF。有指针吗?
    • 覆盖 getIntrinsicWidthgetIntrinsicHeight 并返回一些值。还覆盖setBounds 并在那里初始化您需要的任何大小。
    • 谢谢,我现在有一个基本的位图+文本。我提供任意内在和绑定值,想了解更多。同样对于动画,我想知道我是否应该从 onDraw 调用 invalidateSelf 并维护一个状态机。如果有的话,任何指针都会有所帮助。
    • 您可以在任何适合您的地方拨打invalidateSelf(),包括onDraw,以保持动画流畅。你如何组织很大程度上取决于你,但我只是在答案上提出了一个非常简单的方法(检查编辑)。您还可以使用 Drawble 内置的 onLevelChange 回调来触发不同的东西(例如,您将 drawable.setLevel(1000) 设置为动画 1 秒)
    • 关于任意内在尺寸:您评论您将它用于操作栏图标,所以我认为您应该返回的尺寸是操作栏图标大小。 stackoverflow.com/questions/7165830/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多