1

アプリケーションでボタンを表示し、テキストを編集する 2 つの方法を使用しています。

結果はまったく同じになると思いますが、そうではありません。それぞれのストロークの小さな違いを以下に示します。

ここに画像の説明を入力

どちらも、ストローク幅が 2 dp、角の半径が 8 dp の丸い長方形です。それぞれのコードは次のとおりです。

左、背景として使用される描画可能な形状:

<?xml version="1.0" encoding="UTF-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/transparent"/>
    <corners android:radius="@dimen/button_cornersRadius"/>
    <stroke
        android:width="@dimen/button_strokeWidth"
        android:color="@color/blue_light"/>
</shape>

右、カスタム ビューの onDraw メソッド:

protected void onDraw(Canvas canvas) {
canvas.drawPath(drawingPath,strokePaint);
canvas.drawText(text,demiWidth,textHeight,textPaint);
}

ウィズ:

    strokePaint     = new Paint(Paint.ANTI_ALIAS_FLAG);
    strokePaint     .setStyle(Paint.Style.STROKE);
    strokePaint     .setStrokeWidth((int)(2*densityObtainedWithDisplayMetrics)));
    strokePaint     .setColor(the exact same as above);

そして、おそらく同等の方法でグラデーションを表示すると、小さな違いが見られます。シェイプ ドローアブルの表示がより良くなり、色がより良く見え、線がぼやけません。

誰かが理由/回避方法を説明してもらえますか? 片方だけ使うなら2番ですが、見た目がすっきりしないので使いたくないです。助けてくれてありがとう!

編集 :

驚くべきことに、この違いは、カスタム レイアウトのストローク幅が奇数の場合にのみ発生します。値が偶数の場合、表示はまったく同じです。

4

1 に答える 1

2

GradientDrawable(XML タグから実際に作成されたオブジェクト)のソースを調べて、作成さ<shape>れた特定の形状に対してフレームワークによって配置された描画呼び出しを確認することをお勧めします。

GradientDrawable.java

inflate()XML がどのようにオブジェクトに解析されるかをメソッドで確認できます。次に、draw()関連するすべてのCanvasコードがメソッドに含まれています。

編集: 一目でわかる唯一の大きな違いは、フレームワークが単一の半径値が提供されるcanvas.drawRoundedRect()代わりに使用することです。canvas.drawPath()あなたの場合、塗りつぶしは透明ですが、塗りつぶしと線の両方に対してもそれを行います。他にも違いがあるかもしれませんが、すべてのコードを詳しく追跡したわけではありません。

于 2012-07-13T18:04:48.027 に答える