xUtils源码阅读(7)-GitDrawable

通常情况下,ImageView是不支持Gif动画的,所以我们要向支持Gif的话,必须自己来处理。

在这里我们就不是对Drawable的包装了,我们是对Drawable的重新实现。同时由于Gif具有动画,所以又同时实现了Runnable,Animatable接口。


源码:

public class GifDrawable extends Drawable implements Runnable, Animatable {

    private int byteCount;//数据大小
    private int rate = 300;//播放的频率,多长时间刷新一次
    private volatile boolean running;//是否正在运行

    private final Movie movie;//gif的具体内容
    private final int duration;//gif播放的时长
    private final long begin = SystemClock.uptimeMillis();

    public GifDrawable(Movie movie, int byteCount) {
        this.movie = movie;
        this.byteCount = byteCount;
        this.duration = movie.duration();
    }

    public int getDuration() {
        return duration;
    }

    public Movie getMovie() {
        return movie;
    }

    public int getByteCount() {
        if (byteCount == 0) {
            byteCount = (movie.width() * movie.height() * 3) * (5/*fake frame count*/);
        }
        return byteCount;
    }

    public int getRate() {
        return rate;
    }

    public void setRate(int rate) {
        this.rate = rate;
    }

    @Override
    public void draw(Canvas canvas) {
        try {
            int time = duration > 0 ? (int) (SystemClock.uptimeMillis() - begin) % duration : 0;
            movie.setTime(time);
            movie.draw(canvas, 0, 0);//git帧绘制
            start();
        } catch (Throwable ex) {
            LogUtil.e(ex.getMessage(), ex);
        }
    }

    @Override
    public void start() {
        if (!isRunning()) {
            running = true;
            run();
        }
    }

    @Override
    public void stop() {
        if (isRunning()) {
            this.unscheduleSelf(this);
        }
    }

    @Override
    public boolean isRunning() {
        return running && duration > 0;
    }

    @Override
    public void run() {
        if (duration > 0) {
            this.invalidateSelf();//页面失效
            this.scheduleSelf(this, SystemClock.uptimeMillis() + rate);//过会儿再重绘
        }
    }

    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public int getIntrinsicWidth() {
        return movie.width();
    }

    @Override
    public int getIntrinsicHeight() {
        return movie.height();
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
    }

    @Override
    public int getOpacity() {
        return movie.isOpaque() ? PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT;
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: selinux-utils是一个开源软件包,提供了与SELinux(安全增强型Linux)相关的工具和库。 要找到selinux-utils源码,你可以遵循以下步骤: 1. 打开任何一个网页浏览器,进入一个搜索引擎,如Google、Baidu、Github等。 2. 在搜索引擎的搜索框中键入"selinux-utils源码"或"selinux-utils GitHub"。这将让搜索引擎帮你找到与selinux-utils相关的资源。 3. 在搜索结果中,通常会有指向源码存储库的链接。点击其中一个链接,比如Github的链接。 4. 进入源码存储库后,你可以找到selinux-utils的源代码文件。它们通常以.c或.cpp为扩展名。 5. 在源码存储库中,你还可以找到其他与selinux-utils相关的信息,如文档、问题跟踪和讨论。 请注意,selinux-utils源码可能在不同的代码托管平台(如GitHub、GitLab等)或者开发者的个人网站上。确保选择了可信的源,并使用适当的下载方式获取源码。 ### 回答2: selinux-utils 是一个用于管理 SELinux 的工具集,包含了一些常用的 SELinux 相关工具和库文件。 selinux-utils 的源代码可以在 SELinux 官方的代码库中找到。你可以通过以下方式获取 selinux-utils 的源码: 1. 从官方源获取:访问 SELinux 项目的官方网站(https://github.com/SELinuxProject/selinux-utils)。在该页面中,你可以找到 selinux-utils 的源码仓库链接。你可以使用 git 命令克隆整个仓库到本地,以获取 selinux-utils 的完整源码。 2. 使用包管理器获取:如果你在使用 Linux 发行版,你可以尝试使用包管理器来获取 selinux-utils 的源码。不同的发行版可能有不同的包管理器,可以通过在终端中运行适当的命令来查找 selinux-utils 的包,并使用包管理器获取其源码。 请注意,获取源码需要一定的技术知识和经验。如果你只是想使用 selinux-utils,而不是为了开发或修改它,你可以直接通过软件包管理器安装预编译的二进制文件,而无需获取或编译源码。 ### 回答3: selinux-utils 源码是 Security Enhanced Linux (SELinux) 的一部分,它包含了对 SELinux 系统的管理工具。在大部分标准的 Linux 发行版中,selinux-utils 源码通常是通过源代码包(source package)的形式提供的。在一般的 Linux 系统中,你可以通过以下步骤来获取 selinux-utils 源码: 1. 打开终端,以 root 用户或拥有管理员权限的用户身份登录。 2. 使用适用于你所使用的 Linux 发行版的包管理器,比如 apt、yum、dnf、zypper、pacman 等,执行以下命令: - 对于 Ubuntu 或 Debian 系统:sudo apt-get source selinux-utils - 对于 CentOS 或 Fedora 系统:sudo dnf download --source selinux-utils 或 sudo yumdownloader --source selinux-utils - 对于 openSUSE 系统:sudo zypper source-install selinux-utils - 对于 Arch Linux 系统:使用 AUR 或者自定义 PKGBUILD 构建 3. 上述命令将会下载 selinux-utils 源代码压缩包,并解压到当前目录中。 注意:具体的命令和过程可能会因你所使用的 Linux 发行版和版本而有所不同,上述命令只是提供了一些常见的示例。你也可以在 SELinux 官方网站(https://github.com/SELinuxProject/selinux-utils)上找到最新版本的 selinux-utils 源码,并根据官方文档提供的指引进行下载和编译。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值