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:
La manera sucia:
- Crea una
Paint
con unColorMatrixColorFilter
adecuado, con el fin de responder a esto, estoy desaturando, tendrás que descubrir tu matriz 5x4 paraColorMatrix
para obtener el cyan que buscas. También necesitará algunosRect
para definir el origen y el destino cuando dibuje a continuación. - Crea un
Bitmap
y unCanvas
fuera de la pantalla queonSizeChanged
para dibujar tu lista, eso está hecho enonSizeChanged
para que tengamos los valores correctos de diseño de vista, aquí puedes comenzar a notar la suciedad ya que tendrás que asignar unBitmap
tan grande como tuListView
puede obtenerOutOfMemoryException
. - Anule el
draw
para usar suCanvas
fuera de pantalla y permita queListView
dibuje, luego puede dibujar elBitmap
deBitmap
en elCanvas
que dibujará su lista como de costumbre, luego dibuje solo la parte de eseBitmap
deBitmap
que se dibujará de manera diferente usando laPaint
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);
}