Drag and drop põhimõte tähendab. Pukseerimise tehnoloogia

Lihtsam on midagi võtta ja panna, kui kirjutada, mida võtta ja kuhu panna. Loomulikult ei saa ilma hiire või sarnase seadmeta midagi valida ega määrata, kuid isegi praeguses olukorras on pukseerimise idee kasutamine väga loomulik ja mugav.

Idee ulatus ei ole ainult veebipoed, digiraamatukogud, otsing või Infosüsteemid, aga ka rakendusala. Idee on väga rakendatav interaktiivselt, ilma programmeerija osaluseta loodud ja hooldatud saitide ja nende elementide arendamisel.

Idee kirjeldus

Vali, liiguta ja pane – idee on loomulik ja mugav. On lihtsalt hämmastav, et see ei sündinud siis, kui hiirest sai arvuti asendamatu tarvik.

Kõige ilmekam näide on toote valimine veebipoes. Valige hiirega soovitud toode ja lohistage see ostukorvi – lihtsalt, loomulikult ja mugavalt. Faili üleslaadimine: praktiline idee on ka dokumendi viimine brauseriaknast väljapoole ja leheelemendile paigutamine, alustades seeläbi dokumendi edastamist serverisse.

Arendaja jaoks on "lohistamise" idee lehe elementidega manipuleerimine ilma siltide koordinaatide ja suuruste käsitsi ümber arvutamiseta, võimalus valida mitu elementi ja joondada ning liigutada plokkide siltide külgi.

HTML ja CSS - suurepärased keeled siltide ja nende kujundusstiilide kirjeldused, kuid kui arendajal on võimalus lehe elemente interaktiivselt manipuleerida ilma koordinaate ja suurusi käsitsi ümber arvutamata, muudab see töö mugavamaks ja tõhusamaks.

Lihtne failiedastus

"Drag and drop": tõlge inglise keelest vene keelde kõlab sõna otseses mõttes nagu "drag and drop". Praktikas kõlab ja töötab see paremini: vali, vii üle ja lase lahti – lihtsalt ja loomulikult.

Failide edastamine lehel lehele, serverisse või muuks otstarbeks on väga lihtne.

Selles näites valiti hiirega mitu faili töölaual (vasakpoolne joonis). Valiku peal vajutati hiire vasakut nuppu ja valitud "läks" korvi. Brauser ise näitas, kuidas see juhtub, kirjutas "koopia" vihje ja lõi teisaldatavate failide piirjooned.

Kui hiir oli ostukorvi kohal, vabastas külastaja hiire vasaku nupu, toimus lohistamise sündmus ning saidi lehel (alumisel pildil) suutis JavaScripti kood vastu võtta ja töödelda kõiki külastaja esitatud faile. lehele (saidile).

Rakenduse kirjeldus

Seda protseduuri teostav kood on väga lihtne. Isegi algaja arendaja võib seda igal kasutusjuhul korrata.

Siin on kasutajaliidest esindatud kahe sildi abil: scPlaceFile (see on korv ise, kuhu soovite failid panna) ja scPlaceFiles (see on failide töötlemise tulemus, antud juhul nende loend).

Lehe loogika on järgmine. Kui leht laaditakse brauserisse, määratakse "ondrop" sündmuste töötleja ostukorvi - ülejäänud sündmused blokeeritakse ja neid ei kasutata.

Leht töötab normaalselt, kuid niipea, kui külastaja valib faili(d) ja lohistab need ostukorvi pildile ehk scPlaceFile sildi juurde, hakatakse "failid on saabunud" sündmust töötlema.

See töötleja kuvab lihtsalt failide loendi. Nende number on failis event.dataTransfer.files.length ja teave iga faili kohta on failis event.dataTransfer.files[i].name. Mida vastuvõetud andmetega teha, määrab arendaja, sel juhul moodustatakse lihtsalt vastuvõetud failide loend.

Pärast töötlemist sündmus blokeeritakse ja seda ei levitata. See on vajalik selleks, et brauser ei tegeleks amatöörtegevusega ega segaks saadud teabe töötlemist.

DnD ja välisandmed

Piltide üleslaadimine serverisse "pukseerimisega" on selle tehnoloogia puhul tavaline praktika. Tavaliselt loob arendaja faili üleslaadimise vormi (1), mis töötab tavapärasel viisil (2). Külastaja saab tavaline mood valige failid ja laadige need üles.

Kui aga külastaja lohistab ja kukub vormis kindlasse kohta, siis failinime väli (failid) täidetakse automaatselt.

See on hea otsus. Seda, et arvutis hiirt pole, on muidugi väga raske tunnistada. Kuid parem on arendada kasutajaliidest tavapärasel viisil ja DnD-rakenduses.

DnD ja siseandmed

Külastaja huvide eest hoolitsemine on alati oluline, kuid oluline on ka arendaja mure. Pukseerimist saate rakendada mitte ainult tavaliste vahenditega, vaid ka lehe elementide hiiresündmuste käsitlemisega.

Sildi koordinaatide väärtuste ja nende suuruste arvutamise ülesanne tekib pidevalt. Käsitsi arvutamine on hea tava, kuid interaktiivne valik on mugavam. Kõik sildid on alati ristkülikukujulised ning elementide külgedel olevaid hiiresündmusi jälgides saate luua võimaluse elemente automaatselt lehel õigesse kohta teisaldada või neid muuta.

Hiirenupu klõpsamise sündmuse käsitlemine - klõpsu asukoha koordinaatide meeldejätmine, näiteks elemendi üks külg. Liigutage hiirt - külg liigub soovitud suunas. Hiirenupu vabastamine - külg peatub ja selle koordinaadid muutuvad. Nii saate muuta elemendi asukohta või selle suurust.

See ei ole formaalselt lohistamine, kuid efekt on sarnane ja praktiline. Tehes mistahes leheelemendile universaalsed töötlejad, saad hea interaktiivse tulemuse, kiirendad arendust ja lihtsustad koodi.

