使用canvas.drawBitmap时使用相对坐标应用BitmapShader

时间:2013-04-08 22:25:13

标签: android graphics

我正在尝试使用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);
}

1 个答案:

答案 0 :(得分:0)

这似乎是硬件加速问题。禁用视图上的硬件加速会将着色器移回相对坐标。

if (android.os.Build.VERSION.SDK_INT >= 11) {
    myView.disableHwAcceleration();
}