studio shimmer from custom activity java android listview colors overlay

java - from - shimmer android



¿Cómo superponer el color del texto del elemento de la lista en una región específica? (2)

Como puede ver en su implementación, usan y actualizan una posición fija en su ListAdapter por lo que actualizan la View que coincide en consecuencia, que es para mí la forma más sencilla y sencilla de hacerlo, pero no obtiene la mitad texto en color, que creo que todavía quieres :)

Así que esta es probablemente una de las peores respuestas que he dado, disculpe, probablemente vuelva a visitar esto o espero que alguien pueda indicarle una mejor solución.

Puedes ver una demo borrosa en:

http://telly.com/Y98DS5

La manera sucia:

  • Crea una Paint con un ColorMatrixColorFilter adecuado, con el fin de responder a esto, estoy desaturando, tendrás que descubrir tu matriz 5x4 para ColorMatrix para obtener el cyan que buscas. También necesitará algunos Rect para definir el origen y el destino cuando dibuje a continuación.
  • Crea un Bitmap y un Canvas fuera de la pantalla que onSizeChanged para dibujar tu lista, eso está hecho en onSizeChanged para que tengamos los valores correctos de diseño de vista, aquí puedes comenzar a notar la suciedad ya que tendrás que asignar un Bitmap tan grande como tu ListView puede obtener OutOfMemoryException .
  • Anule el draw para usar su Canvas fuera de pantalla y permita que ListView dibuje, luego puede dibujar el Bitmap de Bitmap en el Canvas que dibujará su lista como de costumbre, luego dibuje solo la parte de ese Bitmap de Bitmap que se dibujará de manera diferente usando la Paint que definido anteriormente, obtendrá sobregiro para esos píxeles.
  • Finalmente dibuje su Bitmap vidrio prefabricado, recomendaría un parche n (parche 9) para que se escale y se vea bien a través de pantallas y densidades, luego obtendrá más sobregiro para esos píxeles.

Todo el pastel se ve así:

public class OverlayView extends ListView { private RectF mRect; private Rect mSrcRect; private Paint mPaint; private Canvas mCanvas; private Bitmap mBitmap; private float mY; private float mItemHeight; public OverlayView(Context context) { super(context); initOverlay(); } public OverlayView(Context context, AttributeSet attrs) { super(context, attrs); initOverlay(); } public OverlayView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initOverlay(); } private void initOverlay() { // DO NOT DO THIS use attrs final Resources res = getResources(); mY = res.getDimension(R.dimen.overlay_y); mItemHeight = res.getDimension(R.dimen.item_height); // mRect = new RectF(); mSrcRect = new Rect(); mPaint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); mPaint.setColorFilter( new ColorMatrixColorFilter(colorMatrix) ); } @Override public void draw(Canvas canvas) { super.draw(mCanvas); canvas.drawBitmap(mBitmap, 0, 0, null); canvas.drawBitmap(mBitmap, mSrcRect, mRect, mPaint); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mRect.set(0, mY, w, mY + mItemHeight); mRect.roundOut(mSrcRect); mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); } }

Entonces, dicho esto, espero que termines con una solución más limpia, incluso si no obtienes esa sexididad mitad :)

Supongamos que tenemos el ListView personalizado que extiende el método onDraw() dibujando algún rectángulo en él.

class Listpicker extends ListView { //..Some other methods here..// @Override protected void onDraw(android.graphics.Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint); } }

El mapa de bits dibujado representa un tipo de vidrio que es un rectángulo con ancho igual al ancho de la vista de lista y algo de altura. Lo que quiero es que cuando el elemento de la lista se desplaza dentro de este rectángulo, el color utilizado para dibujar el texto (no todos los elementos con fondo, etc.) cambie a otro color. Entonces, por ejemplo, cuando el elemento de la lista se ajusta para que solo la mitad del texto encaje en glassPickerBitmap , la parte exterior del elemento de la lista debe permanecer en sus colores ordinales, y la parte que está dentro de glassPickerBitmap debe cambiar su color del texto. Los elementos de la lista son simples TextViews sin ningún fondo.

¿Cómo se puede lograr esto? Tal vez cualquier ColorFilter s asignado a la Paint ? ¿Pero donde? onDraw() método onDraw() de Listview ni siquiera se llama cuando se desplaza ListView ... ¿Se puede hacer esto dentro de vistas personalizadas, por ejemplo, que serán los elementos de ListView ? O puede ser un Color / Shader / no sé qué otra superposición se puede utilizar aquí, pero ¿ dónde ?

EDITAR (ejemplos de imágenes añadidas):

Aquí hay un ejemplo de algún cultivo de la aplicación de la vida real. Hay 2 ListView s: uno en el lado izquierdo, otro en el derecho. El vidrio es el rectángulo gris. Ahora, la lista de la izquierda tiene la moneda "Dólar de los Estados Unidos" seleccionada. Y estoy desplazando a la derecha ListView de esa manera, esa selección está en algún lugar entre el USD y Afganistán afgano . Ahora, lo que quiero es que la divisa USD en el ListView izquierdo se ListView en rojo (el color exacto no importa ahora, lo cambiaré más tarde a algo significativo) Y, al mismo tiempo, la parte inferior de "Estados Unidos" Dólar " y parte superior de " Afgano afgano " en el ListView correcto se dibujaría también en el mismo color rojo.

Este cambio de color debe realizarse de forma dinámica: el color debe cambiarse solo para la parte del texto que está debajo del rectángulo de cristal durante el desplazamiento de la lista.

* OK, EUR y USD aquí son monedas especiales dibujadas con color cian no estándar. La pregunta es sobre al menos texto con color blanco . Pero si será posible cambiar también el color cian, sería genial.


Primero, mantenga un mapa de bits y lienzo de repuesto:

class Listpicker extends ListView { Bitmap bitmapForOnDraw = null; Canvas canvasForOnDraw = null;

Asegúrate de que sea del tamaño correcto:

@override protected void onSizeChanged (int w, int h, int oldw, int oldh) { if (bitmapForOnDraw != null) bitmapForOnDraw.recycle(); bitmapForOnDraw = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); canvasForOnDraw = new Canvas(bitmapForOnDraw); }

Y cuando lleguemos a dibujar la lista:

@override protected void onDraw(android.graphics.Canvas realCanvas) { // Put the list in place super.onDraw(realCanvas); // Now get the same again canvasForOnDraw.drawColor(0x00000000, PorterDuff.Mode.CLEAR); super.onDraw(canvasForOnDraw); // But now change the colour of the white text canvasForOnDraw.drawColor(0xffff00ff, PorterDuff.Mode.MULTIPLY); // Copy the different colour text into the right place canvas.drawBitmap(bitmapForOnDraw, glassRect, glassRect overwritePaint); // finally, put the box on. canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint); }