我正在尝试使用BitmapShader在Canvas上绘图。我有两个相同尺寸的图像(一个用于alfa通道,一个用于RGB),我想在相同尺寸的画布上绘制。问题是看起来好像canvas.drawBitmap是paint的绝对坐标。有没有办法用相对坐标绘制。
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);
}
}
我似乎无法在屏幕上获得drawable的绝对坐标。我知道我可以从保存drawable但不考虑动画的视图中使用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);
}
答案 0 :(得分:0)
这似乎是硬件加速问题。禁用视图上的硬件加速会将着色器移回相对坐标。
if (android.os.Build.VERSION.SDK_INT >= 11) {
myView.disableHwAcceleration();
}