Visuaalne ja manuaalne programmeerimine

Hiir arvutis ja sõrmed nutitelefonis on täiesti erinevad lähenemised kasutajaliidese juurutamisel (külastaja, arendaja). See on brauseritevahelise ühilduvuse täiesti loomulik ja kaasaegne nõue.

Kõik see kokku muudab lehtede loomise keeruliseks, kuid rakendades selles pukseerimise ideed standardvorm, kasutades selle sündmusi, kombineerides seda ideed tavaliste sündmustega elementidel, saate rakendada mehhanismi, milles lehe loomine toimub visuaalselt.

Vaatame nüüd elemendi või elementide valikut. Valiku fakt - kontekstimenüü välimus, näiteks eesmärk on joondada valitud (vasakule, paremale, keskele) või jaotada elemente vertikaalselt või horisontaalselt sama sammuga või muuta nende suurust (minimaalne, maksimaalne).

Koordinaatide ja mõõtmete automaatne ümberarvutamine on eelistatavam kui käsitsi. Vähem vigu – eesmärk saavutatakse kiiremini. Lisaks saate teha lehe ühes brauseris, salvestada elementide asukohta ja suurust. Nutitelefonis selle lehe avades saate koordinaate ja mõõtmeid parandada ning need meelde jätta konkreetne mudel nutitelefoni või brauseri versioon.

Seega on samal lehel ilma brauseriülese ühilduvuse nõude käsitsi järgimiseta kuvamiseks erinevad andmed erinevaid seadmeid ja erinevates brauserites.

Kui lubate külastajal need protseduurid iseseisvalt läbi viia, samuti valite arendaja poolt pakutavate hulgast välja vajalikud leheelemendid, saate kasutaja arvamust arvestades tagada brauseritevahelise ühilduvuse ja lehe vajaliku funktsionaalsuse. .

Pukseerimisfunktsioon võib aidata teie iPadi jõudlust suurendada. Siin on, kuidas saate seda kasutada.

Nii saate teisaldada faili ühest pilvesalvestusteenusest teise, kopeerida teksti Safarist tekstitöötlusrakendusse, et lisada tsitaat või luua varukoopia teatud fotod failisalvestusrakenduses.

Kuidas pukseerida fotosid, faile ja teksti

1. Puudutage ja hoidke all fotot, faili või esiletõstetud teksti, mille soovite teise rakendusse lohistada.

2. Lohistage element soovitud asukohta see rakendus või mõni muu, mille olete avanud Slide Over või Split View ja vabastage.

Kuidas pukseerida mitu fotot või faili korraga

1. Puudutage pikalt üht fotot või faili, mida soovite lohistada.

2. Praeguse üksuse lohistamise ajal puudutage teist fotot või faili, mida soovite samuti lohistada. Tehke seda uuesti nii paljude elementidega, kui soovite liigutada.

3. Lohistage kõik valitud objektid nende määratud asukohta teises rakenduses, mille olete avatud vaates Slide Over või Split View, ja vabastage need.

Kuidas lohistada teksti ühest rakendusest teise

1. Puudutage ja hoidke seda teksti osa, mida soovite lohistada, et see valida.

2. Kasutage valikupunkte, et tõsta esile ülejäänud tekst, mida soovite lohistada.

3. Vajutage ja hoidke valitud teksti all.

4. Lohistage tekst rakendusse, kuhu soovite selle paigutada, ja vabastage see.

Kuidas muuta mitme rakenduse ikoonide asukohta korraga "Drag and Drop" abil

Kuigi enamik iOS-i pukseerimisfunktsioone töötab ainult iPadis, töötab see trikk tegelikult nii iPhone'is kui ka iPadis. See võimaldab teil korraldada rakenduste asukohta avakuval kasutades « Lohistage", selle asemel, et neid ükshaaval liigutada.

1. Puudutage pikalt selle rakenduse ikooni, mille asukohta soovite avakuval ümber paigutada.

2. Puudutage täiendavaid rakendusi, mida soovite samuti teisaldada.

3. Lohistage need rakendused lehele või kausta, kuhu soovite, ja pukseerige need.

182

Selles näites valime div elemendi ja muudame selle teisaldatavaks, kutsudes seda lohistatav() meetod. Nagu alloleval joonisel näha, võtab element avatud dokumendis oma tavapärase positsiooni, kuid pärast seda saab selle hiirekursoriga brauseriaknas suvalisse kohta liigutada:

Pukseerimisfunktsioon on iseenesest kasulik, kuid veelgi kasulikum, kui seda kasutatakse koos pukseeritava interaktsiooniga, mida kirjeldatakse järgmisena.

Lohistav interaktsioon rakendatakse ainult konkreetse HTML-i märgistuse ja CSS-stiilide kasutamise kaudu. See tähendab, et see funktsioon töötab peaaegu igas brauseris, kuid sellega varustatud elemendid ei saa töötada sarnaste loomulike pukseerimisseadmetega. operatsioonisüsteemid.

HTML5 spetsifikatsiooniga määratletud pukseerimistoiminguid rakendatakse tavaliselt operatsioonisüsteemi algmehhanismide abil. Kui kasutate jQuery kasutajaliidese pukseerimismehhanismi, on konfliktide vältimiseks kõige parem keelata HTML5 ekvivalendid. Selleks määrake dokumendi kehaelemendi lohistatava atribuudi väärtuseks false.

Lohistava interaktsiooni kohandamine

Lohistava interaktsiooni jaoks on palju kohandamisvalikuid. Järgmistes jaotistes käsitletud olulisemad omadused on kokku võetud allolevas tabelis:

