programacion - Android: cambia el color de forma en tiempo de ejecución
manual de programacion android pdf (8)
Ahora estoy creando un Drawable como el precompilador ... ya que no pude cambiar el color a nada que no sea negro, incluso después de probar el hexágono O que se describe a continuación.
El nuevo código:
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);
De todos modos, esto es una solución ... ¡una solución para la primera pregunta es lo que realmente estoy buscando! Apreciaré cualquier ayuda, por supuesto!
Tengo un dibujable que uso como fondo para un LinearLayout. Me gustaría cambiar el color de esta forma en tiempo de ejecución. He intentado usar varios métodos ... pero ninguno funciona.
He seguido el enfoque descrito aquí: http://www.anddev.org/android-2d-3d-graphics-opengl-problems-f55/change-shape-drawable-solid-color-t16798.html
Pero tienen el mismo problema ... no falla ... ¡pero el color no cambia!
<?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>
Fragmento de código:
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();
¿Cualquier pista? He pasado todo el día buscando en Google ... y se está poniendo bastante molesto ...
ACTUALIZAR:
Cuando trato de hacer lo mismo con esta forma:
<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>
El color se vuelve negro ... lo que supongo dice que se puede cambiar ...
Esto es lo que estoy haciendo en un fondo de pantalla en vivo donde modifico un Drawable en tiempo de ejecución:
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());
Editar: Declaraciones de tipo:
public Bitmap originalBitmap;
public BitmapDrawable original;
public BitmapDrawable copy;
public Canvas copyCanvas;
Editar 2:
Pruebe esto en ese caso:
int color = (0xFF000000 | yourParsedColor)
Luego establece ese color.
Hay una manera más fácil:
ShapeDrawable drawable = new ShapeDrawable();
drawable.getPaint().setColor(getResources().getColor(R.color.blue));
getActionBar().setBackgroundDrawable(drawable);
Mi solución actual implica tener un drawable sin la opción de color. Lo puse dentro de un diseño de marco y luego establecí dinámicamente el color de fondo del objeto de diseño de marco. Todavía es técnicamente una ''solución'', pero es la opción más simple en mi opinión.
Archivo de diseño:
<FrameLayout
android:id="@+id/dateLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/SecondaryGreen">
<ImageView
android:id="@+id/dateBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/date_rectangle" />
</FrameLayout>
Fecha del archivo extraíble del rectángulo:
<shape xmlns:android="http://schemas.android.com/apk/res/android" ><size android:width="50dp" android:height="50dp"/><corners android:radius="5dp"/></shape>
Representación dinámica:
mHolder.dateLayout.setBackgroundColor(getResources().getColor(R.color.SecondaryGreen));
Vea si algo similar a esto funciona para usted:
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();
En mi caso, tengo un TextView que tiene un ShapeDrawable como fondo. Quería cambiar su color y logré que esto funcionara. Inexplicablemente, tv2.getBackground () devuelve un GradientDrawable en lugar de un ShapeDrawable; esto también se ha informado en otros lugares.
Editar: Acerca del color, intente configurar un valor alfa de 0xff. Si observas, incluso en mi código anterior, la función setColor () toma un valor hexadecimal adicional aparte del valor hexadecimal RGB regular. Esto es para Alpha / Opacity. Si se establece en 0x00, el Drawable tendrá un color negro, independientemente del RGB (suponiendo que el color de fondo sea negro). 0x00 es un objeto completamente transparente y 0xff es un objeto completamente opaco.
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>
Cambiar el color en el código
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);
Establecer el color de la forma GradientDrawable usando el código / valor hexadecimal
Simplemente prefija 0x al valor de color hexadecimal.
GradientDrawable shape = new GradientDrawable();
shape.setCornerRadius( 16 );
shape.setColor(0xff33b5e5);
ButtonStartSurvey.setBackground(shape);
GradientDrawable background = (GradientDrawable) titleTextView.getBackground();
background.setColor(getResources().getColor(R.color.some_color));
El método setColor solicita correctamente un redibujado en el elemento (si en xml usaste el elemento <shape> siempre se convertirá en un GradientDrawable)