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

如何在Canvas绘制矩形?及Activity向Draw类传递drawRect参数

嘿,我来帮你搞定这个问题!先说说Canvas画矩形的基础,再一步步实现从Activity传参数给Draw类的需求~

如何在Canvas上绘制矩形

Canvas绘制矩形的核心是drawRect()方法,它有几种重载形式,你用到的drawRect(float left, float top, float right, float bottom, Paint paint)是最常用的一种,参数含义如下:

  • left:矩形左侧的X坐标
  • top:矩形顶部的Y坐标
  • right:矩形右侧的X坐标
  • bottom:矩形底部的Y坐标
  • Paint:控制矩形的颜色、样式(填充/描边)等视觉属性
实现Activity向Draw类传递绘图参数

我们可以通过自定义View(你的Draw类需继承自View)的setter方法来接收Activity传递的参数,再在onDraw()中使用这些参数绘制矩形。下面是具体实现:

第一步:编写Draw.java(自定义View类)

在这个类中我们保存矩形的参数和颜色,提供外部可调用的方法来更新参数,并在参数变化时触发重绘:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class Draw extends View {
    // 存储矩形参数
    private float rectLeft;
    private float rectTop;
    private float rectRight;
    private float rectBottom;
    // 存储矩形颜色
    private int rectColor;
    private Paint paint;

    // 构造方法,覆盖View的所有重载形式
    public Draw(Context context) {
        super(context);
        initPaint();
    }

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

    public Draw(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    // 初始化Paint对象
    private void initPaint() {
        paint = new Paint();
        paint.setStyle(Paint.Style.FILL); // 默认填充样式,可改为STROKE实现描边矩形
        paint.setAntiAlias(true); // 开启抗锯齿,让边缘更平滑
    }

    // 提供给Activity调用的参数设置方法
    public void setRectParams(float left, float top, float right, float bottom, int color) {
        this.rectLeft = left;
        this.rectTop = top;
        this.rectRight = right;
        this.rectBottom = bottom;
        this.rectColor = color;
        // 参数更新后通知View重绘,确保新参数生效
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 设置当前矩形颜色
        paint.setColor(rectColor);
        // 使用传递过来的参数绘制矩形
        canvas.drawRect(rectLeft, rectTop, rectRight, rectBottom, paint);
    }
}

第二步:在Activity中调用并传递参数

这里分两种场景实现,你可以根据自己的需求选择:

场景1:布局文件中添加自定义View

先在布局文件(比如activity_main.xml)中引入Draw类:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- 注意替换com.yourpackage为你自己的包名 -->
    <com.yourpackage.Draw
        android:id="@+id/draw_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

然后在Activity中获取View实例并传递参数:

import android.os.Bundle;
import android.graphics.Color;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private Draw drawView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取自定义View实例
        drawView = findViewById(R.id.draw_view);

        // 传递你想要的矩形参数和颜色
        // 注意:right必须大于left,bottom必须大于top,否则矩形无法显示
        drawView.setRectParams(100, 100, 300, 300, Color.BLUE);
    }
}

场景2:动态创建自定义View

如果不想用布局文件,也可以在代码中直接创建Draw实例并添加到Activity:

import android.os.Bundle;
import android.graphics.Color;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 创建根布局
        LinearLayout rootLayout = new LinearLayout(this);
        rootLayout.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));

        // 创建Draw实例
        Draw drawView = new Draw(this);
        drawView.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT));

        // 传递矩形参数
        drawView.setRectParams(100, 100, 300, 300, Color.RED);

        // 将Draw添加到根布局
        rootLayout.addView(drawView);
        setContentView(rootLayout);
    }
}

关键注意事项

  • 确保right > left且bottom > top,否则矩形的宽高为负,无法被绘制出来
  • 每次调用setRectParams()后一定要调用invalidate(),它会触发View的onDraw()方法,让新参数立即生效
  • 如果需要多次更新矩形,直接重复调用setRectParams()即可,无需重新创建View实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:35:20