Lohistavad interaktsiooni omadused
Kinnisvara Kirjeldus
telg Piirab liikumist teatud suundades. Vaikeväärtus on false, mis tähendab, et piiranguid pole, kuid saate määrata ka väärtuse "x" (liiguta ainult piki x-telge) või "y" (liiguta ainult piki y-telge).
ohjeldamine Piirab ujuva elemendi asukoha ekraani teatud alaga. Toetatud väärtustüüpe kirjeldatakse allolevas tabelis koos vastava näitega. Vaikeväärtus on false, see tähendab, et piiranguid pole
viivitus Määrab aja, mille jooksul elementi tuleb enne liigutamist lohistada. Vaikeväärtus on 0, mis tähendab, et viivitust pole
vahemaa Määrab kauguse, mille kasutaja peab elemendi algpositsioonist lohistama, enne kui see tegelikult liigub. Vaikeväärtus on 1 piksel
võre Sunnib teisaldatud elemendi sidumist ruudustiku rakkudega. Vaikeväärtus on false, mis tähendab, et sidumist pole

Liikumissuundade piiramine

Elemendi liikumist teatud suundades saate piirata mitmel viisil. Esimene neist on telje valiku kasutamine, mis võimaldab piirata liikumissuunda X- või Y-teljega.Näide on toodud allpool:

...

Lohistage vertikaalselt
Lohistage horisontaalselt
Käivita näide

Selles näites määratleme kaks div elementi, valige need nupuga jQuery ja kutsuge välja draggable() meetod. See meetod edastatakse objektile, mis algselt piirab mõlema div-i liikumist piki x-suunda. Seejärel rakendades jQuery filter() meetodit, saame valida dragV elemendi ilma, et jQuery kogu dokumendist uuesti otsiks ja seada see teisele lubatud liikumisele suund - piki Y-telge Nii saame dokumendi, milles ühte div elementi saab lohistada ainult vertikaalsuunas ja teist - ainult horisontaalsuunas. Tulemus on näidatud joonisel:

Elemendi teisaldamiseks lubatud ala piiramine

Samuti saate piirata ekraani ala, kuhu saate elementi lohistada. Selleks kasutatakse ohjeldamise võimalust. Selle valikuga määratavaid väärtusvorminguid kirjeldatakse allolevas tabelis.

Allpool on toodud näide isoleerimisvaliku kasutamisest:

...

Lohistage horisontaalselt
Lohistage vanema sisse
Käivita näide

Selles näites on mõlemad elemendid sunnitud liikuma nii, et neid saab ainult sisse lohistada vanem element, mis on fikseeritud suurusega div element. Ühe teisaldatava Divi jaoks, mille telje valik on sisestatud täiendav piirang, mis tähendab, et see saab liikuda ainult põhielemendi sees horisontaalselt. Tulemust illustreerib joonis:

Elemendi teisaldamise võimaluse piiramine ruudustiku lahtritesse

Ruudustik võimaldab teil määrata teisaldatud elemendi sidumise ruudustiku lahtritega. See suvand aktsepteerib kahe elemendi massiivi, mis määrab ruudustiku lahtrite laiuse ja kõrguse pikslites. Allpool on toodud näide ruudustiku valiku kasutamisest.

...

lohista mind
Käivita näide

Selles näites on ruudustikuks seatud 100 pikslit lai ja 50 pikslit kõrge. Kui lohistad elementi, siis see "hüppab" ühest (nähtamatust) lahtrist teise. Snapping-efekt on interaktsioonifunktsioonide jaoks suurepärane kasutusjuht, kuid seda on ekraanipiltidega raske edasi anda.

Saate luua klõpsamise efekti ainult ühe suuna jaoks, määrates vaba liikumise telje väärtuseks 1. Näiteks kui määrate ruudustiku valikuks , klõpsab element horisontaalselt liikudes 100 piksli laiuste ruudustiku lahtrite külge, kuid vertikaalselt liigub see vabalt .

Reisi hilinemine

Ujuva elemendi lohistamist edasi lükata on kaks võimalust. Viivitusvalikuga saate määrata aja millisekundites, mille jooksul kasutaja peab hiirekursorit lohistama enne elemendi tegelikku teisaldamist. Teist tüüpi viivitust pakub vahemaa valik, mis määrab pikslites kauguse, mille kasutaja peab hiirekursorit lohistama, enne kui element sellele järgneb.

Mõlema sätte kasutamise näide on toodud allpool:

...

Blokeeri viivitusega
Blokeeri minimaalse vahemaaga
Käivita näide

Selles näites on kaks ujuvat elementi, millest ühel on viivitussuvandiga määratud viivitus ja teisel on suvand vahemaa.

Viivituse suvandiga määratud viivituse korral peab kasutaja määratud aja lohistama, enne kui elementi tegelikult liigutab. Selles näites on selle vahe kestus 1000 ms. Selle aja jooksul ei ole vaja hiirt liigutada, kuid hiirenupp peab jääma all hoidma kogu viiteperioodi, misjärel saab elementi hiirt liigutades liigutada. Pärast viivitusaja möödumist klõpsab teisaldatav element hiirekursori asendisse vastavalt varem käsitletud ruudustiku, piirkonna ja telje valikute kehtestatud piirangutele.

Sarnase efektiga on ka kaugusvalik, kuid sel juhul peab kasutaja hiirekursorit elemendi alguskohast suvalises suunas lohistama vähemalt määratud arvu piksleid. Teisaldatav element hüppab seejärel kursori praegusesse asukohta.

Kui rakendate samale elemendile mõlemad sätted, siis teisaldatav element ei liigu enne, kui mõlemad viivituse kriteeriumid on täidetud, s.t. kuni elemendi lohistamise katse kestab määratud aja ja kuni hiirekursor liigutab määratud arvu piksleid.

Lohistavate interaktsioonimeetodite kasutamine

Kõik lohistatava interaktsiooni jaoks määratletud meetodid kuuluvad põhimeetodite komplekti, mida olete vidinates juba näinud. Lohistava interaktsiooni spetsiifilisi meetodeid ei pakuta, seega me neid üksikasjalikult ei käsitle. Saadaolevate meetodite loend on näidatud allolevas tabelis:

