Frescoには円形の画像と丸みのあるコーナーが組み込まれていますが、ダイヤモンドや平行四辺形などの他の形状はどうですか?Android Fresco:さまざまな種類の画像を描画する
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);
}
をフレスコで、私は画像のビットマップが必要であることを行うには:たとえば、次のカスタムDrawableのはImageViewのは、この写真のように見えるように画像のビットマップと斜面の高さを受け取りますしかし、私はそれをどうやって行うのか分からない。私は、ImagePipelineからBitmapを直接取得することができますが、それはそれに付随する多くの問題点です。あるケースでは、返されたBitmapは短期間であり、画面に描画するために使用すべきではありません。他のケースでは、私には明らかではないいくつかの点で解放する必要があるCloseableReferenceを取得します。私はまだ試していませんし、誰かが代わりにビットとバイトIの実用的なソリューションを提供できるかどうか迷った
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());
:私はネット上で見てきたことは、これまでのビットマップを取得するため、このようなコードですこれまでにさまざまな場所から集まってきました。それは正しく行われなければならない、そうでなければ、私は簡単にメモリをリークすることができます。
他の誰かがこの問題にぶつかる場合に備えて、具体的なソリューションの実装を行うように答えを更新しました。 –