Intereting Posts
Графический звуковой анализатор микрофона Как я могу настроить студию Android для добавления новой строки в конец файла? Как хранить файлы на эмуляторе? Android: режим звонка, измененный на тихий, не останавливает вибрацию телефона Как я могу получить имя пакета в android? Как я повторяю метод каждые 10 минут после нажатия кнопки и завершения ее на другой кнопке Когда фрагмент потерял фокус, а затем восстановил фокус, почему его метод onResume () никогда не вызывается в этот период? Лучший способ удалить ProgressDialog Как добавить логотип в экран согласия Google? Тестирование диалогов с помощью Robolectric Mediacodec желе-бобы Определенное значение XML для Android XML дает неожиданные результаты Показывать только одного ребенка расширяемого списка за раз ORMLite много для многих отношений Android Переход от бесплатного бесплатного выставления счетов в приложениях

Как наложить цвет текста элемента списка в определенном регионе?

Предположим, что у нас есть пользовательский ListView который расширяет onDraw() , рисуя в нем какой-то прямоугольник.

 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); } } 

Нарисованный растровый рисунок представляет собой нечто вроде стекла, прямоугольника с шириной, равной ширине списка и некоторой высоты. Я хочу, когда элемент списка прокручивает в этот прямоугольник цвет, используемый для рисования текста (не весь элемент с фоном и т. Д.), Будет изменен на другой цвет. Так, например, когда элемент списка подходит так, что только половина высоты текста вписывается в glassPickerBitmap , внешняя часть элемента списка должна оставаться в своих порядковых цветах, а часть, glassPickerBitmap внутри glassPickerBitmap должна менять свой цвет текста. Элементы списка – это простые текстовые элементы без какого-либо фона.

Как это можно достичь? Может быть, любой ColorFilter s назначен Paint ? Но где? onDraw() Listview даже не вызывается, когда прокручивается ListView … Может ли это выполняться внутри настраиваемых представлений, например, которые будут ListView ? Или может быть какой-то цвет / шейдер / не знаю, что еще можно использовать здесь, но где ?

EDIT (добавленные примеры изображений):

Вот пример некоторых уроков из реального приложения. Есть 2 ListView : один с левой стороны, другой справа. Стекло – это серый прямоугольник. Теперь в левом списке выбрана валюта «доллар США» . И я прокручиваю вправо ListView таким образом, что выбор находится где-то между USD и афганским афгани . Теперь, что я хочу, это то, что валюта USD в левом ListView будет рисоваться красным цветом (точный цвет не имеет значения сейчас, я изменю его позже на что-то значимое) И, в то же время, нижняя часть «Соединенные Штаты» Доллар » и верхняя часть « Афганского афгани » в правильном ListView будут также в том же красном цвете.

Это изменение цвета должно выполняться динамическим способом – цвет должен быть изменен только для части текста, которая находится под стеклянным прямоугольником во время прокрутки списка.

* OK, EUR и USD здесь используются специальные валюты с нестандартным голубым цветом. Вопрос касается, по крайней мере, текста с белым цветом. Но если можно будет изменить и голубой цвет, было бы здорово.

Пример списка

Solutions Collecting From Web of "Как наложить цвет текста элемента списка в определенном регионе?"

Как вы можете сказать в своей реализации, они используют и обновляют фиксированную позицию в своем ListAdapter поэтому они обновляют View который соответствует соответственно, что для меня самый простой и простой способ сделать это, но вы не получите половину половины Цветной текст, который, я думаю, вы все еще хотите 🙂


http://i.imgur.com/jHvuBcL.png

Итак, вот, наверное, один из худших ответов, которые я дал, извините, я, вероятно, вернусь к этому или надеюсь, что кто-то может указать вам на лучшее решение

Вы можете увидеть размытую демонстрацию по адресу:

http://telly.com/Y98DS5

Грязный путь:

  • Создайте Paint с правильным ColorMatrixColorFilter , для того, чтобы ответить на это, я просто обесцвечиваюсь, вам нужно выяснить свою матрицу ColorMatrix для ColorMatrix чтобы получить голубые изображения, которые вы ищете. Также вам понадобятся некоторые Rect s для определения источника и dest при рисовании ниже.
  • Создайте onSizeChanged экран Bitmap и Canvas который вы будете использовать для рисования вашего списка, что сделано в onSizeChanged поэтому у нас есть правильные значения макета представления, здесь вы можете начать замечать грязь, поскольку вам придется выделять Bitmap размером с ListView так, Вы можете получить OutOfMemoryException .
  • Переверните draw чтобы использовать свой экранный Canvas и пусть ListView к нему, тогда вы можете нарисовать Bitmap на данном Canvas который будет рисовать ваш список, как обычно, затем нарисуйте только часть этого Bitmap которое будет рисоваться по-другому, используя Paint мы Определенные ранее, вы получите overdraw для этих пикселей.
  • Наконец, нарисуйте готовое стеклянное Bitmap , я бы порекомендовал n-patch (9-patch), чтобы он масштабировался и выглядел резко по экранам и плотности, а затем вы получаете больше переутомления для этих пикселей.

Весь торт выглядит так:

 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); } } 

Так что, сказал, я надеюсь, что вы получите более чистое решение, даже если вы не получите половину сексуальности 🙂

Во-первых, сохраните резервное растровое изображение и холст:

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

Убедитесь, что это правильный размер:

  @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); } 

И когда мы подошли к составлению списка:

  @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); }