Lohistavate interaktsioonisündmuste kasutamine

Lohistav interaktsioon toetab lihtsat sündmuste kogumit, mis teavitab elementi lohistamisest. Neid sündmusi kirjeldatakse allolevas tabelis:

Nagu vidinate sündmuste puhul, saab ka nendele sündmustele reageerida. Alus- ja peatumissündmuste käsitlemise näide on näidatud allpool:

...

lohista mind
Käivita näide

See näide kasutab algus- ja lõpetamissündmusi, et muuta elemendi tekstisisu lohistamise käigus. See eelis tuleneb asjaolust, et lohistatav interaktsioon rakendatakse täielikult HTML-i ja CSS-i abil: jQuery abil saate muuta ujuva elemendi olekut isegi siis, kui see liigub üle ekraani.

Kukutava interaktsiooni kasutamine

Mõnes olukorras võib piisata ainult elemendi lohistamisest, kuid see on kõige kasulikum, kui seda kasutatakse koos pukseeritava interaktsiooniga.

Elemendid, millele on rakendatud pukseeritavat interaktsiooni (aksepteerivad elemendid), saavad võimaluse vastu võtta pukseeritava interaktsiooniga loodud kukutatavaid elemente.

Vastuvõtvad elemendid luuakse koos droppable() meetod, kuid kasulike funktsioonide saamiseks peate looma sündmuste töötlejad nende hulgast, mis on seda tüüpi suhtluse jaoks määratletud. Saadaolevad sündmused on näidatud allolevas tabelis:

Loobutavad interaktsioonisündmused
Sündmus Kirjeldus
luua Tekib siis, kui elemendile rakendatakse pukseeritavat interaktsiooni
aktiveerida Esineb siis, kui kasutaja hakkab ujuvat elementi lohistama
desaktiveerida Tekib siis, kui kasutaja lõpetab ujuva elemendi lohistamise
läbi Esineb siis, kui kasutaja lohistab ujuva elemendi üle vastuvõtva elemendi (kuid eeldusel, et hiirenuppu pole veel vabastatud)
välja Tekib siis, kui kasutaja lohistab ujuva elemendi vastuvõtvast elemendist väljapoole
tilk Tekib siis, kui kasutaja jätab vastuvõtvale elemendile ujuva elemendi

Allpool on toodud näide lihtsa vastuvõtuelemendi loomisest, millel on üks langussündmuste töötleja.

...

lahku siit
lohista mind
Käivita näide

Selles näites lisatakse dokumendile div element, mille tekstisisu kujutab string "Jäta see siia". Valime selle elemendi jQuery abil ja kutsume välja droppable() meetodi, edastades sellele sätteobjekti, mis määratleb kukkumissündmuse käitleja. Selle sündmuse vastuseks on ujuva elemendi teksti muutmine meetodi text() abil.

Selles näites loodud interaktiivne pukseerimiskogemus on kõige lihtsam, kuid pakub kasulikku konteksti võimaluste selgitamiseks. ühine töö Pukseeritavad ja pukseeritavad interaktsioonid. Elementide lohistamise ja kukutamise protsessi erinevad etapid on kujutatud joonisel:

Kõik see tundub väga lihtne. Lohistame teisaldatavat elementi, kuni see on vastuvõtva elemendi kohal, ja vabastame selle. Kukkunud element jääb sinna, kuhu see jäeti, ja selle tekstisisu muutub vastusena kukutamissündmusele. Järgmistes jaotistes näidatakse, kuidas kasutada muid pukseeritavaid interaktsioonisündmusi kasutajakogemuse parandamiseks.

Sihtmärgi vastuvõtva objekti esiletõst

Aktiveerimis- ja deaktiveerimissündmuste abil saate sihtmärgi vastuvõtva objekti esile tõsta, kui kasutaja alustab elemendi lohistamist. Paljudes olukordades on see idee väga viljakas, kuna annab kasutajale usaldusväärse ülevaate selle kohta, millised elemendid on pukseerimismudeli osad. Vastav näide on näidatud allpool:

