0

ImageView で丸い円 (円の輪郭以外は透明) を塗りつぶそうとしています。

コードが機能しています:

public void setPercentage(int p) {
    if (this.percentage != p ) {
   this.percentage = p;
    this.invalidate();
   }
}
@Override public void onDraw(Canvas canvas) {
 Canvas tempCanvas;
        Paint paint;    
        Bitmap bmCircle = null;
        if (this.getWidth() == 0 || this.getHeight() == 0 ) 
            return ; // nothing to do
        mergedLayersBitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(), Bitmap.Config.ARGB_8888); 

        tempCanvas = new Canvas(mergedLayersBitmap);
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setFilterBitmap(false);



        bmCircle = drawCircle(this.getWidth(), this.getHeight());

        tempCanvas.drawBitmap(bmCircle, 0, 0, paint);


        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        tempCanvas.clipRect(0,0, this.getWidth(), (int) FloatMath.floor(this.getHeight() - this.getHeight() * ( percentage/100)));
        tempCanvas.drawColor(0xFF660000, PorterDuff.Mode.CLEAR);  

        canvas.drawBitmap(mergedLayersBitmap, null, new RectF(0,0, this.getWidth(), this.getHeight()), new Paint());
        canvas.drawBitmap(mergedLayersBitmap, 0, 0, new Paint());

    }
  static Bitmap drawCircle(int w, int h) {
        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bm);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(drawColor);    
        c.drawOval(new RectF(0, 0, w, h), p);
        return bm;

    }

それは一種の作品です。ただし、問題が 2 つあります。すぐにメモリが不足し、GC が狂ってしまいます。この操作に最小限のメモリを使用するにはどうすればよいですか?

onDraw でオブジェクトをインスタンス化するべきではないことはわかっていますが、どこに描画すればよいかわかりません。ありがとうございました。

4

2 に答える 2

2

pseudo は次のようになります。

    for each pixel inside CircleBitmap {

        if (pixel.y is < Yboundary && pixelIsInCircle(pixel.x, pixel.y)) {
           CircleBitmap .setPixel(x, y, Color.rgb(45, 127, 0));
        }
    }

それは遅いかもしれませんが、うまくいきます。円が小さいほど速くなります。

基本、ビットマップの幅と高さ、たとえば256x256、円の半径を知っているだけで、物事を簡単にするために円の中心を128,128にします。次に、ピクセルごとに移動しながら、ピクセル X と Y をチェックして、円の内側にあり、Y 制限線の下にあるかどうかを確認します。

次に使用します:

    CircleBitmap .setPixel(x, y, Color.rgb(45, 127, 0));

編集:物事をスピードアップするために、Y制限を超えるピクセルを見ても気にしないでください。

于 2012-08-12T00:15:20.607 に答える
2

別の解決策(おそらくよりクリーン)を見たい場合は、このリンクを見て、下から上に徐々に円を塗りつぶしてください

于 2014-07-23T05:07:48.283 に答える