【问题标题】:How to darken a given color (int)如何使给定的颜色变暗(int)
【发布时间】:2016-01-09 09:57:49
【问题描述】:

我有一个采用给定颜色的函数,我希望它使颜色变暗(将其亮度降低 20% 左右)。仅考虑颜色(int),我无法弄清楚如何做到这一点。正确的做法是什么?

public static int returnDarkerColor(int color){
    int darkerColor = .... 
    return darkerColor;
}

【问题讨论】:

    标签: android android-color


    【解决方案1】:

    一种更 Android 的方式:

        public static int manipulateColor(int color, float factor) {
            int a = Color.alpha(color);
            int r = Math.round(Color.red(color) * factor);
            int g = Math.round(Color.green(color) * factor);
            int b = Math.round(Color.blue(color) * factor);
            return Color.argb(a,
                    Math.min(r,255),
                    Math.min(g,255),
                    Math.min(b,255));
        }
    

    您需要使用小于1.0f 的系数来变暗。试试0.8f

    【讨论】:

    • 工作得很好!
    【解决方案2】:

    还有一个更简单的解决方案,之前没有提到过,Android 有一个名为ColorUtils 的类,你可以帮你 这是一个扩展函数的 Kotlin sn-p

    inline val @receiver:ColorInt Int.darken
        @ColorInt
        get() = ColorUtils.blendARGB(this, Color.BLACK, 0.2f)
    

    ColorUtils.blendARGB 方法将您的颜色作为第一个参数和您要混合的第二个颜色,black 在这种情况下,最后一个参数是您的颜色与您正在混合的黑色之间的比率.

    【讨论】:

      【解决方案3】:

      RogueBaneling 建议的使用 HSV 的更简单解决方案:

      科特林

      @ColorInt fun darkenColor(@ColorInt color: Int): Int {
          return Color.HSVToColor(FloatArray(3).apply {
              Color.colorToHSV(color, this)
              this[2] *= 0.8f
          })
      }
      

      Java

      @ColorInt int darkenColor(@ColorInt int color) {
          float[] hsv = new float[3];
          Color.colorToHSV(color, hsv);
          hsv[2] *= 0.8f;
          return Color.HSVToColor(hsv);
      }
      

      不需要复杂的按位运算或Math。如果需要,将 0.8f 移至参数。

      【讨论】:

      • 淡化颜色应该怎么做?
      • 0.8f 参数更改为大于 1 的值。
      【解决方案4】:

      如果您想要更简单且不准确,以下内容可能会对您有所帮助。

      public static int returnDarkerColor(int color){
          float ratio = 1.0f - 0.2f;
          int a = (color >> 24) & 0xFF;
          int r = (int) (((color >> 16) & 0xFF) * ratio);
          int g = (int) (((color >> 8) & 0xFF) * ratio);
          int b = (int) ((color & 0xFF) * ratio);
      
          return (a << 24) | (r << 16) | (g << 8) | b;
      }
      

      【讨论】:

      • 1. 你说得对。我只想显示值 0.2f。 2, 3. 这是我的错误。我刚打字。感谢您修复。
      • 这可以正常工作并且比接受的答案更有效
      • 效果很好。用于将我的标题栏设置为操作栏的深色阴影
      【解决方案5】:

      将颜色转换为HSV array,然后将亮度降低 20%,然后使用HSVToColor 将 HSV 数组转换回 RGB。注意:您希望在数组中更改的值将是V-值。 (即hsv[2]

      【讨论】:

        【解决方案6】:

        使用 ColorUtils.blendARGB

        的最佳方式

        较暗:

        val newColor = ColorUtils.blendARGB(this, Color.BLACK, 0.5f)
        

        打火机:

        val newColor = ColorUtils.blendARGB(this, Color.WHITE, 0.5f)
        

        【讨论】:

          【解决方案7】:

          通过这种方式,您可以选择颜色百分比,从而获取更深或更浅的阴影

          int  color = ((ColorDrawable)c2.getBackground()).getColor();
          int  colorLighter = color - color * 40/100;
          int  colorDarker = color + color * 40/100;
          

          colorlighter 为我们提供了按钮背景中较浅的颜色 colordarker 为我们提供了比按钮背景更暗的颜色

          【讨论】:

          • 我认为你应该设置限制值以防止溢出颜色最大值(0xFFFFFF)
          猜你喜欢
          • 2020-06-09
          • 1970-01-01
          • 2013-01-09
          • 2018-12-04
          • 1970-01-01
          • 2017-12-27
          • 2012-10-05
          • 2021-09-26
          • 2013-08-18
          相关资源
          最近更新 更多