... $(function() ( $("#draggable").draggable(); $("#droppable").droppable(( drop: function() ( $("#draggable").text("Droppable" ") ), aktiveerige: function() ( $("#droppable").css(( ääris: "keskmine topeltroheline", backgroundColor: "lightGreen" )); ), deaktiveeri: function() ( $("#droppable" ").css("ääris", "").css("taustavärv", ""); ) )); )); ... Käitage näide

Niipea kui kasutaja hakkab elementi lohistama, käivitub meie vastuvõtva elemendiga seotud aktiveerimissündmus ja töötleja funktsioon kasutab muutmiseks meetodit css(). CSS-i atribuutide piir ja selle elemendi taustavärv. Selle tulemusena tõstetakse esile sihtmärgi vastuvõttev element, mis näitab kasutajale, et selle ja teisaldatava elemendi vahel on ühendus.

Deaktiveerimissündmust kasutatakse CSS-i atribuutide väärtuste eemaldamiseks vastuvõtvast elemendist ja lähtestamiseks niipea, kui kasutaja hiirenupu vabastab. (See sündmus käivitub alati, kui elemendi lohistamine peatub, olenemata sellest, kas lohistatav element jääb vastuvõtvale elemendile või mitte.) Seda protsessi illustreerib joonis:

Elementide kattumise käsitlemine

Drag-and-drop tehnoloogiat saab täiustada, lisades sellele sündmuste haldamise. Üleminek toimub siis, kui 50% teisaldatavast elemendist on vastuvõtva elemendi mis tahes osa kohal. Väljundsündmus käivitub, kui varem kattuvad elemendid enam ei kattu. Nendele sündmustele reageerimise näide on näidatud allpool:

$(function() ( $("#draggable").draggable(); $("#droppable").droppable(( drop: function() ( $("#draggable").text("Droppable") ) , aktiveerige: function() ( $("#droppable").css(( ääris: "keskmine topeltroheline", backgroundColor: "lightGreen" )); ), deaktiveeri: function() ( $("#droppable"). css("border", "").css("taustavärv", ""); ), over: function() ( $("#droppable").css(( ääris: "keskmine topeltpunane", taustavärv : "punane" )); ), out: function() ( $("#droppable").css("border", "").css("background-color", ""); ) )); ); Käivita näide

Siin kasutatakse samu käitleja funktsioone, mis eelmises näites, kuid antud juhul on need seotud üle ja välja sündmustega. Kui vähemalt 50% ujuvast elemendist kattub vastuvõtva elemendiga, on see raamitud ja selle taustavärv muutub, nagu on näidatud joonisel:

Seda 50% piiri nimetatakse tolerantsi läveks, mille saab määrata vastuvõtva elemendi loomisel, nagu järgmisena näidatakse.

Loobutav interaktsiooni seadistus

Kukkutaval interaktsioonil on mitmeid atribuute, mida saate selle käitumise kohandamiseks muuta. Need omadused on loetletud allolevas tabelis:

Kukkutavad interaktsiooni omadused
Kinnisvara Kirjeldus
puudega Kui see valik on tõene, on pukseeritava interaktsiooni funktsioon esialgu keelatud. Vaikeväärtus on false
aktsepteerima Kitsendab ujuvate elementide komplekti, millele vastuvõttev element reageerib. Vaikeväärtus on *, see sobib mis tahes elemendiga
ActiveClass Määrab klassi, mis määratakse vastuseks aktiveerimissündmusele ja eemaldatakse vastusena desaktiveerimise sündmusele
hoverClass Määratleb klassi, mis määratakse vastuseks üle-sündmusele ja eemaldatakse vastusena väljumissündmusele.
sallivus Määrab minimaalse kattumise taseme, mille korral ülejuhtimine toimub

Lubatud ujuvate elementide piirang

Saate piirata kukutatavate elementide kogumit, mille vastuvõetav element, millel on pukseeritava koostalitlusvõime funktsioon, kasutades aktsepteerimisvalikut. Aktsepteerimisvaliku väärtus peaks olema valija. Selle sündmuse tulemusena tekivad pukseeritavad interaktsioonid ainult siis, kui teisaldatav element vastab määratud valijale. Vastav näide on näidatud allpool:

...

lahku siit
1. element
2. element
Käivita näide

Selles näites on kaks ujuvat elementi ID-ga drag1 ja drag2. Aktsepteeriva elemendi loomisel kasutatakse aktsepteerimisvalikut, millega näitame, et ainult drag1 element on aktsepteeritav ujuvelement.

Elementi drag1 lohistades näete sama efekti, mis eelmistes näidetes. Aktiveerimise, desaktiveerimise, üle ja välja sündmused käivituvad vastuvõtval elemendil sobival ajal. Samal ajal, kui lohistate drag2 elemendi, mis ei vasta aktsepteerimisparameetris määratud valijale, siis neid sündmusi ei käivitata. Seda elementi saab vabalt liigutada, kuid vastuvõttev element ei aktsepteeri seda.

Pange tähele muudatust selles, kuidas valite vastuvõetava ujuva elemendi, millel teksti() meetodit kutsuda. Kui dokumendis oli ainult üks ujuv element, piisas selleks id atribuudist:

Drop: function() ( $("#draggable").text("Tõrjutud") ),

Selles näites on kaks ujuvat elementi ja id atribuudi järgi valimine ei anna soovitud tulemust, kuna sel juhul muutub tekst alati samas ujuvelemendis, olenemata sellest, milline neist on vastuvõtvale elemendile vastuvõetav.

Lahenduseks on kasutada kasutajaliidese objekti, mille jQuery kasutajaliides pakub iga sündmuse töötleja jaoks lisaargumendina. UI-objekti lohistatav atribuut tagastab jQuery objekti, mis sisaldab elementi, mida kasutaja lohistab või üritab sihtelemendile kukutada, võimaldades soovitud elemendi valida järgmiselt:

Drop: function(event, ui) ( ui.draggable.text("Dropped")),

Kattumisläve muutmine

Vaikimisi käivitub ülesündmus ainult siis, kui vähemalt 50% teisaldatavast elemendist kattub vastuvõtva elemendiga. Selle läve kattumise suurust saab muuta tolerantsivaliku abil, mis võib võtta allolevas tabelis näidatud väärtused:

Kaks väärtust, mida ma kõige sagedamini kasutan, sobitamine ja puudutamine, on need, mis on kasutajatele kõige mõistlikumad. Kasutan sobitusväärtust, kui lohistatud element peaks jääma vastuvõtva elemendi piirkonda, kuhu see teisaldati, ja puuteväärtust, kui lohistatud element peaks naasma oma algsesse asukohta (näide tuuakse hiljem). Sobivus- ja puuteparameetrite kasutamise näide on näidatud allpool:

Klooni väärtus käsib jQuery kasutajaliidesel luua ujuva elemendi koopia koos kogu selle sisuga ja kasutada tulemust abielemendina. Tulemus on näidatud joonisel:

Abielement eemaldatakse, kui kasutaja laseb liigutatava elemendi kohal hiirenupu lahti, jättes teisaldatava elemendi ja vastuvõtva elemendi algsesse asendisse.

Nagu joonisel näha, jääb algne ujuvelement oma kohale ja ainult abielement liigub üle ekraani hiirekursori järel. Kui teisaldatava elemendi suurus on suur, nagu meie näites, siis katab see ülejäänud dokumendi elemendid, mistõttu on kasutajal raske isegi vastuvõtva elemendi asukohta jälgida. Seda probleemi saab lahendada, pakkudes abistava suvandi väärtuseks funktsiooni, nagu on näidatud allolevas näites:

... $(function() ( $("div.draggable")..png"/>") ) )); $("#basket").droppable(( activeClass: "active", hoverClass: "hover" )); )); ... Käitage näide

Kui kasutaja hakkab elementi lohistama, kutsub jQuery kasutajaliides funktsiooni, parameeter abimees ja kasutab tagastatud elementi teisaldatava objektina. Sel juhul kasutan elemendi img loomiseks jQueryt. Tulemus on näidatud joonisel:

Väike pilt toimib ujuva elemendi kohahoidjana, muutes dokumendi muude elementide jälgimise palju lihtsamaks.

Kasutajaliidese objekt, mille jQuery kasutajaliides pukseeritavatele interaktsioonisündmustele edastab, sisaldab abistaja atribuuti ja seda atribuuti saab kasutada abielemendiga manipuleerimiseks selle lohistamise ajal. Allpool on näidatud näide selle atribuudi kasutamisest koos üle- ja väljalülitustega:

... $(function() ( $("div.draggable")..png"/>") ) )); $("#basket").droppable(( activeClass: "active", hoverClass: "hover", over: function(event, ui) ( ui.helper.css("border", "paks tahke #27e6ed") ) , out: function(event, ui) ( ui.helper.css("border", "") ) )); )); ...

