web-dev-qa-db-ja.com

Androidに境界線(コーナー半径)を使用して、プログラムで楕円形を描画する

白とグレーの境界線で塗りつぶされたOvalShapeを使用して、カスタムShapeDrawableを描画しようとしています。このようなドローアブルを作成しました:

ShapeDrawable drawable = new ShapeDrawable(new OvalShape());
drawable.getPaint().setColor(Color.GRAY);
drawable.getPaint().setStyle(Style.STROKE);
drawable.getPaint().setStrokeWidth(getPixels(5));
drawable.getPaint().setAntiAlias(true);

しかし、その結果は: corners problem

enter image description here

このアイデアは、このような形状を異なる色で作成するためにプログラムで作成されています。

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:shape="oval">
<corners Android:radius="10dip"/>
<stroke Android:color="#FF0000" Android:width="5dip"/>
<solid Android:color="@Android:color/transparent"/>
</shape>

どうすればこれを修正できますか?

29
L3K0V

これは新しいソリューションです。

 RoundedBitmapDrawable RBD = RoundedBitmapDrawableFactory.create(mContext.getResources(),YourBitmap);
            RBD.setCornerRadius(20);
            RBD.setAntiAlias(true);

            wholeRel.setBackground(RBD);
1
babak

新しいドローアブルの作成を回避する方法を見つけました!

次のように、Android XMLからの境界線を持つ円を定義しました:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" 
Android:shape="oval">
<corners Android:radius="10dip"/>
<stroke Android:color="#FF0000" Android:width="5dip"/>
<solid Android:color="@Android:color/transparent"/>
</shape>

次に、描画可能な色を変更したい場合は、ColorFilterを適用します。たとえば、ドロアブルの赤い色を青に変更したい場合、これを行います:

Drawable drawable = context.getResources().getDrawable(R.drawable.name);
drawable.setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_ATOP);

StateListDrawableを使用してコードからカスタムセレクターを作成する場合、StateListDrawablesはドロアブルフィルターに適用されます... selector.setColorFilter...によってセレクター全体にフィルターを適用して問題を修正します。

45
L3K0V