【问题标题】:Does Android support non-linear progression in gradients?Android 是否支持渐变的非线性进展?
【发布时间】:2015-04-27 23:17:52
【问题描述】:

我想要一个以非线性速率从起始颜色渐变到结束颜色的渐变。梯度只会沿单个笛卡尔轴变化。 RadialGradient 或 SweepGradient 不是我在这里指的。

我的问题是,Android 是否支持控制渐变过渡率,而无需编写自定义着色器?

【问题讨论】:

    标签: android gradient


    【解决方案1】:

    是的,在一定程度上。 LinearGradient 有一个构造函数,它采用多种颜色和位置,因此您可以使用分段线性函数来近似非线性渐进。

    以下代码基于答案https://stackoverflow.com/a/4381192/8568479

    ShapeDrawable.ShaderFactory shaderFactory = new ShapeDrawable.ShaderFactory() {
        @Override
        public Shader resize(int width, int height) {
            LinearGradient gradient = new LinearGradient(0, 0, width, height,
                new int[] { 
                    Color.parseColor("#000000"),
                    Color.parseColor("#777777"),
                    Color.parseColor("#FFFFFF")
                },
                new float[] { 0, 0.3f, 1 },
                Shader.TileMode.REPEAT
            );
            return gradient;
        }
    };
    
    PaintDrawable p = new PaintDrawable();
    p.setShape(new RectShape());
    p.setShaderFactory(shaderFactory);
    

    您可以根据需要添加任意数量的站点,以使渐变看起来平滑。我还发现此链接有助于选择平滑渐变的系数https://css-tricks.com/easing-linear-gradients/

    【讨论】:

      【解决方案2】:

      不是一个好方法,而是一个简单的方法:

      您可以在渐变 XML 文件中添加 centerColor 并设置所需的值。这使得它是非线性的(你需要做一些计算)。

      例如,如果您需要从透明到黑色的非线性渐变,您可以这样做:

      <shape xmlns:android="http://schemas.android.com/apk/res/android"
          android:shape="rectangle">
          <gradient
              android:startColor="#00000000"
              android:centerColor="#11000000"
              android:endColor="#000000"
              android:angle="270" />
      </shape>
      

      【讨论】:

        猜你喜欢
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-02
        • 2012-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多