2010-09-15 7 views
8

estoy jugando con el teléfono 7 SDK de Windows y estoy tratando de hacer que el aspecto de la pantalla como una pantalla digital manera antigua. En este momento estoy tratando de descubrir cómo hacer que el texto "brille" como uno de esos relojes digitales geniales. Este es el tipo de cosas que asumiría que usaría para sombreadores, pero parece que los sombreadores están deshabilitados para usar en el sistema operativo Windows Phone 7. ¿Algunas ideas? Para ser más específico, quiero que el texto se vea como si fuera una fuente de luz y que el color "sangra" ligeramente de la fuente real.mejor manera de conseguir un teléfono de Windows 7 efecto de brillo

+2

reemplazado a Silverlight y C# en lugar de las versiones 4.0 de esos. winphone7 no usa Silverlight 4, es una versión 3.custom de Silverlight. –

+1

Sumerja en algunos Ready Brek :) –

Respuesta

12

Yo diría que es una elección entre usar una imagen como fuente o desenfoque con WriteableBitmap.

Usando una imagen de la fuente pre-hechos le permite hacer las letras a complejos como desee y debe funcionar bien. SpriteFont2 es conveniente, ya que puede generar el SpriteSheet con efectos como resplandor, trazo, sombra y exportar un archivo xml que contiene las posiciones de las letras. Agregue los archivos png y xml generados a su solución y cambie la acción de compilación al contenido, también compruebe que ha hecho referencia a System.Xml.Linq.

Se puede usar la siguiente clase.

public static class BitmapFont 
{ 
    private class FontInfo 
    { 
     public FontInfo(WriteableBitmap image, Dictionary<char, Rect> metrics) 
     { 
      this.Image = image; 
      this.Metrics = metrics; 
     } 
     public WriteableBitmap Image { get; private set; } 
     public Dictionary<char, Rect> Metrics { get; private set; } 
    } 

    private static Dictionary<string, FontInfo> fonts = new Dictionary<string, FontInfo>(); 
    public static void RegisterFont(string fontFile, string fontMetricsFile) 
    { 
     string name = System.IO.Path.GetFileNameWithoutExtension(fontFile); 
     BitmapImage image = new BitmapImage(); 

     image.SetSource(App.GetResourceStream(new Uri(fontFile,UriKind.Relative)).Stream); 
     var metrics = XDocument.Load(fontMetricsFile); 
     var dict = (from c in metrics.Root.Elements() 
        let key = (char)((int)c.Attribute("key")) 
        let rect = new Rect((int)c.Element("x"), (int)c.Element("y"), (int)c.Element("width"), (int)c.Element("height")) 
        select new { Char = key, Metrics = rect }).ToDictionary(x => x.Char, x => x.Metrics); 

     fonts.Add(name,new FontInfo(new WriteableBitmap(image),dict)); 
    } 

    public static WriteableBitmap DrawFont(string text, string fontName) 
    { 
     var font = fonts[fontName]; 

     var letters = text.Select(x => font.Metrics[x]).ToArray(); 
     var height = (int)letters.Max(x => x.Height); 
     var width = (int)letters.Sum(x => x.Width); 

     WriteableBitmap bmp = new WriteableBitmap(width, height); 

     int[] source = font.Image.Pixels, dest = bmp.Pixels; 
     int sourceWidth = font.Image.PixelWidth; 
     int destX = 0; 
     foreach (var letter in letters) 
     { 
      for (int sourceY = (int)letter.Y, destY = 0; destY < letter.Height; sourceY++, destY++) 
      { 
       Array.Copy(source, (sourceY * sourceWidth) + (int)letter.X, dest, (destY * width) + destX, (int)letter.Width); 
      } 
      destX += (int)letter.Width; 
     } 

     return bmp; 
    } 

    public static Rectangle[] GetElements(string text, string fontName) 
    { 
     var font = fonts[fontName]; 

     return (from c in text 
       let r = font.Metrics[c] 
       select new Rectangle 
       { 
        Width = r.Width, 
        Height = r.Height, 

        Fill = new ImageBrush { 
         ImageSource = font.Image, 
         AlignmentX=AlignmentX.Left, 
         AlignmentY=AlignmentY.Top, 
         Transform = new TranslateTransform { X = -r.X, Y = -r.Y }, 
         Stretch=Stretch.None       
        }, 
       }).ToArray(); 
    } 
} 

Uso

//Register the font once. 
BitmapFont.RegisterFont("Font.png", "Metrics.xml"); 

//Draws the text to a new bitmap, font name is image name without extension. 
image.Source = BitmapFont.DrawFont(DateTime.Now.ToLongTimeString(), "Font"); 

//Alternatively put these elements in a horizontal StackPanel, or ItemsControl 
//This doesn't create any new bitmaps and should be more efficient. 
//You could alter the method to transform each letter too. 
BitmapFont.GetElements(DateTime.Now.ToLongTimeString(), "Font"); 

Si desea difuminar ver una aplicación o uso BoxBlur hereWriteableBitmapEx.Convolute.

+0

Gracias! Usar SpriteFont2 es una gran sugerencia. – CoderDennis

0

debe hacer una copia de la TextBlock se quiere dar el brillo a. Vincule la propiedad de texto del nuevo elemento con la propiedad de texto del elemento original (usando el enlace ElementName). Haz lo mismo para la ubicación/altura/ancho, etc. o cualquier otra propiedad que sientas que cambiará en el artículo original. Establezca una transparencia en el nuevo elemento, así como un efecto de desenfoque. Esto le dará un efecto de brillo fresco que desee.

+1

Como se señala en los comentarios de la otra respuesta a esta pregunta, los efectos se eliminaron y ya no son compatibles con WP7. – CoderDennis

+0

la forma de pensar me llevó a una solución, gracias – CuiPengFei

Cuestiones relacionadas