2015-10-28 11 views
8

私のアプリでは、ビットマップとdrawCircle()メソッドを使用して円を描く必要があります。Android 6.0でdrawCircleメソッドが正しく処理されない

Android 6.0まではすべて正常に動作していました。

それでも、すべての以前のバージョンでは円を描いていますが、6.0でアプリケーションを使用すると四角形が描かれます。しかし私はそれを塗りつぶすように変更すると、api 22とapi 23の両方に円が描かれます。 誰もが同じ問題を抱えているのですか?

ここにソースコードとスクリーンショットがあります(左側のAPI 23と右側のAPI 22で動作しているアプリ)。 same app on different api's

public final class Circle1View extends View { 

    private float xCenter, yCenter; 
    private Bitmap grid = null; 

    public Circle1View (Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     int w = getWidth(); 
     int h = getHeight(); 
     xCenter = w/2; 
     yCenter = h/2; 

     drawBitmaps(w, h); 

     canvas.translate(xCenter, yCenter); 
     canvas.scale(xCenter, yCenter); 

     canvas.drawBitmap(grid, null, new RectF(-1, -1, 1, 1), null); 
    } 


    private void drawBitmaps(int w, int h) { 

     grid = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(); 

     canvas.translate(xCenter, yCenter); 
     canvas.scale(xCenter, yCenter); 

     Paint gridPaint = new Paint(); 

     gridPaint.setStrokeWidth(0.01f); 
     // Works with FILL 
     // gridPaint.setStyle(Paint.Style.FILL); 
     gridPaint.setStyle(Paint.Style.STROKE); 

     canvas.setBitmap(grid); 

     canvas.drawCircle(0, 0, 0.5f, gridPaint); 


    } 
} 
+0

私はあなたがサークルを描く方法をリファクタリングしようとします。あなたは何を描かなければならないか説明できますか?例えば、半径を中心とする円は、幅の半分に等しい。 –

答えて

1

私はそれがスケーリングと翻訳とは関係があると思います。描かれた円が非常に小さいと想像してください、それは4ピクセルしかかかりません。これをフルサイズに拡大すると、これらのピクセルの間に4本の直線が残ります。

ストロークの幅を0.04fに変更すると、問題はなくなりました。私はあなたが直接供給Canvasに描画することで、あなたのコードを簡素化することをお勧め:APIレベルの差についてのご質問については

@Override 
protected void onDraw(Canvas canvas) { 
    int w = getWidth(); 
    int h = getHeight(); 
    xCenter = w/2; 
    yCenter = h/2; 

    Paint gridPaint = new Paint(); 

    gridPaint.setStrokeWidth(1f); 
    gridPaint.setStyle(Paint.Style.STROKE); 

    canvas.drawCircle(xCenter, yCenter, w/4, gridPaint); 
} 

を:マシュマロがdrawBitmap()のための変更を導入しました。 LollipopMarshmallowのそれぞれのソースコードを見ることができます。

+0

これは私の最初の考えでした。しかし、それはapi <23で働いています。 –

+1

私はAndroidのソースコードを見ました。 'drawBitmap'のコードには大きな変更があります。私は詳細を見ていないが、それが理由であれば驚かないだろう。私は私の答えにリンクを追加します。 – Thomas

+0

ニース。私はキャンバスに直接描画することが最良の選択であることに同意します。 –

関連する問題