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

矩形类中缩放时如何计算宽高?求scale方法修改尺寸方案

矩形缩放的宽高计算与scale方法实现

首先来说缩放时宽高的计算逻辑:
当你对矩形进行缩放操作时,实际渲染的宽度 = 原始宽度 × 水平缩放比例(scaleX),实际渲染的高度 = 原始高度 × 垂直缩放比例(scaleY)。如果是等比缩放,只需要保证scaleX和scaleY的值一致即可;如果是非等比缩放,就分别设置对应的比例值。

再看你的Rectangle类代码,要实现scale方法来修改尺寸,我们可以基于父类Graphic的现有方法(比如setScaleX()、setScaleY(),或者直接操作缩放比例变量)来完成。这里给你两种常见的实现方式:

方式一:添加按比例缩放的scale方法

如果需要让矩形按照指定的比例因子进行缩放,可以在Rectangle类中添加这样的方法:

public class Rectangle extends Graphic{
    public Rectangle(float centerX, float centerY, float width, float height) {
        super(centerX, centerY, width, height);
    }

    // 添加按比例缩放的方法,scaleFactor是缩放因子(比如1.5就是放大1.5倍,0.8就是缩小到80%)
    public void scale(float scaleFactor) {
        // 如果父类有setScaleX/setScaleY方法,直接更新缩放比例
        setScaleX(getScaleX() * scaleFactor);
        setScaleY(getScaleY() * scaleFactor);
        // 若父类支持直接修改显示尺寸,也可以用下面的写法
        // setWidth(getWidth() * scaleFactor);
        // setHeight(getHeight() * scaleFactor);
    }

    // 也可以分开设置水平和垂直的独立缩放比例
    public void scale(float scaleXFactor, float scaleYFactor) {
        setScaleX(getScaleX() * scaleXFactor);
        setScaleY(getScaleY() * scaleYFactor);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 先计算缩放后的实际宽高
        float scaledWidth = getWidth() * getScaleX();
        float scaledHeight = getHeight() * getScaleY();
        // 基于中心坐标计算四个边界,保证缩放以中心为原点
        float left = getCenterX() - scaledWidth / 2 ;
        float top = getCenterY() - scaledHeight / 2;
        float right = left + scaledWidth;
        float bottom = top + scaledHeight;
        
        // 这里补充绘制矩形的代码,比如:
        // canvas.drawRect(left, top, right, bottom, yourPaintObject);
    }
}

方式二:直接设置目标尺寸的scale方法

如果你的需求是直接指定缩放后的目标宽高,而不是基于比例计算,那scale方法可以这样写:

public void scale(float targetWidth, float targetHeight) {
    // 计算相对于原始尺寸的缩放比例
    float scaleX = targetWidth / getWidth();
    float scaleY = targetHeight / getHeight();
    setScaleX(scaleX);
    setScaleY(scaleY);
    // 若父类允许直接设置宽高,也可以直接调用:
    // setWidth(targetWidth);
    // setHeight(targetHeight);
}

补充说明

你现有onDraw方法里的left计算思路是完全正确的——基于中心坐标偏移缩放后宽高的一半,能保证缩放操作以矩形中心为原点,不会出现偏移问题。只需要把top的计算补全,再推导right和bottom的坐标,就能正确绘制缩放后的矩形了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:31:05