矩形类中缩放时如何计算宽高?求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
相关产品推荐
相关产品推荐

