Animation i Android: hvordan det virker. Vi studerer nyttige egenskaber og laver animationer på Android

I denne artikel vil vi se på, hvordan man animerer grænsefladeelementer i Android. Under grænsefladeelementerne i I dette tilfælde dette betyder alle efterkommere af View-klassen (en komplet liste over efterkommere kan findes i dokumentationen til View-klassen). Animation er en nem måde at gøre en applikation mere livlig på :)

1. Lad os starte med at oprette en testside. Lad os lave en simpel applikation med en knap og et billede midt på skærmen. Jeg vil ikke give koden, det er enkelt, hvis noget, se på kilderne (de er i slutningen af ​​artiklen).

2. I mappen /res/anim skal du oprette en fil anim.xml og skrive der
< set xmlns:android=" http : // schemas.android.com /apk/res/android " android:shareInterpolator=" false " > < alpha android:fromAlpha=" 0.0 " android:toAlpha=" 1.0 " android:duration=" 1000 " />
Dette er animationsbeskrivelsen, som vi vil anvende på vores billede. Vi vil se på, hvad der sker her mere detaljeret nedenfor, men indtil videre kopierer vi det bare til en fil.

3. For at indlæse en animation fra xml-fil Brugt statisk metode klasse AnimationUtils
loadAnimation(kontekstkontekst, int id), Hvor sammenhæng er den aktuelle kontekst, og id- id for ressourcen med animation. Metoden returnerer en forekomst af klassen Animation.
Animation - en abstrakt klasse til at repræsentere animation i en applikation.
For at anvende det, overføres den resulterende forekomst af klassen Animation til metoden
startAnimation( Animation animation) klasse View (og alle dens efterkommere).

4. Lad os skrive til filen AnimationTestActivity.java:
public class AnimationTestActivity udvider aktivitet ( ImageView-billede; Knap-knap; Animation anim; @Override protected void onCreate(Bundle savedInstanceState) ( super .onCreate(savedInstanceState); setContentView(R.layout.main); image = (ImageView)findViewById(R. id.image); button = (Button )findViewById(R.id.button); anim = AnimationUtils.loadAnimation(this, R.anim.anim); // 1 button.setOnClickListener(ny OnClickListener() ( @Override public void onClick(View v) ( image.startAnimation(anim); //2 ) )); ) )
1) Læs filen med identifikatoren R.anim.anim (som svarer til filen /res/anim/anim.xml) og få en instans af klassen Animation.
2) Ved at klikke på knappen anvender vi animation på billedet.

5. Du kan køre vores applikation. Når du trykker på knappen, forsvinder billedet og begynder derefter langsomt at komme tilbage.

6. Lad os nu se nærmere på, hvordan animation oprettes i en xml-fil.
Der er 4 typer animation:


  • alfa(gennemsigtighed, synlighed)

  • vægt(skalering)

  • rotere(tur)

  • Oversætte(bevæge sig)

For at skabe animation skal vi beskrive objektets begyndelses- og sluttilstand, og systemet vil selv bestemme, hvordan man flytter fra en tilstand til en anden. I vores eksempel
< alpha android:fromAlpha=" 0.0 " android:toAlpha=" 1.0 " android:duration=" 1000 " />
vi beskriver alfa-animationen, det vil sige, at vi ændrer objektets synlighed. Indstil den oprindelige tilstand fromAlpha="0.0"(fuldstændig usynlig) og endelig toAlpha="1.0"(fuldt synlig). Angiv varigheden af ​​animationen duration="1000"(i millisekunder). Og alt andet, det vil sige, hvordan man ændrer synligheden af ​​et objekt for at gøre det fra usynligt til synligt på et sekund, gør systemet selv. Dette beregnes vha interpolation- i beregningsmatematik, en metode til at finde mellemværdier af en mængde fra et eksisterende diskret sæt værdier. For hver animation kan du indstille en interpolator
-AccelerateDecelerateInterpolator(@android:anim/accelerate_decelerate_int erpolator) - ændringshastigheden er lav i begyndelsen og slutningen og accelererer i midten

-Accelerate Interpolator(@android:anim/accelerate_interpolator) - ændringshastigheden starter lavt og accelererer derefter

-Anticipate Interpolator(@android:anim/anticipate_interpolator) - ændringer starter i den modsatte retning og går derefter skarpt fremad

-AnticipateOvershoot Interpolator(@android:anim/anticipate_overshoot_inte rpolator) - ændringer starter i den modsatte retning, flyt derefter hurtigt fremad og flyve over den endelige værdi, og vend derefter tilbage til den endelige værdi

