如何用图片填充Android Canvas中的Rect?
用图片填充Canvas矩形的解决方案
当然可以实现用图片填充矩形的效果!在Android中,我们可以借助BitmapShader来完成这个需求——它能将图片转化为画笔的填充纹理,让你绘制的矩形被指定图片填满。下面是具体的实现步骤和修改后的代码:
核心思路
- 加载图片为Bitmap:先把你想要用来填充的图片转换成
Bitmap对象(比如从资源文件、本地文件等渠道加载) - 创建BitmapShader:用Bitmap生成Shader,并设置合适的平铺模式(控制图片超出矩形范围时的显示方式)
- 配置Paint:将Shader绑定到Paint上,这样Paint就具备了图片填充的能力
- 绘制矩形:使用配置好的Paint绘制矩形,就能得到图片填充的效果了
修改后的代码示例
MioCanvas类(核心修改部分)
public class MioCanvas extends View { Paint paint; Bitmap fillBitmap; public MioCanvas(Context context) { super(context); paint = new Paint(); // 从应用资源中加载图片,替换成你自己的图片资源ID(比如R.drawable.my_fill_image) fillBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.your_image); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (fillBitmap == null) return; // 创建BitmapShader,设置平铺模式 // 这里使用CLAMP模式:超出矩形范围的部分会拉伸图片边缘像素填充 BitmapShader shader = new BitmapShader(fillBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); paint.setShader(shader); // 绘制矩形(注意你之前的y坐标1999999超出了屏幕范围,这里调整为0以便看到效果) canvas.drawRect(0, 0, canvas.getWidth() / 2, canvas.getHeight() / 2, paint); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); // 回收Bitmap,避免内存泄漏 if (fillBitmap != null && !fillBitmap.isRecycled()) { fillBitmap.recycle(); } } }
关于平铺模式的说明
你可以根据需求选择不同的Shader.TileMode:
CLAMP:当图片尺寸小于矩形时,超出部分会拉伸图片的边缘像素来填充REPEAT:重复平铺图片,直到填满整个矩形MIRROR:以镜像翻转的方式重复平铺图片
MainActivity代码(无需修改)
你的MainActivity代码逻辑是正确的,可以保持原样:
public class MainActivity extends AppCompatActivity { MioCanvas mioCanvas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mioCanvas = new MioCanvas(this); mioCanvas.setBackgroundColor(Color.GREEN); setContentView(mioCanvas); } }
内容的提问来源于stack exchange,提问作者Francesco Comuzzi
相关产品推荐
相关产品推荐

