CircularImageView和API 16:NullPointerException错误 [英] CircularImageView and API 16: NullPointerException error

查看:217
本文介绍了CircularImageView和API 16:NullPointerException错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用不同的API测试我的应用程序,它似乎适用于API 17至23但我在API 16中发现,我无法加载我的自定义视图。我只是想在一个圆圈中显示一张照片,我从这个帖子中获取了自定义视图的代码:如何在Android中创建圆形ImageView?

I was testing my app on different APIs and it seems to work on API 17 till 23 but I found in API 16, I cannot load my customview. I just want to display a photo in a circle and I have obtained the code for the customview from this thread: How to create a circular ImageView 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) 

这是logcat:


01-09 15:09:51.185 2119-2119 /? E / AndroidRuntime:FATAL EXCEPTION:main
java.lang.NullPointerException
at com.example.simon.customshapes.CircularImageView.getCroppedBitmap(CircularImageView.java:59)
at 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)
at android.support.v.widget.RevlerView.draw(RecyclerView.java:3097)
at android.view.View.getDisplayList(View.java:12409)
at android.view.View.getDisplayList( View.java:12453)
在android。 view.View.draw(View.java:13182)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at 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)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
at 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)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182)
at 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)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at 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.drawChi ld(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)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182 )
在android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at a

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

Is有什么原因导致我无法在Android API 16中绘制圆形图像视图?

Is there a reason why I cannot draw a circular imageview in Android API 16?

推荐答案

使用此方法将drawable转换为位图:

Use this method to convert your drawable to a bitmap:

public static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;

    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

然后代替在原始代码中使用以下行:

Then instead of using in the original code, the following line:

Bitmap b = ((BitmapDrawable) drawable).getBitmap();

请改用:

Bitmap b = drawableToBitmap(drawable);

然后它会毫无错误地运行。

Then it will run without error.

这篇关于CircularImageView和API 16:NullPointerException错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