- Bounce Interpolator(@android:anim/bounce_interpolator) - ændringshastigheden stiger i slutningen

- Cycle Interpolator(@android:anim/cycle_interpolator) - gentag animationen et bestemt antal gange. Ændringshastigheden følger en sinusbølge

- Decelerate Interpolator(@android:anim/decelerate_interpolator) - ændringshastigheden falder til sidst

-Lineær interpolator(@android:anim/linear_interpolator) - ændringshastigheden er konstant

-Overshoot Interpolator(@android:anim/overshoot_interpolator) - ændringer springer frem og flyver over den endelige værdi, og vender derefter tilbage til den endelige værdi

Interpolatoren indstilles ved hjælp af android:interpolator-attributten. For eksempel
android:interpolator="@android:anim/cyklus e_interpolator". Standard er LinearInterpolator.

7. Beskrivelse af begyndelses- og sluttilstande
1) alfa (gennemsigtighed, synlighed)
- android:fromAlpha- indledende gennemsigtighedsværdi. 0,0 - fuldstændig gennemsigtig (usynlig), 1,0 - fuldstændig uigennemsigtig (synlig)
- android:toAlpha- endelig gennemsigtighedsværdi

2) vægt
- android:fromXScale- indledende skalaværdi langs X-aksen (hvor den aktuelle størrelse svarer til værdien 1,0)
- android:toXScale- endelig skalaværdi langs X-aksen
- android:fromYScale- indledende skalaværdi langs Y-aksen (hvor den aktuelle størrelse svarer til værdien 1,0)
- android:toYScale- endelig skalaværdi langs Y-aksen
- android:pivotX- x-koordinat for punktet, som forbliver uændret efter skalering
- android:pivotY- y-koordinat for punktet, som forbliver uændret efter skalering

Mulige værdier for pivotX og pivotY:
i pixels i forhold til venstre (eller øverste for Y-koordinat) kant af elementet (f.eks. "5")
som en procentdel i forhold til venstre (øverste) kant (f.eks. "5 %)")
som en procentdel i forhold til venstre (øverste) kant af det overordnede element (f.eks. "5%p")

For eksempel, hvis pivotX=0, pivotY=0 (som svarer til elementets øverste venstre hjørne), så vil skalering ændre størrelsen på elementet ned og til højre. Hvis pivotX=50%, pivotY=50%, så er punktet i midten af ​​elementet, og størrelsen ændres i alle retninger, mens midten forbliver i et punkt.

3) dreje (drej)
- android:fromDegrees- Indledende værdi af rotationsvinklen (i grader, negativ værdi mulig)
- android:toDegrees- endelig værdi af rotationsvinklen
- android:pivotX- x-koordinater for rotationscentrum.
- android:pivotY- y-koordinat for rotationscentrum.
Mulige værdier for pivotX og pivotY som i skalaanimationen

