如何在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
相关产品推荐
相关产品推荐

