如何在 ImageView Android studio 中设置滤镜 属性

How to set filter property in ImageView Android studio

我有一个黄色迷你图 png,我想通过添加一些 css 来更改过滤器。颜色会根据正数或负数变化。

因此,如果数字为负数,则该行应为:

CSS

filter: hue-rotate(300deg) saturate(210%) brightness(0.7) contrast(170%);

如果为正:

filter: hue-rotate(85deg) saturate(80%) brightness(0.85);

ImageView:

       <ImageView
                android:layout_width="match_parent"
                android:layout_height="36dp"
                android:id="@+id/sparkline"
                android:layout_toRightOf="@+id/coin_icon"
                android:src="@drawable/line_24"
                android:layout_marginRight="5dp"
                />

MainActivity.Java

ImageView sparkline;

sparkline = itemView.findViewById(R.id.sparkline);

if(datum.getQuote().getUSD().getPercentChange24h() < 0.000){
  ///red
}else{
    //green

 }

编辑:

我有:

我想要的:

编辑:

现在我使用了 ImageFilterView:

 <androidx.constraintlayout.utils.widget.ImageFilterView
                android:layout_width="80dp"
                android:layout_height="50dp"
                android:id="@+id/sparkline"
                android:layout_marginRight="2dp"
                app:saturation="80"
                app:brightness="0.85"
                android:src="@drawable/btc_spike" />

但我仍然需要添加 hue-rotate(300deg) 我找不到任何东西来改变颜色。

请尝试以下方法希望对您有所帮助

public static void changeImageColor(Context ctx,ImageView img, int color){
        try {
//            img.setColorFilter(color);
            img.setColorFilter(color,PorterDuff.Mode.MULTIPLY);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void changeImageColorNoMode(Context ctx,ImageView img, int color){
        try {
            img.setColorFilter(color);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

HSB(色调-饱和度-亮度)模型也称为 HSV,其中 V 代表值。有关带图形描述的 HSB 颜色模型和色调轮的更多详细信息,请参见此 Medium

要在 ImageView 上应用 HSV 颜色滤镜,您可以使用以下方法:

public static int HSVToColor (float[] hsv)

Convert HSV components to an ARGB color. Alpha set to 0xFF.

  • hsv[0] is Hue ([0..360])
  • hsv[1] is Saturation ([0...1])
  • hsv[2] is Value ([0...1])

If hsv values are out of range, they are pinned.

您只需创建具有上述范围的 float[] 数组并将其应用到 ImageView 中,如下所示:

ImageView imageView = findViewById(R.id.imageView);
//hsv[0] is Hue [0 .. 360) hsv[1] is Saturation [0...1] hsv[2] is Value [0...1]
float[] hsv = new float[]{85f, 0.8f, 0.85f};
imageView.setColorFilter(Color.HSVToColor(hsv));

基于您的第一个(黄色图像)应用滤色器(绿色图像)前后的结果将是:

如果我们从附加的 Red/Green 图像中选择一个像素样本,则 RGB 颜色用于 Red:R(209)G(63)B(84)Green:R(69)G(186)B(116)。现在,如果我们使用 RGB to HSV color conversion tool 将这些 RGB 值转换为 HSV 值,我们将得到以下结果:

红色

RGB:R(209)G(63)B(84) -> HSV:H(351deg)S(69.9%)V(82%)

在代码中:

float[] hsv = new float[]{351f, 0.699f, 0.82f};
imageView.setColorFilter(Color.HSVToColor(hsv));

结果:

绿色

RGB:R(69)G(186)B(116) -> HSV:H(144deg)S(62.9%)V(72.9%)

在代码中:

float[] hsv = new float[]{144f, 0.629f, 0.729f};
imageView.setColorFilter(Color.HSVToColor(hsv));

结果: