You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android自定义View用Canvas绘图无显示,求排查代码问题

常见问题排查及解决

以下是导致自定义View无法显示绘制内容的几个核心问题及对应解决方式:

  • 自定义View未重写onMeasure设置尺寸
    LinearLayout这类ViewGroup添加子View时,若自定义View未重写onMeasure,默认会使用wrap_content但无法计算出有效尺寸,最终View宽高为0导致不可见。重写方法指定默认尺寸或适配父布局:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int desiredWidth = 800;
        int desiredHeight = 600;
    
        int width = resolveSize(desiredWidth, widthMeasureSpec);
        int height = resolveSize(desiredHeight, heightMeasureSpec);
    
        setMeasuredDimension(width, height);
    }
    
  • 内部Bitmap/Canvas未与View实际尺寸绑定
    若在构造方法中初始化Bitmap,此时View还未完成测量,Bitmap宽高可能为0或与实际显示尺寸不匹配,绘制内容无法落在View可视范围内。将Bitmap初始化移至onSizeChanged方法:

    private Bitmap bitmap;
    private Canvas bitmapCanvas;
    
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (bitmap != null) {
            bitmap.recycle();
        }
        bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        bitmapCanvas = new Canvas(bitmap);
    }
    
  • 绘制后未触发View重绘
    若直接操作内部Canvas绘制但未调用invalidate(),View不会执行onDraw方法,内部Bitmap的内容无法渲染到屏幕。需在自定义绘制方法末尾触发重绘,并在onDraw中把Bitmap绘制到屏幕Canvas:

    public void drawAxisX() {
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStrokeWidth(2);
        bitmapCanvas.drawLine(50, getHeight()-50, getWidth()-50, getHeight()-50, paint);
        invalidate(); // 触发重绘
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (bitmap != null) {
            canvas.drawBitmap(bitmap, 0, 0, null);
        }
    }
    
  • Paint属性设置错误
    若画笔颜色与View背景色一致、strokeWidth设为0,或未设置正确的绘制样式,都会导致线条不可见。检查并修正Paint参数:

    Paint axisPaint = new Paint();
    axisPaint.setColor(Color.BLUE); // 确保与背景有颜色反差
    axisPaint.setStrokeWidth(3);
    axisPaint.setStyle(Paint.Style.STROKE); // 线条绘制需用STROKE模式
    
  • 添加View时未设置布局参数
    在Activity中往LinearLayout添加自定义View时,必须指定LayoutParams,否则ViewGroup无法确定View的摆放规则:

    GraphPlotter plotter = new GraphPlotter(this);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,
        LinearLayout.LayoutParams.MATCH_PARENT
    );
    plotter.setLayoutParams(params);
    plotter.drawAxisX();
    linearLayout.addView(plotter);
    

内容的提问来源于stack exchange,提问作者Onurkudrt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:39:57