Я пытаюсь использовать BitmapShader для рисования на холсте. У меня есть 2 изображения одинаковых размеров (один для канала альфа и один для RGB), который я хочу рисовать на холсте, который был создан с тем же размером. Проблема в том, что кажется, что canvas.drawBitmap пользователи абсолютных координат для краски. есть способ рисовать с относительными координатами.Применение BitmapShader с использованием относительных координат при использовании 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);
}
}
Возможно, я не могу получить абсолютные координаты drawable на экране. Я знаю, что я могу использовать getLocationOnScreen/InWindow из представления, которое содержит drawable, но не учитывает анимацию.
Я попытался применить относительные координаты, применив перевод на шейдере в 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 с той же краской будет использовать относительные координаты. поэтому замена метода рисования со следующим будет сделать изображение RGB на Drawable правильно (но не маска)
@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