Siin kasutatakse üle- ja väljasündmusi ning atribuuti ui.helper, et kuvada abielemendi ümber ääris, kui see kattub hostelemendiga. Tulemus on näidatud joonisel:

Kinnitage elementide servad

Via kiirvalikud on võimalik saavutada, et teisaldatav element "tõmbub" nende elementide servade poole, millest see läbi läheb. Selle valiku väärtuseks on valija. Ujuv element klõpsab mis tahes elemendi servadele, mis vastavad määratud valijale. Snap-suvandi kasutamise näide on näidatud allpool:

Käivita näide jQuery kasutajaliides

Korv
Lõastage siin
lohista mind

Kui liigutatav element läheneb mõnele sobitatud elemendile, "tõmmatakse" see selle külge nii, et nende külgnevad servad puutuvad kokku. Sellise sidumise jaoks saate valida mis tahes elemendi, mitte ainult vastuvõtva elemendi. Selles näites olen lisanud div-elemendi ja määranud snap-suvandi väärtuse, mis valib selle elemendi dokumendis ja ka vastuvõtva elemendi.

Seal on paar alamvalikut, mis võimaldavad teil täpsustada, kuidas elemendid ankurdamisel käituvad. Üks neist on snapMode valik. Seda saab kasutada köitmise tüübi määramiseks. Lubatud on järgmised väärtused: sisemine(kinnitage elementide siseservadele), välimine(kinnitage elementide välisservadele) ja mõlemad(kinnitage kõik servad; vaikimisi).

snapTolerance valik võimaldab määrata, kui kaugele peab ujuv element sihtelemendi serva lähedale jõudma, enne kui klõpsamine toimub. Vaikeväärtus on 20, mis tähendab 20 pikslit. Näites kasutatakse väärtust 50, mis vastab ankrule suuremal kaugusel. Selle valiku jaoks on väga oluline valida õige väärtus. Kui suvandi snapTolerance väärtus on liiga madal, siis ei pruugi kasutaja klõpsamisefekti märgata ja kui see on liiga kõrge, hakkab liigutatav element ootamatult hüppama, klõpsates eemal asuvatele elementidele.

VCL-i teegi jaoks on Borland rakendanud oma Drag&Drop liidese versiooni (tõlkes "drag"). See liides on sisemine - saate saata ja vastu võtta mis tahes Delphi juhtelemente vormi sees "(välja arvatud vorm ise). See on realiseeritud ilma vastavaid Windows API funktsioone kasutamata - neid tuleb kasutada teiste ülesannetega suhtlemise korraldamisel pukseerimise teel. .

Vajutades hiire vasakut nuppu juhtelemendi kohal, saame selle "lohistada" mis tahes muule elemendile. Programmeerija seisukohalt tähendab see seda, et võtme lohistamise ja vabastamise hetkedel genereeritakse teatud sündmused, mis edastavad kogu vajaliku info – osuti lohistatavale objektile, kursori jooksvad koordinaadid jne. Sündmuse vastuvõtja on element mille peal on Sel hetkel kursor asub. Sellise sündmuse käitleja peab süsteemile teatama, kas antud juhtelement võtab "saatmise" vastu või mitte. Kui nupp vastuvõtja juhtseadme kohal vabastatakse, käivitatakse sõltuvalt vastuvõtja valmisolekust veel üks või kaks sündmust.

Tühista Lohistage Tühistab praeguse pukseerimise või pukseerimise toimingu.

Funktsioon FindDragTarget (const Pos: TPoint ;AllowDisabled: Boolean ): TControl ;

Funktsioon tagastab põhiklassi objekti TControl , mis viitab ekraani asukohale parameetri Pos määratud koordinaatidega. Seda funktsiooni kasutatakse pukseerimis- või pukseerimistoimingu võimaliku adressaadi määramiseks. Kui määratud asukoha jaoks pole akna juhtelementi, naaseb funktsioon null . Parameeter AllowDisabled määrab, kas keelatud objekte võetakse arvesse.

Funktsioon IsDragObject(Saatja: TObject): Boolean ;

Funktsioon määrab, kas parameetris Sender määratud objekt on klassi järeltulija TDragObject . See funktsioon saab kasutada sündmuste käitlejates OnDragOver ja OnDockOver parameetrina Source, et teha kindlaks, kas lohistatud objekt aktsepteeritakse. Samuti funktsioon IsDragObjectsaab kasutada Source parameetrina OnDragDropi ja OnDockDropi sündmuste töötlejates, et lohistatavat objekti õigesti tõlgendada.

