7

最近、ImageView から拡張して、色付きの境界線で画像を円形にする CircularImageView クラスを作成しました。これは、渡されたキャンバスに描画することにより、 onDraw(canvas) メソッドを介して行われます。

//load the bitmap
    loadBitmap();

    // init shader
    if(image !=null)
    {   
        shader = new BitmapShader(Bitmap.createScaledBitmap(image, viewWidth + (borderWidth * 2), viewHeight + (borderWidth * 2), true), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(shader);

        int circleCenter = viewWidth / 2;

        // circleCenter is the x or y of the view's center
        // radius is the radius in pixels of the cirle to be drawn
        // paint contains the shader that will texture the shape
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth, paintBorder);
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paintBackground);
        canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter, paint);
    }   

したがって、このビットは、ドローアブルまたはビットマップを介して画像を設定するときに機能します。また、拡張したので、Google の Volley NetworkImageView でも使用できます。

ボレーの代替として見ているので、Picasso画像ダウンロードライブラリと一緒にCircularImageViewクラスを試してみると、私の問題が発生します。BitmapDrawable を取得するときに、最初の行の loadBitmap() 関数で ClassCastException が発生します。

private void loadBitmap()
{
    BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();

    if(bitmapDrawable != null)
        image = bitmapDrawable.getBitmap();
}

ピカソが画像をダウンロードする前に、最初にプレースホルダー画像を丸めます。しかし、画像が Picasso によってダウンロードされるとすぐに、getDrawable() が BitmapDrawable ではなく PicassoDrawable を返し、ClassCastException で失敗します。

Picasso で ImageView を設定するたびにプロセスを実行するのではなく、CircularImageView クラスの onDraw(canvas) メソッドで画像を丸める作業を維持したいと思います。これは可能ですか?

前もって感謝します。

4

2 に答える 2

14

Picasso を使用した円形の画像の場合は、Transformation を実装するこのクラスを使用します。

Picasso.with(context).load(url).transform(new RoundedTransformation(radius, margin)).into(imageview);
于 2013-11-20T17:01:50.133 に答える
5

Picasso でこれを行う場合は、次のいずれかを行う必要があります。

  1. 丸めを として適用して、丸められたTransformationビットマップがメモリにキャッシュされるようにするか、または
  2. ImageViewカスタムサブクラスのシェーダーでキャンバスをクランプします。このテクニックの詳細は、怒り狂う Romain Guyのブログで概説されています。

基になるものを から引き出そうとするBitmapImageViewはアンチパターンです。へのアクセスが必要な場合(そうでない場合は、上記のいずれかを使用する必要があります)、コールバックがそれを提供するビューBitmapに実装します。TargetonBitmapSuccess

于 2013-10-23T01:15:39.653 に答える