2010-09-15 15 views
8

Windows Phone 7 sdk ile uğraşıyorum ve ekranı eski moda bir dijital ekran gibi göstermeye çalışıyorum. Şu anda, bu güzel dijital saatlerden biri gibi metni "parıltı" yapmanın yollarını bulmaya çalışıyorum. Bu, shader'ları kullanmaya çalıştığınızı varsayardım, ama Windows Phone 7 işletim sisteminde kullanım için gölgelendiriciler devre dışı bırakılmış gibi görünüyor. Herhangi bir fikir? Daha spesifik olmak gerekirse, metnin bir ışık kaynağı gibi görünmesini ve gerçek fonttan rengin "boşa gitmesini" istiyorum.Bir parlama efekti elde etmenin en iyi yolu Windows Phone 7

+2

, bunların 4.0 sürümleri yerine silverlight ve C# olarak yeniden etiketlendi. winphone7 silverlight 4 kullanmaz, onun 3.custom gümüş versiyonu. –

+1

Bazı Hazır Brek'e batırın :) –

cevap

12

Ben onun yazı tipi olarak bir resim veya WriteableBitmap ile bulanık arasında bir seçim diyebilirim. Önceden hazırlanmış bir yazı resmin kullanılması

istediğiniz gibi harfleri karmaşık hale getirmek ve iyi bir performans olmalıdır sağlar. SpriteFont2, SpriteSheet'i kızdırma, kontur, gölge gibi efektlerle oluşturabildiği ve harf konumlarını içeren bir xml dosyasını dışa aktardığı için kullanışlıdır. Oluşturulan png ve xml dosyalarını çözümünüze ekleyin ve İçeriği Oluştur eylemini de System.Xml.Linq.

Aşağıdaki sınıf kullanılabilir.

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(); 
    } 
} 

Kullanımı

//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"); 

Bir BoxBlur uygulaması here bakın veya WriteableBitmapEx.Convolute kullanmak bulanıklık istiyorsanız.

+0

Teşekkürler! SpriteFont2'yi kullanmak harika bir öneridir. – CoderDennis

0

Işığı vermek istediğiniz TextBlock'un bir kopyasını oluşturmalısınız. Yeni öğenin text özelliğini, orijinal öğenin text özelliğine (ElementName binding kullanarak) bağlayın. Orijinal öğe üzerinde değişeceğini düşündüğünüz konum/yükseklik/genişlik vb. Yeni öğenin yanı sıra bir Blur Efekti üzerinde bir saydamlık ayarlayın. Bu size istediğiniz serin bir parlama efekti verecektir.

+1

Bu sorunun diğer yanıtı hakkındaki yorumlarda belirtildiği gibi, Etkiler kaldırıldı ve artık WP7'de desteklenmiyor. – CoderDennis

+0

Düşüncenin yolu bana bir çözüm yol açtı, teşekkürler – CuiPengFei

İlgili konular