web-dev-qa-db-ja.com

Android:実行時に図形の色を変更する

LinearLayoutの背景として使用するドロウアブルがあります。実行時にこのShapeの色を変更したいと思います。いくつかの方法を試してみましたが、うまくいきません。

ここで説明するアプローチに従いました: http://www.anddev.org/Android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html

しかし、同じ問題があります...それはクラッシュしません..しかし、色は変わりません!

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <solid Android:color="#00A6C1" />
    <corners Android:radius="@dimen/square_corners" />
</shape>

コードのスニペット:

GradientDrawable drawable = (GradientDrawable) activity.getResources().getDrawable(R.drawable.blue_square_shape);


int color = ((Application) getApplication()).getColor();
drawable.setColor(color);

block.findViewById(R.id.blockSquare).setBackgroundDrawable(drawable);

findViewById(R.id.blockSquare).postInvalidate();

どんな手掛かり?私は丸一日グーグルを通過しました...そしてそれはかなり迷惑になっています...

UPDATE:

このShapeに同じことをしようとすると:

<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/shape" Android:shape="rectangle">
    <gradient Android:startColor="#1FBCCF" Android:endColor="#06A4C1"
        Android:angle="270" />
    <corners Android:topLeftRadius="@dimen/footer_corners"
        Android:topRightRadius="@dimen/footer_corners" />
</shape>

色が黒に変わります...変更できると私が推測することは...

50
neteinstein

私は今、1つのプリコンパイラのようなDrawableを作成しています。以下に説明する16進ORを試した後でも、色を黒以外に変更できなかったためです。

新しいコード:

ShapeDrawable footerBackground = new ShapeDrawable();

// The corners are ordered top-left, top-right, bottom-right,
// bottom-left. For each corner, the array contains 2 values, [X_radius,
// Y_radius]
float[] radii = new float[8];
radii[0] = activity.getResources().getDimension(R.dimen.footer_corners);
radii[1] = activity.getResources().getDimension(R.dimen.footer_corners);

radii[2] = activity.getResources().getDimension(R.dimen.footer_corners);
radii[3] = activity.getResources().getDimension(R.dimen.footer_corners);

footerBackground.setShape(new RoundRectShape(radii, null, null));

int color = ((Application) activity.getApplication()).getColor();

footerBackground.getPaint().setColor(color);

views.setBackgroundDrawable(footerBackground);

とにかくこれは修正です。最初の質問に対する解決策は、私が本当に探しているものです!もちろんどんな助けでも感謝します!

41
neteinstein

これに似た何かがあなたのために働くかどうかを確認してください:

TextView tv2 = (TextView) rl.findViewById(R.id.toggle_indicator);
/* Refer to http://developer.Android.com/reference/Android/graphics/drawable/GradientDrawable.html#mutate()
to understand why we need to mutate the GradientDrawable*/
GradientDrawable sd = (GradientDrawable) tv2.getBackground().mutate();
sd.setColor(0xff999999);
sd.invalidateSelf();

私の場合、ShapeDrawableを背景として持つTextViewがあります。色を変えたいと思い、なんとかこの作品を作りました。不可解なことに、tv2.getBackground()はShapeDrawableではなくGradientDrawableを返します-これは他の場所でも報告されています。

編集:色については、アルファ値0xffを設定してみてください。上記の私のコードでも、setColor()関数は通常のRGB 16進数値とは別に余分な16進数値を取ります。これはアルファ/不透明度用です。これを0x00に設定すると、RGBに関係なく、Drawableの色は黒になります(背景色が黒であると仮定)。 0x00は完全に透明なオブジェクトであり、0xffは完全に不透明なオブジェクトです。

34
Saurabh Nanda
GradientDrawable background = (GradientDrawable) titleTextView.getBackground();
background.setColor(getResources().getColor(R.color.some_color));

SetColorメソッドは、要素の再描画を正しく要求します(xmlで<shape>要素を使用した場合、常にGradientDrawableになります)

29
James

R.drawable.library_cirecle

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item Android:id="@+id/outerRectangle">
    <shape Android:shape="oval" >
        <solid Android:color="#FCD366" />

        <stroke
            Android:width="1dp"
            Android:color="@Android:color/darker_gray" />
    </shape>
</item>

コードの色を変更する

Drawable tempDrawable = getResources().getDrawable(R.drawable.library_cirecle);
LayerDrawable bubble = (LayerDrawable) tempDrawable; (cast to root element in xml)
GradientDrawable solidColor = (GradientDrawable) bubble.findDrawableByLayerId(R.id.outerRectangle);
solidColor.setColor(colorToPaint);
imageView.setImageDrawable(tempDrawable);
8

より簡単な方法があります:

ShapeDrawable drawable = new ShapeDrawable();
drawable.getPaint().setColor(getResources().getColor(R.color.blue));
getActionBar().setBackgroundDrawable(drawable);
5
kospol

これは、実行時にDrawableを変更するライブ壁紙で行っていることです。

this.original = DrawableFactory.getDrawable(getContext().getResources(), objectName)[0];
originalBitmap = original.getBitmap();
copy = new BitmapDrawable(getContext().getResources(), original.getBitmap().copy(Bitmap.Config.ARGB_8888, true));
copyCanvas = new Canvas(copy.getBitmap());

編集:型宣言:

public Bitmap originalBitmap;
public BitmapDrawable original;
public BitmapDrawable copy;
public Canvas copyCanvas;

編集2:

その場合はこれを試してください:

int color = (0xFF000000 | yourParsedColor)

次に、その色を設定します。

1
Kaj