当前位置: 首页 > 知识库问答 >
问题:

如何在特定区域覆盖列表项文本颜色?

公孙茂学
2023-03-14

假设我们有自定义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);
    }
}

绘制的位图表示某种矩形玻璃,其宽度等于listview的宽度,并且具有一定的高度。我想要的是,当列表项滚动到这个矩形中时,用于绘制文本的颜色(不是所有带有背景等的项)将被改变成另一种颜色。因此,例如,当列表项适合到GlasspickerBitmap中时,只有一半高度的文本适合GlasspickerBitmap时,列表项的外部部分应保持序号颜色,而GlasspickerBitmap内部的部分应更改其文本颜色。列表项是没有任何背景的简单文本视图。

如何才能做到这一点?是否有任何ColorFilter分配给Paint?但在哪里?滚动ListView时甚至不会调用OnDraw()方法...是否可以在自定义视图中完成此操作,例如,将是ListView的项?或者可能是某种颜色/着色器/不知道这里还有什么覆盖可以使用,但是在哪里呢?

这种颜色改变应该以动态的方式进行--在滚动列表的过程中,颜色应该只对玻璃矩形下的文本部分进行改变。

*好的,这里的欧元和美元是用非标准青色绘制的特殊货币。这个问题至少是关于白色文本的。但如果它也能改变青色,那就太好了。

共有1个答案

淳于宏伯
2023-03-14

正如您在实现中所看到的,它们使用并更新列表适配器中的一个固定位置,然后更新相应匹配的视图。对我来说,这是最简单的方法,但您不会得到半半颜色的文本,我认为您仍然想要:)

所以这可能是我给出的最糟糕的答案之一,很抱歉,我可能会重温这个问题,或者希望有人能给你一个更好的解决方案

您可以在以下网址看到一个模糊的演示:

  • 使用适当的ColorMatrixColorFilter创建一个Paint,为了回答这个问题,我只是去饱和,您必须计算出ColorMatrix的5x4矩阵才能得到您要找的青色。在下面绘制时,您还需要一些rect来定义源和目标。
  • 创建一个屏幕外的位图画布来绘制列表,这是在onsizechanged中完成的,这样我们就有了适当的视图布局值。在这里,您可以开始注意到脏东西,因为您将不得不分配一个与ListView一样大的位图以便您可以获得OutOfMemoryException
  • 重写draw以使用屏幕外的画布并让ListView绘制到它,然后您可以将位图绘制到给定的画布上,该画布将像往常一样绘制列表,然后只绘制该位图的一部分,它将使用我们之前定义的paint以不同方式绘制,您将透支这些像素。
  • 最后画出预制玻璃的位图,我推荐一个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);
  }
}

所以说,我希望你最终得到一个更干净的解决方案,即使你没有得到那一半一半的性感:)

 类似资料:
  • 问题内容: 我已经考虑了以下内容,所以现在我想知道您的意见,可能的解决方案等。 我正在寻找一种插件或技术来更改文本的颜色,或者根据其父​​级背景图像或-color覆盖像素的平均亮度在预定义的图像/图标之间切换。 如果背景覆盖的区域很暗,请将文本设置为白色或切换图标。 此外,如果脚本会注意到父级没有定义的background-color或-image,然后继续搜索最接近的值(从父元素到其父元素),那

  • 我花了几天的时间寻找这个问题,但是找不到一个我现在能设法解决的答案。 我想允许用户在列表中为整个应用程序选择不同的主题,以满足白天/夜间的需要。问题是我无法找到更改ListPreference行Item textColor的文本颜色的方法。我找到的一些解决方案是关于使用属性 以设置该文本。然而,这在我使用API 11的测试中没有影响。经过多次尝试,我得到的结果几乎总是相同的:当为应用程序设置不同的

  • 问题内容: 编辑Png图像例如,更改特定区域并在该区域填充颜色。 我想更改仅图像选择区域的颜色。就像第一个用户选择一种颜色,然后他选择一个图像一样,之后他可以用所选颜色更改图像颜色的特定区域。 之后,他也可以保存该图像,这可能吗?像Color公司的网站使用这种东西。 像下面的URL https://www.sherwin- williams.com/visualizer#/active 问题答案:

  • 我需要一些帮助来估计某种形态学操作(最好使用skimage或scipy image或通常使用python),这些操作可以帮助我隔离由所有边包围的区域(参见Images.)问题是外壳可以有不同的形状和大小。封闭区域的形状和大小也各不相同。图像的例子,其中封闭的(由白色区域)黑色区域需要隔离。 通过隔离,我的意思是获得封闭的黑色区域中的所有像素坐标。 实施例1

  • 问题内容: 我正在尝试制作自己的 WYSIWYG 编辑器。有什么办法,如何获取用户在textarea中选择的文本? 例如,如果用户选择了某个单词然后单击按钮,那么我如何找出选择了哪个文本? 我正在使用 jQuery 。 问题答案: 尝试使用jquery-fieldselection插件。 您可以从这里下载。也有一个例子。

  • 我正在Java写一个程序来更新文本文档上的数据。更新由按钮(JButton)触发。 特别是,我需要区分文档中的3行: 第一个描述了一个名为“total”的浮点值 第二个描述了一个名为“fail”的浮点值 第三个描述了一个称为“rate”的双值 在程序执行期间,我希望读取文档的3行并将其分配给变量;按下按钮后,相应的变量必须覆盖文档中的值。 为了实现这一点,我的理由如下: 我声明了3个私有变量(总数