1

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

1 回答 1

0

看来这是一个硬件加速问题。在视图上禁用硬件加速会将着色器移回相对坐标。

if (android.os.Build.VERSION.SDK_INT >= 11) {
    myView.disableHwAcceleration();
}
于 2013-04-10T03:42:24.003 回答