0
我想要使用BitmapShader在畫布上繪製。我有兩個尺寸相同的圖像(一個用於阿爾法通道,另一個用於RGB),我想在用相同尺寸創建的畫布上繪製。問題是,它看起來好像canvas.drawBitmap用戶絕對座標爲油漆。有沒有一種方法可以繪製相對座標。當使用canvas.drawBitmap時使用相對座標應用BitmapShader
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的視圖中使用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與相同的paint將使用相對座標。所以用下面的替代方法抽籤將正確渲染上繪製的RGB圖像(而非掩模)
@Override
public void draw(Canvas canvas) {
// getBounds returns the relative coordinates as well
canvas.drawRect(getBounds, mPaint);
}
disableHwAcceleration不是一種方法。這可以通過代碼'View.setLayerType(LAYER_TYPE_SOFTWARE,null);' – Jona 2016-12-14 21:18:55