Angular material - implementacja własnych mat ikon

Stronę tą wyświetlono już: 1173 razy

Wstęp i instalacja modułu materiala

Angular posiada szereg ogólnodostępnych paczek, które rozszerzają jego możliwości. Do takich paczek należy @angular/material. Zainstalowanie tej paczki wymaga wpisania w konsoli:

npm install --save @angular/material @angular/cdk @angular/animations hammerjs --save

dzięki czemu paczka z repozytorium zostanie zainstalowana lokalnie w projekcie. Opcja --save sprawi, że zapisane zostaną w pliku package.json informacje o konieczności zainstalowania tej paczki przy wpisaniu polecenia:

npm install

którego używa się zawsze po ściągnięciu repozytorium czyjegoś projektu. Polecenie to instaluje wszystkie niezbędne zależności właśnie na podstawie danych zawartych w pliku package.json.

Warto też zwrócić uwagę na fakt, że zależności w pliku package.json są podzielone na dwie sekcje:

  • dependencies - zależności dla wersji produkcyjnej projektu;
  • devDependencies - zależności instalowane tylko dla wersji developersiekiej;

W następnym kroku należy dodać materiala do projekut:

ng add @angular/material --save

Co spowoduje wyświetlenie opcji:

? Choose a prebuilt theme name, or "custom" for a custom theme: (Use arrow keys)
> Indigo/Pink        [ Preview: https://material.angular.io?theme=indigo-pink ]
  Deep Purple/Amber  [ Preview: https://material.angular.io?theme=deeppurple-amber ]
  Pink/Blue Grey     [ Preview: https://material.angular.io?theme=pink-bluegrey ]
  Purple/Green       [ Preview: https://material.angular.io?theme=purple-green ]
  Custom

związanych z domyślnym stylem kontrolek materiala.

Tworzenie modułu importu

Teraz warto utworzyć sobie oddzielny moduł, w którym będą umieszczane importy wszystkich materialowych modułów. W tym celu w konsoli z poziomu folderu src/app wpisuję:

ng g m material

by następnie po chwili lub co najwyżej dwóch móc zaimportować moduł MatIconModule. Po modyfikacjach mój plik material.module.ts będzie wyglądał następująco:

Listing 1
  1. import { NgModule } from '@angular/core';
  2. import { CommonModule } from '@angular/common';
  3. import { MatIconModule} from '@angular/material';
  4. @NgModule({
  5. declarations: [],
  6. imports: [
  7. CommonModule,
  8. MatIconModule
  9. ],
  10. exports: [
  11. MatIconModule
  12. ]
  13. })
  14. export class MaterialModule { }

Konieczne jest jeszcze zaimportowanie tego modułu w module głównym (w moim przypadku) a w bardziej rozbudowanym projekcie utworzony moduł materiala powinien zostać zaimportowany do każdego podmodułu, który będzie korzystał z materialowych komponentów.

Osadzanie standardowych ikon oraz rejestracja i osadzanie własnych ikon

Osadzanie podstawowych ikon

Po tych czynnościach można już przejść do dodania własnej ikonki. Zanim jednak to uczynię pragnę nadmienić, iż material ma własny wbudowany zestaw ikonek, które można znaleźć na stronie material.io/resources/icons. W celu użycia domyślnych ikon wystarczy napisać w kodzie HTML:

Listing 2
  1. <mat-icon>done_outline</mat-icon>

Konieczne będzie jeszcze doinstalowanie owych ikon:

npm install material-design-icons --save

gdzie jak nie trudno się domyślić done_outline jest znacznikiem używanym do wstawienia jednej z domyślnych ikon. Znacznik ten można znaleźć na wcześniej wspomnianej stronie, która zawiera opis wszystkich dostępnych ikonek.

Przygotowanie i rejestracja własnych ikon

Ikony powinny być grafikami SVG z tego względu, że takie ikony po ustawieniu im koloru w stylu komponentu mat-icon będą zmieniały swój kolor wypełnienia. Jest jednak pewien haczyk. Otóż elementy graficzne zawarte w twojej ikonce będą zmieniały kolor jedynie wtedy, gdy elementy w niej osadzone nie będą miały nadanych styli wypełnienia. Jeżeli więc chcesz osadzić swój mały plik SVG utworzony np. w Inkscap-ie to musisz pousuwać te style. Oto przykład ścieżki zawartej w pliku SVG posiadającej style wypełnienia:

Listing 3
  1. <path
  2. sodipodi:type="star"
  3. style="opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.39687499;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
  4. id="path815"
  5. sodipodi:sides="3"
  6. sodipodi:cx="2.6034903"
  7. sodipodi:cy="293.82498"
  8. sodipodi:r1="2.2860386"
  9. sodipodi:r2="2.2081439"
  10. sodipodi:arg1="0"
  11. sodipodi:arg2="1.0471976"
  12. inkscape:flatsided="true"
  13. inkscape:rounded="0"
  14. inkscape:randomized="0"
  15. d="m 4.889529,293.82498 -3.429058,1.97977 0,-3.95954 z" />

Po wyeliminowaniu styli:

Listing 4
  1. <path
  2. sodipodi:type="star"
  3. sodipodi:sides="3"
  4. sodipodi:cx="2.6034903"
  5. sodipodi:cy="293.82498"
  6. sodipodi:r1="2.2860386"
  7. sodipodi:r2="2.2081439"
  8. sodipodi:arg1="0"
  9. sodipodi:arg2="1.0471976"
  10. inkscape:flatsided="true"
  11. inkscape:rounded="0"
  12. inkscape:randomized="0"
  13. d="m 4.889529,293.82498 -3.429058,1.97977 0,-3.95954 z" />

Jak widać usunąłem nie potrzebny mi atrybut id oraz atrybut styli style.

Teraz, aby możliwe było zarejestrowanie własnych ikon trzeba dodać moduł HttpClientModule, który ja importuję w module głównym app.module.ts:

Listing 5
  1. import { MaterialModule } from './material/material.module';
  2. import { BrowserModule } from '@angular/platform-browser';
  3. import { NgModule } from '@angular/core';
  4. import { AppRoutingModule } from './app-routing.module';
  5. import { AppComponent } from './app.component';
  6. import { HttpClientModule } from '@angular/common/http';
  7. import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
  8. @NgModule({
  9. declarations: [
  10. AppComponent
  11. ],
  12. imports: [
  13. BrowserModule,
  14. AppRoutingModule,
  15. HttpClientModule,
  16. BrowserAnimationsModule,
  17. MaterialModule
  18. ],
  19. providers: [],
  20. bootstrap: [AppComponent]
  21. })
  22. export class AppModule { }

Teraz można zarejestrować własną ikonkę w pliku komponentu głównego app.component.ts:

Listing 6
  1. constructor(
  2. private matIconRegistry: MatIconRegistry,
  3. private domSanitizer: DomSanitizer
  4. ) {
  5. this.matIconRegistry.addSvgIcon('play', this.domSanitizer.bypassSecurityTrustResourceUrl('/assets/svg-icons/play.svg'));
  6. }

Osadzenie ikonki w kodzie:

Listing 7
  1. <mat-icon svgIcon="play"></mat-icon>

Zmiana koloru ikonki:

Listing 8
  1. <mat-icon style="color: red" svgIcon="play"></mat-icon>

Repozytorium na GitHub-ie zawierające wszystko, co potrzebne utworzenia własnych mat ikonek można znaleźć tutaj.

Strony powiązane
strony powiązane
  1. npmjs.com/package/@angular/material
  2. github.com/Obliczeniowo/ownMaterialIconsExample
Propozycje książek

Komentarze