Beispiel #1
0
        static void SetColorStyleValue(string cmd, string avAtrName, string value, XElement svgElement, BaseElement avElement, List <string> warnings)
        {
            if (value == "none")
            {
                avElement.SetAndroidAttributeValue(avAtrName, value);
            }
            else if (value.StartsWith("url("))
            {
                if (!value.StartsWith("url(#"))
                {
                    throw new Exception("Only anchor URLs are supported at this time.");
                }

                //var iri = value.Substring("url(#".Length).Trim(')').Trim();
                var iri = value.SubstringWithTerminator("url(#".Length, ')').Trim();
                if (svgElement.GetRoot() is XElement root)
                {
                    AndroidVector.BaseGradient gradient = null;
                    if (root.Descendants(Namespace.Svg + "linearGradient").FirstOrDefault(e => e.Attribute("id").Value == iri) is XElement svgLinearGradient)
                    {
                        if (PaintConverter.ConvertLinearGradient(svgLinearGradient, warnings) is LinearGradient avGradient)
                        {
                            gradient = avGradient;
                        }
                    }
                    else if (root.Descendants(Namespace.Svg + "radialGradient").FirstOrDefault(e => e.Attribute("id").Value == iri) is XElement svgRadialGradient)
                    {
                        if (PaintConverter.ConvertRadialGradient(svgRadialGradient, warnings) is RadialGradient avGradient)
                        {
                            gradient = avGradient;
                        }
                    }

                    if (gradient != null)
                    {
                        if (avElement.Element(AndroidVector.Namespace.Aapt + "attr") is XElement aaptAttr && aaptAttr.Attribute("name").Value == "android:" + gradient.Attribute(AndroidVector.Namespace.AndroidVector + "type").Value)
                        {
                            aaptAttr.Remove();
                        }

                        var aapt = new AaptAttr(cmd + "Color");
                        avElement.Add(aapt);

                        if (aapt.Elements("gradient").FirstOrDefault(e => e.Attribute(AndroidVector.Namespace.AndroidVector + "type").Value == gradient.Attribute(AndroidVector.Namespace.AndroidVector + "type").Value) is XElement oldGradient)
                        {
                            oldGradient.Remove();
                        }

                        aapt.Add(gradient);
                        avElement.SetAndroidAttributeValue(avAtrName, null);
                        return;
                    }

                    warnings.AddWarning("Ignoring gradient because no element found to complete link [" + value + "].");
                    return;
                }
                throw new Exception("Could not find document root");
            }
            else
            {
                var(hexColor, opacity) = GetHexColorAndFloatOpacity(value, warnings);
                avElement.SetAndroidAttributeValue(avAtrName, hexColor);
                if (!float.IsNaN(opacity))
                {
                    avElement.SetAndroidAttributeValue(cmd + "Alpha", opacity);
                }
            }
        }