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
Paintcon unColorMatrixColorFilteradecuado, con el fin de responder a esto, estoy desaturando, tendrás que descubrir tu matriz 5x4 paraColorMatrixpara obtener el cyan que buscas. También necesitará algunosRectpara definir el origen y el destino cuando dibuje a continuación. - Crea un
Bitmapy unCanvasfuera de la pantalla queonSizeChangedpara dibujar tu lista, eso está hecho enonSizeChangedpara que tengamos los valores correctos de diseño de vista, aquí puedes comenzar a notar la suciedad ya que tendrás que asignar unBitmaptan grande como tuListViewpuede obtenerOutOfMemoryException. - Anule el
drawpara usar suCanvasfuera de pantalla y permita queListViewdibuje, luego puede dibujar elBitmapdeBitmapen elCanvasque dibujará su lista como de costumbre, luego dibuje solo la parte de eseBitmapdeBitmapque se dibujará de manera diferente usando laPaintque definido anteriormente, obtendrá sobregiro para esos píxeles. - Finalmente dibuje su
Bitmapvidrio 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);
}