4) oversætte (flytte)
- android:fromXDelta- x-koordinat for bevægelsens startpunkt. Mulige værdier:
i pixels i forhold til den oprindelige position (for eksempel "5")
som en procentdel i forhold til bredden af ​​elementet (f.eks. "5 %)"
som en procentdel i forhold til bredden af ​​det overordnede element (f.eks. "5%p")
- android:toXDelta- x-koordinat for bevægelsens slutpunkt
- android:fromYDelta- y-koordinat for bevægelsens udgangspunkt
- android:toYDelta- y-koordinat for bevægelsens slutpunkt

8. Yderligere muligheder
Der er også attributter, der er fælles for alle fire typer animation, hvoraf de mest nyttige er:
- android:varighed- animationsvarighed (i millisekunder)
- android:interpolator- definerer interpolatoren til animation
- android:repeatCount- antal yderligere animationsgentagelser. Præcis yderligere, det vil sige, at animationen vil blive udført én gang alligevel. Standardværdien er "0" - det betyder, at animationen kun vil blive udført én gang. En værdi på "1" betyder, at animationen kører to gange (en gang den primære og en gang den sekundære). Værdien "-1" eller "uendelig" betyder endeløs gentagelse.
- android:repeatMode- bestemmer animationens opførsel, når den er nået til slutningen, og parameteren repeatCount er ikke lig med 0. Der er to værdier: "genstart" - animationen starter igen og "omvendt" - animationen vil gå i omvendt rækkefølge .
- android:startOffset- forsinkelse før animationen starter (i millisekunder)

9. Kombination af flere animationer
Du kan anvende flere typer animationer til et element på samme tid. Hvis vi for eksempel skriver:
< set xmlns:android=" http : // schemas.android.com /apk/res/android " > < alpha android:fromAlpha=" 0.0 " android:toAlpha=" 1.0 " android:duration=" 1000 " /> < rotate android:fromDegrees=" 0 " android:toDegrees=" 360 " android:pivotX=" 50% " android:pivotY=" 50% " android:duration=" 1000 " />
Billedet ændrer gennemsigtighed på 1 sekund (fra helt gennemsigtigt til uigennemsigtigt) og roterer samtidig 360 grader.

Animationer kan indstilles til forskellige varigheder, lad os f.eks varighed = 5000 for at rotere animationen. Nu vil billedet rotere meget langsommere, og gennemsigtigheden vil stadig ændre sig på et sekund.

Ved hjælp af startOffset, kan du gøre animationerne sekventielle. Tilføj roter-attributten startOffset="1000"(det vil sige, at vi laver en forsinkelse svarende til varigheden af ​​den første animation). Nu vil billedet først blive synligt om 1 sekund, og derefter kun rotere 360 ​​grader.

Flere animationer kan kombineres til sæt ved hjælp af tagget. Et sådant tag vil altid være i filen og er root-tagget. Du kan indstille følgende attributter for et sæt:
- varighed(varighed), gentagelses-tilstand(gentag tilstand) - disse attributter vil blive anvendt på hver animation i sættet
- interpolator- definerer animationsinterpolatoren og shareinterpolator- om denne interpolator vil blive anvendt for hver animation i sættet (mulige værdier er "sand" og "falsk")
- startOffset(forsinkelse) - forsinkelse for hele sættet af animationer.
Desværre kan attributten ikke anvendes på sættet repeatCount, det vil sige, at det ikke virker at gentage et sæt animationer flere gange.
Sæt kan være af enhver rede.

10. Oprettelse af animation uden xml
Animation kan laves uden brug af xml, direkte i programkoden. Til dette bruges Animation-efterkommerklasserne:
1) AlphaAnimation for at skabe alfa-animation. Klassekonstruktøren ser ud
AlphaAnimation(flyd fraAlpha, flyd tilAlpha) hvor fromAlpha og toAlpha er henholdsvis de indledende og endelige gennemsigtighedsværdier (fra 0,0 til 1,0)

11. Lad os lave en animation i koden, der, når du trykker på en knap, vil rotere billedet med en tilfældig vinkel (fra 0 til 360) og forstørre det til en tilfældig størrelse (ikke mere end to gange). Til dette formål tilføjede jeg en anden knap randomButton
randomButton.setOnClickListener(new OnClickListener() ( @Override public void onClick(View v) ( Random random = new Random (); //1 RotateAnimation rotate = new RotateAnimation (0, (float )random.nextInt(360), Animation. RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); //2 rotate.setDuration(1000); //3 rotate.setRepeatMode(Animation.REVERSE); //4 rotate.setRepeatCount(1); //5 lang varighed = rotate.computeDurationHint(); //6 float size = random.nextFloat() + 1.0; //7 ScaleAnimation scale = new ScaleAnimation(1.0f, størrelse, 1.0f, størrelse, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO , 0.5f); //8 scale.setDuration(1000); scale.setStartOffset(duration); //9 AnimationSet set = new AnimationSet (false); //10 set.addAnimation(rotate); //11 set.addAnimation (skala); image.startAnimation(sæt); //12 ) ));
1) Opret et tilfældigt objekt for at generere tilfældige tal. Du kan læse mere om Random i dokumentationen; nu er vi interesseret i int nextInt(int n) metoderne - generere et heltal i området fra 0 til n. Og float nextFloat() metoden - genererer et reelt tal fra 0 til 1.
2) Opret en rotationsanimation. Startvinkel = 0, slutvinkel = et tilfældigt tal fra 0 til 360. Animation.RELATIVE_TO_SELF betyder, at vi angiver rotationsmidtpunktet som en procentdel i forhold til bredden af ​​elementet. Glem ikke, at værdien 1,0 svarer til 100%, hvilket betyder, at 0,5f er 50%. Dette betyder, at rotationspunktet vil være i midten af ​​billedet.
3) Indstil animationens varighed til 1000 millisekunder (dette er 1 sekund)
4) Vi definerer gentagelsestilstanden som Animation.REVERSE, det vil sige, når vi gentager animationen, vil vi gå i omvendt rækkefølge.
5) Indstil antallet af yderligere gentagelser = 1. Det betyder, at animationen vil blive gentaget to gange, én gang i fremadgående rækkefølge og én gang baglæns.
6) Long computeDurationHint() metoden beregner, hvor længe animationen vil vare i alt. Der er en getDuration()-metode, men den returnerer simpelthen varighedsværdien, som vi indstiller med setDuration()-metoden. I vores tilfælde sætter vi varighedsværdien til 1000, og metoden getDuration() returnerer 1000 og tager ikke højde for, at animationen gentages to gange, hvilket betyder, at den faktisk vil vare 2000 millisekunder. Metoden computeDurationHint() vil beregne varigheden under hensyntagen til genforsøg og forsinkelser.
7) Beregn den nye størrelse på billedet. Værdien 1,0 er den aktuelle billedskala, så værdien 2,0 betyder, at billedet er fordoblet. Vi genererer et tal fra 0,0 til 1,0 og tilføjer 1, hvilket betyder, at vi får et tal fra 1,0 til 2,0
8) Opret en skaleringsanimation fra den aktuelle billedstørrelse til et tilfældigt genereret tal fra 1,0 til 2,0
9) Indstil en forsinkelse svarende til den samlede varighed af rotationsanimationen. Så den anden animation starter umiddelbart efter slutningen af ​​den første
10) Opret et sæt animationer.
11) Tilføj to oprettede animationer til sættet
12) Anvend et sæt animationer på billedet

