2012-08-09 9 views
6

角を丸くして画像を描画するために使用するImageViewサブクラスがあります。コードはthis answerに基づいており、以下の通りである:このコードで角が丸いImageViewを描画するときの効率

public class ImageViewRoundedCorners extends ImageView { 
    ... 
    @Override 
    protected void onDraw(Canvas canvas) { 
     Bitmap scaledBitmap = Bitmap.createBitmap(getMeasuredWidth(), 
                getMeasuredHeight(), 
                Bitmap.Config.ARGB_8888); 
     Canvas scaledCanvas = new Canvas(scaledBitmap); 
     super.onDraw(scaledCanvas); 
     drawRoundedCornerBitmap(canvas, scaledBitmap, 
           getMeasuredWidth(), getMeasuredHeight()); 

     scaledBitmap.recycle(); 
    } 

    protected void drawRoundedCornerBitmap(Canvas outputCanvas, Bitmap input, int w, int h) { 
     Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888); 
     Canvas canvas = new Canvas(output); 

     mPaint.reset(); 
     mPaint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 

     mPaint.setStyle(Paint.Style.FILL); 
     canvas.drawPath(mClipPath, mPaint); 

     mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
     canvas.drawBitmap(input, 0, 0, mPaint); 

     outputCanvas.drawBitmap(output, 0, 0, null); 
    } 
} 

を、画像が適切に丸い角で描かれています。 drawRoundedCornerBitmapの最初の2行の割り当てを避けるために、私はoutputCanvasに直接描画します。これは最初にonDrawに渡されたキャンバスです。新しい実装は次のようになります。何らかの理由で

protected void drawRoundedCornerBitmap(...) { 
    mPaint.reset(); 
    mPaint.setAntiAlias(true); 
    outputCanvas.drawARGB(0, 0, 0, 0); 

    mPaint.setStyle(Paint.Style.FILL); 
    outputCanvas.drawPath(mClipPath, mPaint); 

    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 
    outputCanvas.drawBitmap(input, 0, 0, mPaint); 
} 

は、このコードは、ポーター・ダフモードを無視しているようだ、とだけではなく、通常の(非丸みを帯びた)角を持つ画像を描画します。これはなぜですか?元のコードを動作させる中間に描画することはどうですか?Bitmap

+0

私も同じ問題があります。 –

+0

私は同じことをしようとしています:( –

答えて

0

ドロアイ・ガイが作成したドロアブルを作成します。私たちはリンク工場ではありませんが、彼のブログ記事は非常に幅広く説明しており、効率的な方法を提供しています。 Rounded Corners

本当の基本的な原理は、BitmapShaderを作成し、カスタムDrawableであなただけのImageViewDrawableことを適用し、そのように描くPaintオブジェクトにアタッチしています。

ドロアブルを使用すると、イメージはキャンバスに一度しか描画されません。イメージを描画するのは1回だけです。その場合、ImageViewはすべて描画可能にスケーリングします。

+0

imageViewでdrawableを拡大/縮小しなければならないときは、このような痛みはありませんか?drawableが作成されてから伸ばされたり、つまり、あなたのコーナーが奇妙に見えることを意味しますか? – secureboot

+0

'ImageView'は、あなたが渡したものを' Drawable'に変えてサイズを与え、 'Drawable'を' draw() 'します。あなたはBitmapDrawableを持っていました。それはもちろん、それを伸ばすだけです。あなたはRoundedBitmapDrawableを渡すので、それはその実装に基づいて描画されます。 –

関連する問題