我正在尝试使用 BitmapShader 在画布上绘制。我有 2 张相同尺寸的图像(一张用于 alfa 通道,一张用于 RGB),我想在以相同尺寸创建的画布上进行绘制。问题在于,似乎 canvas.drawBitmap 用户绘制的绝对坐标。有没有办法用相对坐标绘制。
public class MaskedImageDrawable extends Drawable {
private final Bitmap mMask;
private final Paint mPaint = new Paint();
public MaskedImageDrawable(Bitmap mask, Bitmap image) {
mMask = mask;
Shader targetShader =
new BitmapShader(image, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(targetShader);
}
@Override
public void draw(Canvas canvas) {
canvas.drawBitmap(mMask, 0.0f, 0.0f, mPaint);
}
@Override
public int getOpacity() {
return PixelFormat.TRANSLUCENT;
}
@Override
public void setAlpha(int alpha) {
mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
mPaint.setColorFilter(cf);
}
}
我似乎无法在屏幕上获得可绘制对象的绝对坐标。我知道我可以从包含可绘制对象的视图中使用 getLocationOnScreen/InWindow 但不考虑动画。
我尝试通过在 onBoundsChange 中的着色器上应用平移来应用相对坐标,但这里的坐标似乎也是相对的。
Matrix mTranslationMatrix = new Matrix()
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
mTranslationMatrix.setTranslate(bounds.left, bounds.top);
mPaint.getShader().setLocalMatrix(mTranslationMatrix);
}
作为参考 - 似乎具有相同油漆的 drawRect 将使用相对坐标。所以用下面的方法替换draw方法将正确地在drawable上渲染RGB图像(但不是掩码)
@Override
public void draw(Canvas canvas) {
// getBounds returns the relative coordinates as well
canvas.drawRect(getBounds, mPaint);
}