12. En anden interessant metode i Animation-klassen
setAnimationListener(Animation.AnimationListener lytter)- indstiller en lytter til ændringer i animationstilstand. Animation.AnimationListener-grænsefladen definerer følgende metoder:
onAnimationStart (animationsanimation)- kaldes når animationen starter
onAnimationRestart (animationsanimation)- kaldet, når animationen gentages
onAnimationEnd(animationsanimation)- kaldet i slutningen af ​​animationen

For eksempel:
anim = AnimationUtils.loadAnimation(this, R.anim.anim); anim.setAnimationListener(ny AnimationListener () ( @Override public void onAnimationEnd(Animation animation) ( Log.d("MY", "animation end" ); ) @Override public void onAnimationRepeat(Animation animation) ( Log.d("MY) " , "animation repeat" ); ) @Override public void onAnimationStart(Animation animation) ( Log.d("MY" , "animation start" ); ) ));
Vi gør ikke noget nyttigt, når vi ændrer animationstilstanden, vi skriver det bare til loggen.

Det er alt. Jeg har fortalt dig det grundlæggende, det er bedre at lære resten gennem eksperimenter :)

Kilder kan downloades her

Betegnelse af metalrør. Lad os se på betegnelserne for de mest almindelige metalrørledninger ifølge GOST. Stålvand- og gasrør i henhold til GOST Betegnelsen af ​​røret angiver den nominelle diameter, længde (ved brug af rør af målt længde) og vægtykkelse. Lad os overveje et eksempel på betegnelsen af ​​et rør med en nominel diameter på 32 mm, en vægtykkelse på 2,8 mm, uden zinkbelægning: Rør 32x2,8 GOST Tilstedeværelsen af ​​en zinkbelægning er angivet med bogstavet C, som er placeret efter ordet "Rør".

Om nødvendigt er et mærke, der angiver tilstedeværelsen af ​​gevind, angivet i rørbetegnelsen. Mærkning af stålrør i henhold til GOST udføres på fabrikken efter produktion og indeholder oplysninger om størrelse, kvalitet af stål, som røret er lavet af, samt producentens varemærke. Størrelsen af ​​mærkets bogstaver og tal er direkte proportional med produktets størrelse og kan påføres ved hjælp af flere metoder.

De mest almindelige er branding og vandfast maling. Kontroltyper og deres betegnelse i produktmærkning er beskrevet i tabellen (tabel); Næste punkt"" angiver vægtykkelse i millimeter; Den fjerde værdi angiver produktets længde i millimeter fra snit til snit, i dette tilfælde er det "".

Sådan dechifreres markeringerne af stålrør: diameter, stålkvalitet og andre indikatorer i henhold til GOST. Symbolerne trykt på stålrøret giver omfattende information om produkter.

Mærkning er en slags pas for et produkt, hvorfra det bliver klart, hvem, hvor og til hvilke formål det er fremstillet. Denne artikel vil fortælle dig, hvordan du korrekt dechifrerer alle markeringssymboler på rør.