DragMode, DragCursor omadused, BeginDrag, OnDragOver, OnDragDrop, OnEndDrag, OnStartDrag meetodid, Aktsepteeri parameeter

Widowsis kasutatakse laialdaselt teabe hiirega ühelt objektilt teisele lohistamise protsessi, saate faile kaustade vahel teisaldada, kaustu ise teisaldada ja palju muud.

Kõik pukseerimisprotsessiga seotud atribuudid, meetodid ja sündmused on määratletud klassis TControl, mis on kõigi Delphi visuaalsete komponentide vanem. Seetõttu on need kõigile komponentidele ühised.

Lohistamise algus määratakse atribuudiga DragMode, mille saab määrata projekteerimise ajal või programmiliselt võrdseks väärtusega dmManual või dmAutomatic. Väärtus dmAutomatic (automaatne) määrab lohistamisprotsessi automaatse käivitamise, kui kasutaja klõpsab hiire nuppu komponendi kohal. Kuid sel juhul ei toimu kasutaja hiirenupu vajutamisega seotud OnMouseDowni sündmust selle komponendi puhul üldse.

Komponentide edastamise ja vastuvõtmise liides ilmus juba ammu. See pakub kahe juhtelemendi vahelist suhtlust rakenduse täitmise ajal. Sel juhul saab teha kõik vajalikud toimingud. Vaatamata rakendamise lihtsusele ja arendusajastule peavad paljud programmeerijad (eriti algajad) seda mehhanismi ebaselgeks ja eksootiliseks. Kuid pukseerimise kasutamine võib olla väga kasulik ja hõlpsasti rakendatav. Nüüd kontrollime seda.

Mehhanismi toimimiseks tuleb vastavalt konfigureerida kaks juhtnuppu. Üks peab olema allikas (Allikas), teine ​​- vastuvõtja (Target). Sel juhul allikas ei liigu kuhugi, vaid registreeritakse ainult sellisena mehhanismis.

Uskuge mind, seda on piisavalt lihtne muuta X,Y koordinaadid, edastatakse sündmuste OnDragOver ja OnDragDrop parameetrites vormikoordinaatideks.

Töötage selle komponendi atribuutidega Vasak ja Ülemine, mille kohal kursor liigub. Toon lihtsa näite. Asetage vormile Memo komponent ja määrake selle atribuudiks Align väärtuseks alTop. Asetage vormile paneel, määrake ka atribuudi Joonda väärtuseks alTop ja atribuudi Kõrgus väärtuseks väike, näiteks 6 või 7 pikslit. Määrake DragMode väärtuseks dmAutomatica ja DragCursor väärtuseks crVSplit. Asetage teine ​​Memo komponent ja seadke Joonda väärtusele alClient. Valige paneel korraga mõlemad memod ja looge ühine OnDragOveri sündmuste käitleja, nagu allpool näidatud.

Hiljuti tuli mul idee arendada Androidi mäng. Alustuseks otsustasin kirjutada malet. Ma arvasin, et tehnoloogia Tõmba ja lase lahti ideaalne kujundite liigutamise mehhanismi rakendamiseks. Asjatundmatute jaoks märgin selle ära lohistamise meetod on võimaluses lohistada mõnda graafilist objekti teistele ja sooritada pärast vabastamist üht või teist toimingut. Lihtsaim näide- eemaldage otsetee arvuti töölaualt, lohistades selle prügikasti. Sildi prügikasti "viskades" ütleme süsteemile, et tahame panna need kaks objekti omavahel suhtlema. Süsteem võtab meie signaali vastu ja otsustab, mida ta peaks tegema. Pukseerimine on oma intuitiivse selguse tõttu laialt levinud. Seda lähenemisviisi toetab meie kogemus reaalse maailma objektidega suhtlemisel ja see toimib suurepäraselt virtuaalses keskkonnas. Mis puutub malesse, siis lohistamise abil on tehnoloogiliselt lihtsam määrata lahtrit, kuhu kasutaja nupu lohistas, kuna lahtri numbrit pole vaja langetamispunkti koordinaatide järgi arvutada. Selle töö võtab üle virtuaalmasin.

Drag n Drop tehnoloogia kasutamise eesmärgid

Pukseerimistehnoloogia kasutamine võimaldab mul vähese verega lahendada kolm probleemi:

  1. Liikumise visualiseerimine. Kui kasutaja puudutab kujundit ja hakkab seda ekraanil liigutama, asendatakse kujund väiksema joonisega. Seega saab kasutaja aru, et joonis on jäädvustatud.
  2. Figuuri liikumisala piirasin tahvli mõõtmetega.
  3. Kui kasutaja vabastab kujundi vales kohas, peaks see naasma algsesse asendisse.

Ülesanded on määratletud, alustame nende elluviimist.

Asendage ImageView puudutusega

Kõik minu kujundid on ImageView objektid. Kahjuks selgus, et Drag & Dropi juurutamine Androidis ei võimalda "otse karbist väljas" asendada objekti pilti, kui seda puudutada. Sellegipoolest on see ülesanne API abil üsna lahendatav. Peame tegema mitmeid lihtsaid samme:

  1. Looge DragShadowBuilderi objekt.
  2. Kutsuge meetod startDrag.
  3. Peida kujundit kuvav ImageView, kutsudes parameetriga View.INVISIBLE välja meetodi setVisibility. Selle tulemusena jääb ekraanile ainult DragShadowBuilder objekt, mis annab kasutajale märku, et kujund on jäädvustatud.

Need toimingud tuleb rakendada ImageView objekti OnTouchListneri käitlejas. Selleks alistame onTouchi meetodi:

@Override public boolean onTouch(vaatevaade, MotionEvent motionEvent) ( if (motionEvent. getAction() == MotionEvent. ACTION_DOWN) ( ClipData clipData= ClipData. newPlainText("" , "" ) ; Vaade. DragShadowBuilder uusBuilderShadowBuilder. (vaade) ;view.startDrag(clipData, dsb, view, 0 ) ;view.setVisibility(View.INVISIBLE) ; return true ; ) else ( return false ; ) )

Kõik on väga lihtne. Niisiis, kui pildi asendamine on välja mõeldud, liigume edasi järgmise ülesande juurde.

Pukseerimisfunktsiooni lohistamisala piiramine

Lohistamisala piiramine on seotud ühe probleemiga. Fakt on see, et kui vabastate kujundi väljaspool tahvlit, siis kukkumissündmust ei juhtu, kuna kasutaja kukutas objekti tühja kohta ja objektil pole millegagi suhelda. Selle tulemusena ei naase kujund oma algsesse olekusse ja jääb igaveseks varjatuks. Olen kulutanud palju aega dokumentatsiooni lugemisele, kuid pole leidnud võimalust piirata objektide lohistamisala. Ilmutus tuli ootamatult. Ma ei pea üldse pindala piirama, ma pean teadma, kas kasutaja on figuuri õigesti vabastanud või mitte.

Õige väljalaske määramine
Leidsin vastused oma küsimustele Androidi arendajate saidi jaotisest "Puhistamislõpu sündmuste käsitlemine". Siin on mõned põhipunktid.

  1. Kui kasutaja lõpetab lohistamise, käivitatakse DragListenersi töötlejas sündmus ACTION_DRAG_ENDED.
  2. DragListeneris saate üksikasjalikumat teavet lohistamise kohta, kutsudes välja meetodit DragEvent.getResult().
  3. Kui DragListener tagastab vastuseks sündmusele ACTION_DROP tõene, tagastab väljakutse getResult samuti tõene, vastasel juhul tagastab see vale.

Nii et ma pean tabama sündmust ACTION_DRAG_ENDED ja kutsuma meetodit getResult. Kui see tagastab vale, lohistas kasutaja kujundi tahvlilt maha ja ma pean ImageView nähtavaks tegema.

@Override public boolean onDrag(View view, DragEvent dragEvent) ( int dragAction= dragEvent. getAction() ; View dragView= (View) dragEvent. getLocalState() ; if (dragAction== DragEvent. ACTION_DRAG_EXITED) ( includeDragable)= else false ; if (dragAction== DragEvent. ACTION_DRAG_ENTERED) ( includeDragable= true ; ) else if (dragAction== DragEvent. ACTION_DRAG_ENDED) ( if (dropEventNotHandled(dragEvent) ) ( dragView. setVisibility(View. VISIBLE)Action= (DragEvent) else ; = DragEvent. ACTION_DROP& amp;& amp; sisaldabDragable) ( checkForValidMove((ChessBoardSquareLayoutView) vaade, dragView) ; dragView. setVisibility(View. VISIBLE) ; ) return true ; ) privaatne tõeväärtus dropEventNotHandled(DragEvent) dragEvent (DragEvent returns ) ;)

Nüüd saab kasutaja figuuri kõikjal vabastada ja midagi kohutavat ei juhtu.

Lubatud käikude määramine

Artikli viimane osa on pühendatud kasutaja tehtud käigu õigsuse kontrollimisele. Enne selle teema üksikasjalikku käsitlemist teen väikese märkuse, mis selgitab oma taotluse ülesehitust. Kabelaud on esitatud tabelipaigutusena ja iga lahter on lineaarse paigutuse järeltulija ja sellel on OnDragListener.

Lisaks viitab iga OnDragListener "vahendaja" objektile, mis hoolitseb mänguobjektide interaktsiooni eest ja jätab meelde praeguse lahtri asukoha.

Kui kasutaja lohistab kujundi üle lahtri, on võimalikud järgmised toimingud.

  1. Sündmuse ACTION_DRAG_ENTERED kasutamine muutuja „containsDraggable” määramiseks tõeseks.
  2. Sündmuse ACTION_DRAG_EXITED kasutamine muutuja „containsDraggable” määramiseks väärtusele Väär.
  3. Sündmuse ACTION_DROP kasutamine vahevara päringu tegemiseks, kas sellesse lahtrisse on lubatud kujund paigutada.

Allpool on kood, mis rakendab kirjeldatud loogikat

@Override public boolean onDrag(View view, DragEvent dragEvent) ( int dragAction= dragEvent. getAction() ; View dragView= (View) dragEvent. getLocalState() ; if (dragAction== DragEvent. ACTION_DRAG_EXITED) ( includeDragable)= else false ; if (dragAction== DragEvent. ACTION_DRAG_ENTERED) ( includeDragable= true ; ) else if (dragAction== DragEvent. ACTION_DRAG_ENDED) ( if (dropEventNotHandled(dragEvent) ) ( dragView. setVisibility(View. VISIBLE)Action= (DragEvent) else ; = DragEvent.ACTION_DROP& amp;& amp; sisaldabDragable) ( checkForValidMove((ChessBoardSquareLayoutView) vaade, dragView) ; dragView. setVisibility(View. VISIBLE) ; ) return true ; )

Nagu näete, seatakse ImageView nähtavale olekule olenemata sellest, kas liigutus on kehtiv või mitte. Tahtsin, et kasutaja näeks kuju liikumist. Varem mainisin, et lahter on LayoutView alam. Seda tehakse selleks, et hõlbustada ImageView teisaldamist lahtrist lahtrisse. Allpool on kood meetodi checkForValidMove jaoks, mis näitab, kuidas ImageView liigutatakse.

private void checkForValidMove(ChessBoardSquareLayoutView vaade, View dragView) ( if (mediaator. isValidMove(view) ) ( ViewGroup owner= (ViewGroup) dragView. getParent() ; owner. removeView(dragView) ; view. addView(dragView) ; view. setGravity (Gravity.CENTER) ;view.showAsLanded() ;mediator.handleMove(view) ; ) )

Loodan, et see artikkel aitab teil oma projekte arendada.