Fresco имеет встроенную поддержку круглых изображений и закругленных углов, но как насчет других форм, таких как ромб или параллелограмм и т. д.?
Это просто сделать со стандартным ImageView с помощью пользовательского рисования, использующего BitmapShader. Например, следующий пользовательский Drawable получает растровое изображение изображения и высоту наклона, чтобы сделать ImageView похожим на это изображение:
public class MaskDrawable extends Drawable {
private Paint mPaint;
private Path mPath;
private int mSlopeHeight;
public MaskDrawable(Bitmap bitmap, int slopeHeight) {
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setShader(shader);
mSlopeHeight = slopeHeight;
mPath = new Path();
}
@Override
public void draw(Canvas canvas) {
Rect bounds = getBounds();
mPath.moveTo(0, 0);
mPath.lineTo(0, bounds.bottom);
mPath.lineTo(bounds.right, bounds.bottom - mSlopeHeight);
mPath.lineTo(bounds.right, 0);
canvas.drawPath(mPath, mPaint);
}
Чтобы сделать это с помощью Fresco, мне нужно растровое изображение изображения, но я не знаю, как это сделать. Я читал, что я могу получить растровое изображение непосредственно из ImagePipeline, но с ним связано много ошибок. В одном случае возвращенное растровое изображение недолговечно и не должно использоваться для рисования на экране, где в другом случае я получаю CloseableReference, который мне нужно освободить в какой-то момент, который мне не ясен. То, что я видел в сети до сих пор, это код, похожий на этот для получения растрового изображения:
ImagePipeline imagePipeline = Fresco.getImagePipeline();
ImageRequest imageRequest = ImageRequestBuilder
.newBuilderWithSource(uri)
.setRequestPriority(Priority.HIGH)
.setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)
.build();
DataSource<CloseableReference<CloseableBitmap>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, getContext());
DataSubscriber<CloseableReference<CloseableBitmap>> dataSubscriber =
new BaseDataSubscriber<CloseableReference<CloseableBitmap>>() {
@Override
protected void onNewResultImpl(DataSource<CloseableReference<CloseableBitmap>> dataSource) {
mBitmapRef = dataSource.getResult();
// Get the bitmap here and use it in my custom drawable?
}
@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableBitmap>> dataSource) {
}
};
dataSource.subscribe(dataSubscriber, UiThreadImmediateExecutorService.getInstance());
Я еще не пробовал, и мне было интересно, может ли кто-нибудь предоставить рабочее решение вместо битов и байтов, которые я собрал до сих пор из разных мест. Это должно быть сделано правильно, иначе я могу легко потерять память, что бьет по самой идее использования Fresco с самого начала.