Bemærk. Mærkningen af ​​stål (og støbejern) rør er reguleret af GOST nr. af året. Dette dokument definerer alle nuancerne ved at anvende forklarende inskriptioner, deres størrelser, afstande mellem tal osv.

Koldedeformerede sømløse stålrør GOST (sortiment) Denne standard gælder for koldformede sømløse rør generelle formål lavet af kulstof og legeret stål. Diameter: 5 - mm. I rørsymboler er indekset A eller B placeret før stålkvaliteten. Rør fremstilles enten varmebehandlet eller uden varmebehandling.

Enderne af rørene skal skæres i rette vinkler. Metoder til mærkning af stålrør: GOST-standarder, eksempler på afkodning symboler. Ved at læse tallene på produktet kan en specialist bestemme størrelsen på røret, dets type, stålkvalitet, styrke, producent og nogle andre parametre for produktet.

Mærkning af stålrør særligt formål indeholder yderligere markeringer. Produkter til særlige formål omfatter: Rør lavet af legeret stålkvaliteter. 4. REFERENCER Regulative og tekniske dokumenter. Betegnelse NTD. som linket er givet til. W s g -80 GOST yu S1 Varenummer. Ændring nr. 2 GOST - 91 Elektrosvejsede ligesvejsede stålrør.

Sortiment vedtaget af Interstate Council for Standardization, Metrology and Certification ved korrespondance (protokol nr. 45- dateret) Registreret af Bureau of IGU Standards No. De nationale standardiseringsorganer i følgende stater stemte for vedtagelse af ændringen: BY, KG , RU, TJ [alfakoder 2 ifølge MK (ISO)].

Salg og køb. Betegnelse for stålrør. El-svejste stålrør med lige søm. Udvalg. GOST IPK Forlag med standarder. Statsstandard for Unionen af ​​USSR. Direkte søm elektrisk svejste stålrør. Med ornament. Elektrisk svejste stålsvejsesmøremidler. Rækkevidde. GOST Introduktionsdato 1. Denne standard etablerer en række elektrisk-svejsede stålrør med lige søm.

2. Dimensionerne på rørene skal svare til tabellen. 1. 3. I henhold til rørets længde er de fremstillet: af umålt længde Betegnelse på den videnskabelige og tekniske dokumentation, hvortil der henvises. Varenummer. GOST

Kategorier Post navigation

God dag til alle. Jeg vil gerne dedikere dette indlæg til emnet fragmenter til Android. Der er allerede oversættelser og nogle artikler om Habré, der nævner, hvordan man begynder at arbejde med fragmenter til Android. For eksempel artikel. Den indeholder en beskrivelse af, hvad fragmenter er, og i hvilken version af Android de findes, så dem, der endnu ikke er nået til den, kan læse den, hvis de ønsker det, men det vil jeg ikke genfortælle i mit indlæg. Så jeg kommer lige til sagen.

Begyndelse af arbejdet

Lad mig lige kort sige, at fragmenter er brugergrænsefladekomponenter, der kan bruges ved hjælp af aktivitetsklassen til at vise brugerdata, men de livscyklus er ikke afhængig af ham. Funktionaliteten fra fragmenter har bredere funktionalitet til at arbejde med dem end Activity, så deres brug er af ikke ringe betydning for udviklere, hvis de ønsker, at deres applikation skal have en brugergrænseflade, der er mere moderne efter nutidens standarder.

Lad os nu komme til punktet med indlægget. Google-udviklere Fragmenter var efter min mening udstyret med fremragende støtte til animation for at vise selve fragmentet. Dette vil blive diskuteret yderligere. Jeg søgte Habr efter indlæg om dette emne, men jeg fandt ikke noget, så nu vil jeg dele min viden.

Oprettelse af et projekt

Lad os lave et lille projekt. Jeg har lavet et projekt til min Samsung Nexus S, jeg har Android version 4.1.2 der, hvilket er hvad jeg faktisk brugte (Api Level 16). Jeg kaldte selve projektet FragmentsAnimationTest.

Til demonstrationen skal vi bruge hovedaktiviteten og dens layout, et par fragmenter, hver med sit eget layout, og et par xml-filer mere til selve animationen, som jeg vil tale om senere.

Applikationen vil se sådan ud: et af fragmenterne vil blive vist på skærmen, skift mellem dem vil ske vha. almindelig knap, og følgelig vil selve skiftet af fragmenter blive ledsaget af animationseffekter.

Lad os først arrangere hovedaktivitetens elementer i filen activity_main.xml: