CircularImageView 和 API 16:NullPointerException 错误

2024-01-06

我正在不同的 API 上测试我的应用程序,它似乎可以在 API 17 到 23 上工作,但我发现在 API 16 中,我无法加载我的自定义视图。我只想在一个圆圈中显示一张照片,并且我已经从此线程中获得了自定义视图的代码:如何在Android中创建圆形ImageView? https://stackoverflow.com/questions/16208365/create-a-circular-image-view-in-android

我的代码粘贴在这里:

public class CircularImageView extends ImageView {

    public CircularImageView(Context context) {
        super(context);
    }

    public CircularImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CircularImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        Drawable drawable = getDrawable();

        int w = getWidth();

        if (drawable == null) {
            return;
        }

        if (getWidth() == 0 || getHeight() == 0) {
            return;
        }
        Bitmap b = ((BitmapDrawable) drawable).getBitmap();

        Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);

        Bitmap roundBitmap = getCroppedBitmap(bitmap, w);
        canvas.drawBitmap(roundBitmap, 0, 0, null);

    }

    public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {
        Bitmap sbmp;

        if (bmp.getWidth() != radius || bmp.getHeight() != radius) {
            float smallest = Math.min(bmp.getWidth(), bmp.getHeight());
            float factor = smallest / radius;
            sbmp = Bitmap.createScaledBitmap(bmp, (int) (bmp.getWidth() / factor), (int) (bmp.getHeight() / factor), false);
        } else {
            sbmp = bmp;
        }

        Bitmap output = Bitmap.createBitmap(radius, radius,
                Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, radius, radius);

        paint.setAntiAlias(true);
        paint.setFilterBitmap(true);
        paint.setDither(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(Color.parseColor("#BAB399"));
        canvas.drawCircle(radius / 2 + 0.7f,
                radius / 2 + 0.7f, radius / 2 + 0.1f, paint);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(sbmp, rect, rect, paint);

        return output;
    }
}

错误发生在这一行:

    if (bmp.getWidth() != radius || bmp.getHeight() != radius) 

这是日志猫:

01-09 15:09:51.185 2119-2119/? E/AndroidRuntime:致命异常:main java.lang.NullPointerException 在 com.example.simon.customshapes.CircularImageView.getCroppedBitmap(CircularImageView.java:59) 在 com.example.simon.customshapes.CircularImageView.onDraw(CircularImageView.java:51) 在 android.view.View.draw(View.java:13458) 在 android.view.View.getDisplayList(View.java:12409) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.draw(View.java:13461) 在 android.view.View.getDisplayList(View.java:12409) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.getDisplayList(View.java:12407) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.support.v7.widget.RecyclerView.drawChild(RecyclerView.java:3588) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.draw(View.java:13461) 在 android.support.v7.widget.RecyclerView.draw(RecyclerView.java:3097) 在 android.view.View.getDisplayList(View.java:12409) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2806) 在 android.view.View.draw(View.java:13461) 在 android.view.View.getDisplayList(View.java:12409) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.getDisplayList(View.java:12407) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.draw(View.java:13461) 在 android.support.v4.view.ViewPager.draw(ViewPager.java:2262) 在 android.view.View.getDisplayList(View.java:12409) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.support.design.widget.CoordinatorLayout.drawChild(CoordinatorLayout.java:1077) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.getDisplayList(View.java:12407) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.getDisplayList(View.java:12407) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.getDisplayList(View.java:12407) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.draw(View.java:13461) 在 android.widget.FrameLayout.draw(FrameLayout.java:467) 在 android.view.View.getDisplayList(View.java:12409) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在 android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799) 在 android.view.View.getDisplayList(View.java:12407) 在 android.view.View.getDisplayList(View.java:12453) 在 android.view.View.draw(View.java:13182) 在 android.view.ViewGroup.drawChild(ViewGroup.java:2929) 在一个

我无法在 Android API 16 中绘制圆形图像视图是否有原因?


好吧,因为您的位图为空并且可绘制对象并不是唯一可能出现错误的地方copy(Bitmap, boolean) http://developer.android.com/reference/android/graphics/Bitmap.html#copy(android.graphics.Bitmap.Config,%20boolean).

如果你查看文档

如果不支持转换,或者分配器失败,则返回 NULL。

尝试使用较小的图像,因为这可能是内存不足的迹象。您还应该针对可能返回的空值添加一些防范措施,例如在这种情况下只绘制普通位图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CircularImageView 和 API 16:NullPointerException 错误 的相关文章

随机推荐

  • 无法启动 springboot 管理,java.lang.NoClassDefFoundError: org/springframework/cloud/netflix/zuul/filters/TraceProxyRequestHelper

    当我创建示例项目时尝试使用 spring boot admin 遵循 http codecentric github io spring boot admin 1 4 1 http codecentric github io spring
  • 静态绑定和动态绑定有什么区别?

    绑定时间可以分为两种类型 静态和动态 静态绑定和动态绑定有什么区别 您能举一个简单的例子来进一步说明吗 用最一般的术语来说 静态绑定意味着引用已解析在编译时 Animal a new Animal a Roar The compiler c
  • 类型级别数算术

    我正在研究 F 的类型推断器 尝试让类型级别的自然数正常工作 这是我设法开始工作的部分 type Zero Zero type Succ lt a gt None type True True type False False type I
  • xvalue 不都是左值和右值吗?

    我读了这个answer https stackoverflow com a 27364969引起我注意的部分是 int i int p i int f int g int h h prvalue g glvalue xvalue f glv
  • 在 IIS 上部署plotly dash

    我正在尝试将一个阴谋破折号部署到 IIS 首先 我按照链接中的说明进行操作 IIS 上的 Flask James Polera https netdot co 2015 03 09 flask on iis 然后当我使用这个脚本时它就可以工
  • 我可以使用 perl 创建数据透视表吗?

    我使用 Excel Writer XLSX 模块使用 Perl 生成 Excel 文件 我把数据放在一张纸上 我想在创建 Excel 文件时自动创建包含该数据的数据透视表和图表 数据透视表和图表需要有过滤器 所以我可以选择月 周 状态 部门
  • Kafka主题未被删除

    我使用的是卡夫卡 0 10 0 1 集群中有 3 个代理 我发出了删除命令 删除了近 10 个一个月以来没有使用过的主题 我检查过 没有消费者注册这些主题 他们的日志大小也没有增加 然而 已经过去5个多小时了 那些话题还没有被删除 它们只是
  • 为什么使用迭代器而不是数组索引?

    采取以下两行代码 for int i 0 i lt some vector size i do stuff 和这个 for some iterator some vector begin some iterator some vector
  • PHP 的 T_VAR 错误

    我正在开发一个 html 表单 它将数据发送到一个显示它的 php 文件 最终我会让 php 将数据发送到 mysql 数据库 当我提交表单时 出现 php 错误 解析错误 语法错误 第 2 行 home2 rocksoli public
  • 如何从测试导航器中删除 Xcode Swift 测试类?

    Xcode 测试导航器显示测试用例类的列表 我想删除一个测试用例类 因为不再需要它 我尝试过许多典型的方法 例如按删除键 或查找 图标 或 删除 菜单项 或在 Apple Xcode 文档中搜索帮助 我找到了这个解决方法 在项目导航器中 从
  • Facebook API 营销:创建自定义受众的问题

    我尝试通过 APPUID 将用户添加到自定义受众 我确实发布到网址https graph facebook com v2 10 CUSTOM AUDIENCE ID users https graph facebook com v2 10
  • Emacs 日历:显示超过 3 个月?

    在 Emacs 中 当您使用以下命令显示日历时M x calendar 您可以在一个只有 8 行高的新窗口中显示三个月的信息 上个月 本月和下个月 是否可以在全尺寸窗口中生成十二个月的日历 12 个月日历 按月滚动 向前 向后 Scroll
  • 检测由于违反唯一约束而导致的 mysql 更新/插入失败

    这有点类似于这个问题 PHP MySQL INSERT 由于唯一约束而失败 https stackoverflow com questions 2756186 php mysql insert fails due to unique con
  • 如何从 MS SQL 数据表中检索列默认值

    我在用DataAdapter FillSchema从 MS SQL 检索表的架构 不幸的是 这不会返回列的默认值 当我需要检查数百个表时 有没有一种方法可以快速有效地检索此值作为架构的一部分 Thanks 默认值仅在行插入时确定 作为替代方
  • 如果 WPF 应用程序强制关闭或崩溃,处理 WPF 关闭事件

    我有一台名为 GameServer 的服务器 它持续运行 并且多个 ClientApplication 正在不同的不同机器上运行 当用户登录到服务器时 我将根据登录用户将一些数据保存到服务器 注销后我将对数据库以及我为登录用户对服务器所做的
  • 使用 Python 格式化 APNS 样式的 JSON 消息以与 Amazon SNS 一起使用

    我正在创建一个 iOS 应用程序 对于您的推送通知 我们使用 Amazon Simple Notification Service SNS SNS 很棒 但文档却相当稀疏 我在用着boto http docs pythonboto org
  • 使用“type”关键字和路径相关类型覆盖类型

    假设我有这样的代码 trait Holder type Value def put v Value class JsonHolder extends Holder override type Value String def put v J
  • Laravel Eloquent - 关系上的firstOrCreate()

    当我尝试firstOrCreate 在另一个模型的关系上 它不起作用 Client find id gt users gt firstOrCreate array email gt email 这会返回一个错误说 调用未定义的方法 Illu
  • 如何在我的 Grails 应用程序中使用 servlet?

    我需要使用一些实际上是 servlet 的连接器 我怎样才能在 Grails 中做到这一点以及 web xml 呢 如何配置 servlet 的 url 我实际上这里有一个 Spring 应用程序 我正在尝试将其转换为部分 Grails 应
  • CircularImageView 和 API 16:NullPointerException 错误

    我正在不同的 API 上测试我的应用程序 它似乎可以在 API 17 到 23 上工作 但我发现在 API 16 中 我无法加载我的自定义视图 我只想在一个圆圈中显示一张照片 并且我已经从此线程中获得了自定义视图的代码 如何在Android