android - 空指针异常 : While getting the bitmap from canvas

标签 android canvas custom-view

我想要实现的目标:我想创建一个自定义 View ,即圆圈,现在我希望该圆圈在我的 Activity 中可见,这对我来说很酷,我在 Activity 中提到过这门课。当我点击膨胀的圆圈然后触摸设备屏幕中的任何位置然后绘制圆圈时我想要什么。

想法是:在这个圆形 View 的触摸上我应该生成位图,当用户触摸时我应该使位图适合父布局。

 public class CircleIcon extends View {
    private int centerX,centerY;
    private Paint outerCircularPaint,innerCircularPaint;
    private static final int STROKE_WIDTH = 5;
    Bitmap bitmap;
    Canvas mCanvas;

    public CircleIcon(Context context) {
        super(context);
        init();
    }

    public CircleIcon(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CircleIcon(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public CircleIcon(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {

        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    private void init(){
        bitmap = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
        outerCircularPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        outerCircularPaint.setStyle(Paint.Style.STROKE);
        outerCircularPaint.setStrokeWidth(STROKE_WIDTH);

        outerCircularPaint.setAntiAlias(true);
        outerCircularPaint.setStrokeCap(Paint.Cap.BUTT);
        outerCircularPaint.setColor(ContextCompat.getColor(getContext(), R.color.color_black));

        innerCircularPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        innerCircularPaint.setStyle(Paint.Style.FILL);
        innerCircularPaint.setStrokeWidth(STROKE_WIDTH);
        innerCircularPaint.setColor(ContextCompat.getColor(getContext(), R.color.white));

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        centerX = getMeasuredWidth()/ 2;
        centerY = getMeasuredHeight()/ 2;
        int radius = Math.min(centerX,centerY);
        canvas.drawCircle(centerX, centerY, radius, outerCircularPaint);
        canvas.drawCircle(centerX, centerY, radius-1, innerCircularPaint);
        canvas.drawBitmap(bitmap, 0, 0, outerCircularPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        Log.e("called---",""+w);
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(bitmap);
    }



    public Bitmap getBitmap()
    {
        this.setDrawingCacheEnabled(true);
        this.buildDrawingCache();
        Bitmap bmp = Bitmap.createBitmap(this.getDrawingCache());// here throwing nullpointer exception
        this.setDrawingCacheEnabled(false);
        return bmp;
    }
}

在 Activity 中:

private void initCustomMarkerBitmap() {
        Bitmap well = circleView.getBitmap();
        Bitmap save = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);
        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        Canvas now = new Canvas(save);
        now.drawRect(new Rect(0,0,320,480), paint);
        now.drawBitmap(well, new Rect(0,0,well.getWidth(),well.getHeight()), new Rect(0,0,320,480), null);
        this.mCustomDrawableBitmap=save;
        this.mCustomDrawableMarker = new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(this.mCustomDrawableBitmap));
    }

Logcat 错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                                                                                        at android.graphics.Bitmap.createBitmap(Bitmap.java:659)
                                                                                        at com.example.amit8.comapanydemo.customicon.CircleIcon.getBitmap(CircleIcon.java:103)
                                                                                        at com.example.amit8.comapanydemo.ui.base.main.MainActivity.initCustomMarkerBitmap(MainActivity.java:218)
                                                                                        at com.example.amit8.comapanydemo.ui.base.main.MainActivity.onCreate(MainActivity.java:84)
                                                                                        at android.app.Activity.performCreate(Activity.java:6245)
                                                                                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)

最佳答案

将此行放在您的 init() 方法中,然后将其从 getBitmap() 方法中删除。

setDrawingCacheEnabled(true);

检查它是否正常工作。

关于android - 空指针异常 : While getting the bitmap from canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49718804/

相关文章:

javascript - 在控制台上绘制 HTML5 Canvas

javascript - 如何在 Canvas 上跟踪火柴人的路径?

jquery - 为特定的 div 设置 L_PREFER_CANVAS = true

ios - 具有自定义 View 的相机

android - 如何在 Android 上自定义按钮(有两个文本字段)

javascript - Android chrome pageY 值是否随着最新的 chrome 更新而改变?

android - HttpURLConnection (java.net.CookieManager) 和 WebView (android.webkit.CookieManager) 之间 cookie 的两种同步方式

android - 无法解析 junit :junit:4. 12

android - 为 TextView 生成一个简单的分隔线

c# - Xamarin 单体机器人 : WP7 => Android and Custom Control?