Animacja zmiany kolorów

0

Witam,
stworzyłem sobie panel składający się z kółek(8x11). Chciałbym je teraz animować, tak żeby zmieniać kolory poszczególnych kółek. Czytałem o ColorAnimation, ale nie wiem czy ma to zastosowanie akurat do mojego obiektu. Myślałem też nad tym, że jeśli stworzyłem tablicę tych wszystkich elementów, to żeby po indeksie szukać konkretne kółko i zmieniać mu kolor. Kod tworzenia kółek:

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
            GeometryGroup geometry_group = new GeometryGroup();
 

            Geometry[,] panel;
            panel = new Geometry[11, 8];
            EllipseGeometry elipse;

                for (int x = 0; x < 10; x++)
                {
                    for (int y = 0; y < 7; y++)
                    {
                        elipse = new EllipseGeometry(new Rect(new Point((x * 7), (y * 7)), new Point(((x * 7) + 5), ((y * 7) + 5))));
                        panel[x, y] = elipse;
                        geometry_group.Children.Add(elipse);
                    }
                }
            
            GeometryDrawing geometry_drawing = new GeometryDrawing();
            geometry_drawing.Brush = Brushes.Black;
            geometry_drawing.Geometry = geometry_group;

           
            DrawingGroup drawing_group = new DrawingGroup();
            drawing_group.Children.Add(geometry_drawing);

 
            DrawingImage drawing_image = new DrawingImage(drawing_group);

                image.Source = drawing_image;

            
        }

Proszę o jakąś podpowiedź jak mogę uzyskać taki efekt. Czy da się zmienić kolor tylko jednego kółka w takim panelu? jak tworzę nowy geometry_drawing z innym kolorem i rysuję nim jeden element z tablicy- w efekcie pojawią się w okienku tylko ten jeden konkretny element z innym kolorem.

0

z Twojego kodu (jak i z przykładów na MSDN) wynika, że kolor i wypełnienie masz dla całej grupy. Więc jeśli chcesz aby jedna (kilka) z nich miało inny kolor to musisz z nich zrobić osobną grupę z osobnymi ustawieniami koloru/wypełnienia

0

ok, stworzyłem oddzielną grupę z innym kolorem i działa! :)
Jeśli jednak chciałbym "animować" kulki i tworzę pętlę, która przyjmuje wartości swoich elementów 0 lub 1(odpowiednio 0-czarny kolor, 1-żółty kolor), wrzucam to w foreach to nie chce zadziałać. Bez pętli, na sucho dodane elementy do odpowiedniej grupy zmieniają kolor. Poniżej trochę kodu:

 foreach (var item in tablica)
            {
                if (tablica[item] == 0)
                {
                    geometry_group2.Children.Add(panel[panel.Szerokosc, item]);
                }
                else
                {
                    geometry_group.Children.Add(panel[panel.Szerokosc, item]);
                }
            }

pisane bez pętli działa ok:

 geometry_group2.Children.Add(panel[5, 1]);

co jest nie tak? czy gdzieś "giną" zmienne?

0

a ten foreach jak wywołujesz? Bo program musi mieć czas, żeby to odrysować

0

Od razu po rysowaniu:

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
 
            GeometryGroup geometry_group = new GeometryGroup();
 
 
            Geometry[,] panel;
            panel = new Geometry[11, 8];
            EllipseGeometry elipse;
 
                for (int x = 0; x < 10; x++)
                {
                    for (int y = 0; y < 7; y++)
                    {
                        elipse = new EllipseGeometry(new Rect(new Point((x * 7), (y * 7)), new Point(((x * 7) + 5), ((y * 7) + 5))));
                        panel[x, y] = elipse;
                        geometry_group.Children.Add(elipse);
                    }
                }
 
            GeometryDrawing geometry_drawing = new GeometryDrawing();
            geometry_drawing.Brush = Brushes.Black;
            geometry_drawing.Geometry = geometry_group;
 
 
            DrawingGroup drawing_group = new DrawingGroup();
            drawing_group.Children.Add(geometry_drawing);
 
 
            DrawingImage drawing_image = new DrawingImage(drawing_group);
 
                image.Source = drawing_image;

 foreach (var item in tablica)
            {
                if (tablica[item] == 0)
                {
                    geometry_group2.Children.Add(panel[panel.Szerokosc, item]);
                }
                else
                {
                    geometry_group.Children.Add(panel[panel.Szerokosc, item]);
                }
            }
     //geometry_group2.Children.Add(panel[5, 1]);
            image.Source = drawing_image;
 
        }
0

Wróciłem do problemu, który wyżej opisywałem.
Stanęło na tym, że tworzę sobie tablicę EllipseGeometry i wyświetlam ją w kontrolce image.
Mam 2 grupy rysowania o kolorach zielonym i żółtym. Chciałbym na takim image przeprowadzić animację zmiany kolorów moich "kółek".
Obecnie zadeklarowałem sobie licznik(gdzie zmienna du jest liczbą określającą przez parzystość, który rząd ma zmienić swój kolor):

        private static System.Timers.Timer aTimer;
        public int du { get; set; }
 public Animacja()
        {
            InitializeComponent();
            du = 0;
            myDel += Change;
            aTimer = new System.Timers.Timer(1000);
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 400;
            aTimer.Enabled = true;

 private void Change()
        {
            du++;
            if (du % 2 == 1)
            {
                for (int x = 0; x < 66; x = x + 2)
                {
                    for (int y = 0; y < 16; y++)
                    {
                        geometry_group.Children.Remove(Taba.g_panel[x, y]);
                        geometry_group2.Children.Add(Taba.g_panel[x, y]);
                    }
                }
            }
            else
            {
                for (int x = 0; x < 66; x = x + 2)
                {
                    for (int y = 0; y < 16; y++)
                    {
                        geometry_group2.Children.Remove(Taba.g_panel[x, y]);
                        geometry_group.Children.Add(Taba.g_panel[x, y]);
                    }
                }
            }
}

public void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            geometry_drawing.Dispatcher.Invoke(myDel);

        }

Wyżej wymieniony kod działa, ale pożera sporo procesora i w pewnym momencie program zaczyna zwalniać, a zużyte zasoby zaczynają wariować.
Chciałbym się Was poradzić co z tym fantem zrobić, bo zamierzony cel osiągnąłem, ale nie jest on zadawalający. Jak do takiej tablicy i kontrolki Image zastosować(o ile można) ColorAnimation, bo wydaję mi się, że moja ala animacja na liczniku jest kiepska... i jeszcze jedno. Mam narysowanych 1056 kółeczek, i przy czasie licznika >400ms funkcja nie wyrabia i kolory się nie zmieniają:(

1 użytkowników online, w tym zalogowanych: 0, gości: 1