Η λειτουργία πολλαπλών παραθύρων Freeform είναι μια δυνατότητα που δεν χρησιμοποιείται και υποτιμάται στο Android Nougat. Εξηγούμε τι είναι και πώς μπορούν να το ενσωματώσουν οι προγραμματιστές.
Όταν το Android 7.0 Nougat ανακοινώθηκε για πρώτη φορά στις αρχές του 2016, έφερε μαζί του μια πολυπόθητη λειτουργία στην πλατφόρμα Android - υποστήριξη πολλών παραθύρων. Οι περισσότεροι άνθρωποι γνωρίζουν την υποστήριξη πολλαπλών παραθύρων με split-screen που είναι ενεργοποιημένη από προεπιλογή σε όλα τα τηλέφωνα και tablet Android Nougat. Οι συσκευές Android TV με Android Nougat διαθέτουν υποστήριξη για υποστήριξη πολλαπλών παραθύρων εικόνας σε εικόνα.
Ωστόσο, υπάρχει μια τρίτη λειτουργία πολλαπλών παραθύρων που υπάρχει στο Android Nougat την οποία δεν γνωρίζουν πολλοί: λειτουργία παραθύρου ελεύθερης μορφής. Αυτή η λειτουργία επιτρέπει στο Android να παρουσιάζει εφαρμογές ως αιωρούμενα παράθυρα που μπορούν να μετακινηθούν και να αλλάξουν μέγεθος κατά βούληση από τον χρήστη. Είναι ουσιαστικά η υλοποίηση του Android του a
διαχείριση παραθύρων στοίβαξης.Στο Τεκμηρίωση Android SDK, αναφέρει ότι:
Οι κατασκευαστές μεγαλύτερων συσκευών μπορούν να επιλέξουν να ενεργοποιήσουν τη λειτουργία ελεύθερης μορφής, στην οποία ο χρήστης μπορεί ελεύθερα να αλλάξει το μέγεθος κάθε δραστηριότητας. Εάν ο κατασκευαστής ενεργοποιήσει αυτήν τη δυνατότητα, η συσκευή προσφέρει λειτουργία ελεύθερης μορφής εκτός από τη λειτουργία διαίρεσης οθόνης.
Και επίσης, στο Android 7.0 CDD:
Οι υλοποιήσεις συσκευών με μέγεθος οθόνης xlarge ΠΡΕΠΕΙ να υποστηρίζουν τη λειτουργία ελεύθερης μορφής.
Αυτό υποδηλώνει ότι οποιαδήποτε νέα συσκευή Android μεγάλης οθόνης που διατίθεται με Android 7.0 θα μπορούσε ενδεχομένως να έχει ενεργοποιημένη τη λειτουργία παραθύρου ελεύθερης μορφής από τον κατασκευαστή.
Ωστόσο, αυτό δεν είναι απολύτως μια δύσκολη απαίτηση. Είναι δυνατό να εξαναγκάσει όποιος Συσκευή Android Nougat (με ενεργοποιημένες τις επιλογές προγραμματιστή) για υποστήριξη λειτουργίας παραθύρου ελεύθερης μορφής χρησιμοποιώντας μία από τις δύο διαφορετικές μεθόδους:
Ενεργοποίηση λειτουργίας παραθύρου ελεύθερης μορφής σε οποιαδήποτε συσκευή Android Nougat
Μέθοδος 1 (απαιτείται υπολογιστής με adb)
Βεβαιωθείτε ότι ο εντοπισμός σφαλμάτων USB είναι ενεργοποιημένος στις Επιλογές προγραμματιστή. Στη συνέχεια, συνδέστε τη συσκευή σας σε έναν υπολογιστή με εγκατεστημένο το adb και εκτελέστε την ακόλουθη εντολή:
adb shell settings put global enable_freeform_support 1
Μέθοδος 2 (χωρίς πρόσθετες απαιτήσεις)
Ενεργοποιήστε την επιλογή "Αναγκαστική αλλαγή μεγέθους δραστηριοτήτων" στο κάτω μέρος των Επιλογών προγραμματιστή.
Και οι δύο αυτές μέθοδοι απαιτούν την επανεκκίνηση της διεπαφής χρήστη συστήματος προτού τεθούν σε ισχύ. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι να επανεκκινήσετε τη συσκευή σας (ή, εάν η συσκευή σας είναι root, μπορείτε απλά να σκοτώσετε το com.android.systemui
επεξεργάζομαι, διαδικασία)
Εντάξει, άρα η λειτουργία ελεύθερης μορφής είναι ενεργοποιημένη… τώρα τι;
Εάν ενεργοποιήσατε τη λειτουργία ελεύθερης μορφής χρησιμοποιώντας τη Μέθοδο 1, τότε θα υπάρχει ένα νέο κουμπί στις καταχωρίσεις εφαρμογών στο μενού Επισκόπηση για την εκκίνηση μιας εφαρμογής σε λειτουργία παραθύρου ελεύθερης μορφής.
Με τη Μέθοδο 2, ωστόσο, δεν είναι δυνατή η εκκίνηση μιας εφαρμογής σε λειτουργία ελεύθερης μορφής μέσω του ίδιου του Android. Ευτυχώς, είναι δυνατό για οποιοδήποτε πρόγραμμα εκκίνησης τρίτου κατασκευαστή να εκκινήσει μια εφαρμογή σε λειτουργία παραθύρου ελεύθερης μορφής χρησιμοποιώντας τυπικά API Android που οριστικοποιήθηκαν ως μέρος του επιπέδου 24 του API.
Το κλειδί για την εκκίνηση μιας εφαρμογής σε λειτουργία ελεύθερης μορφής είναι να καλέσετε το ActivityOptions.setLaunchBounds()
μέθοδος. Αυτή η μέθοδος απαιτεί α Rect
ως επιχείρημα, που περιέχει τα όρια παραθύρου με τα οποία θα ξεκινήσει η εφαρμογή.
Στη συνέχεια, μπορείτε να ξεκινήσετε την εφαρμογή με startActivity(Intent, Bundle)
. Εάν δεν έχετε ήδη ένα ActivityOptions
πακέτο, μπορείτε να δημιουργήσετε ένα με ActivityOptions.makeBasic()
και μετά καλώντας setLaunchBounds()
στο φρεσκοδημιουργημένο πακέτο.
Σημειώστε ότι από προεπιλογή, εάν υπάρχει ήδη μια εργασία για την εφαρμογή στην οθόνη Επισκόπηση, τότε Το Android απλώς θα σας ανακατευθύνει στην υπάρχουσα (πλήρης οθόνη) εργασία που είχε ξεκινήσει προηγουμένως από το χρήστης. Θα χρειαστεί να διαγράψετε τυχόν εργασίες για την εφαρμογή στην Επισκόπηση πριν επιχειρήσετε να εκκινήσετε την εφαρμογή σε ένα παράθυρο ελεύθερης μορφής. (Για εφαρμογές με δραστηριότητες που ξεκινούν standard
ή singleTop
λειτουργίες, μπορείτε να αναγκάσετε να ανοίξει ένα νέο παράθυρο προσθέτοντας το Intent.FLAG_ACTIVITY_MULTIPLE_TASK
επισημάνετε την πρόθεση πριν καλέσετε startActivity()
.)
Πώς λειτουργεί η λειτουργία ελεύθερης μορφής κάτω από το καπό;
Υπάρχει ένα εξαιρετικό άρθρο γραμμένο που εξηγεί πώς εφαρμόζεται η λειτουργία πολλαπλών παραθύρων, συμπεριλαμβανομένης της λειτουργίας ελεύθερης μορφής, στο Android Nougat. (ΣΗΜΕΙΩΣΗ: το άρθρο είναι γραμμένο στα κινέζικα, οπότε φροντίστε να το εκτελέσετε μέσω του Google Translate)
Με λίγα λόγια, οι εφαρμογές σε λειτουργία ελεύθερης μορφής εκτελούνται σε ξεχωριστή στοίβα από το υπόλοιπο σύστημα (σκεφτείτε: εικονική επιφάνεια εργασίας). Επομένως, δεν είναι δυνατό οι εφαρμογές ελεύθερης μορφής να εκτελούνται πάνω από το πρόγραμμα εκκίνησης ή πάνω από άλλη εφαρμογή πλήρους οθόνης.
Εφαρμογές που εκτελούνται σε λειτουργία ελεύθερης μορφής (που δεν έχουν android: windowIsFloating
ορίζεται σε αληθές) έχουν α DecorCaptionView
προστέθηκε ως παιδί ανώτατου επιπέδου DecorView
. Αυτή η άποψη περιέχει α LinearLayout
ορίζοντας τη γραμμή λεζάντας του παραθύρου για μετακίνηση, μεγιστοποίηση και κλείσιμο του παραθύρου. Αν και δεν το συνιστώ προσωπικά, είναι δυνατή η πρόσβαση και η προσαρμογή αυτής της προβολής λαμβάνοντας το DecorView
χρησιμοποιώντας Window.getDecorView()
, ρίχνοντάς το σε α ViewGroup
και στη συνέχεια πρόσβαση στις θυγατρικές προβολές του.
Οποιαδήποτε εφαρμογή έχει σχεδιαστεί για να συμπεριφέρεται καλά στην τυπική λειτουργία πολλαπλών παραθύρων διαίρεσης οθόνης του Android θα λειτουργεί σε λειτουργία ελεύθερης μορφής. isInMultiWindowMode()
θα επιστρέψει true για εφαρμογές που εκτελούνται σε λειτουργία ελεύθερης μορφής. Υπάρχουν μερικές άλλες δημόσια διαθέσιμες κλάσεις και μέθοδοι που μπορεί να χρησιμοποιήσει μια εφαρμογή και σχετίζονται συγκεκριμένα με τη λειτουργία ελεύθερης μορφής:
-
Window.setDecorCaptionShade()
: αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για την παράκαμψη της απόχρωσης των στοιχείων ελέγχου λεζάντας (το κουμπί μεγιστοποίησης και κλεισίματος) για εφαρμογές σε λειτουργία ελεύθερης μορφής. -
Window.setRestrictedCaptionAreaListener()
: μπορεί να χρησιμοποιηθεί για να ανιχνεύσει πότε ένα παράθυρο μετακινείται σε λειτουργία ελεύθερης μορφής. οWindow.OnRectrictedCaptionAreaChangedListener
καλείται κάθε φορά που αλλάζει η θέση των στοιχείων ελέγχου λεζάντας (όταν ένας χρήστης μετακινεί το παράθυρο) και παρέχει αRect
με τα νέα όρια των στοιχείων ελέγχου υπότιτλων. -
ActivityInfo.WindowLayout
: αυτή η κλάση περιέχει πληροφορίες που δηλώνονται στο μανιφέστο της εφαρμογής ως προς την αρχική θέση ενός παραθύρου ελεύθερης μορφής που μπορεί να ζητήσει μια εφαρμογή κατά την εκκίνηση. Για παράδειγμα, μπορείτε να παραθέσετε τα ακόλουθα στο ετικέτα του μανιφέστου σας:
Στη συνέχεια, όταν η συσκευή είναι ήδη σε λειτουργία ελεύθερης μορφής και εκκινηθεί η εφαρμογή, θα ξεκινήσει με αυτά τα καθορισμένα όρια.android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
Παραδείγματα λειτουργίας παραθύρου ελεύθερης μορφής σε δράση
Το καλοκαίρι του 2016, ενώ το Android Nougat ήταν ακόμα μια προεπισκόπηση προγραμματιστών, κυκλοφόρησα μια εφαρμογή που ονομάζεται Γραμμή εργασιών που παρέχει ένα μενού έναρξης όπως τα Windows και λίστα πρόσφατων εφαρμογών σε μια επικάλυψη συστήματος. Επιτρέπει στους χρήστες στο Nougat να εκκινούν εφαρμογές σε λειτουργία παραθύρου ελεύθερης μορφής — και, καθώς η γραμμή εργασιών χρησιμοποιεί επικάλυψη, μπορεί να παραμείνει στην οθόνη στο περιβάλλον παραθύρου ελεύθερης μορφής. Ο συνδυασμός της γραμμής εργασιών και της λειτουργίας ελεύθερης μορφής δίνει σε κάθε συσκευή Android, ειδικά σε tablet, μια αίσθηση που μοιάζει με υπολογιστή.
Μπορείς λήψη της γραμμής εργασιών στο Google Play ή δείτε τον πηγαίο κώδικα τον εαυτό σας στο GitHub. Εκτός από τις έννοιες που αναφέρονται σε αυτό το άρθρο, χρησιμοποιώ επίσης μερικά κόλπα για να διατηρήσω ενεργό το περιβάλλον λειτουργίας ελεύθερης μορφής ακόμα και όταν δεν εμφανίζονται παράθυρα ελεύθερης μορφής στην οθόνη. Οι χρήστες μπορούν επίσης να ορίσουν προαιρετικά τη γραμμή εργασιών ως την προεπιλεγμένη εκκίνηση για να επιτρέψουν στη συσκευή τους να εκκινήσει αυτόματα στο περιβάλλον λειτουργίας ελεύθερης μορφής.
Δεδομένου ότι δεν υπάρχουν συσκευές που να αποστέλλονται επίσημα με υποστήριξη παραθύρου ελεύθερης μορφής ενεργοποιημένη από τον OEM (από τη στιγμή που γράφεται αυτό το άρθρο), προτείνω χρησιμοποιώντας τη γραμμή εργασιών ως εργαλείο για τους προγραμματιστές να δοκιμάσουν τις εφαρμογές τους στο περιβάλλον παραθύρου ελεύθερης μορφής σε συσκευές που δεν υποστηρίζουν διαφορετικά το.
Εκτός από τη γραμμή εργασιών, έχω τροποποιήσει επίσης τον πηγαίο κώδικα του Launcher3 από το AOSP για να του επιτρέψω να εκκινεί εφαρμογές σε λειτουργία ελεύθερης μορφής. Αυτός είναι ένας ευθύς κλώνος του στοκ εκκίνησης Android 7.1.1, με τις ελάχιστες απαραίτητες τροποποιήσεις για να του επιτραπεί η εκκίνηση εφαρμογών ελεύθερης μορφής. Παρείχα αυτόν τον τροποποιημένο εκτοξευτή με την ελπίδα ότι άλλοι προγραμματιστές θα εφαρμόσουν υποστήριξη για την εκκίνηση παραθύρων ελεύθερης μορφής στους προσαρμοσμένους εκτοξευτές τους. Μπορείς δείτε τον πηγαίο κώδικα στο GitHub ή κατεβάστε ένα δείγμα APK.
Ελπίζω ότι οι προγραμματιστές προσαρμοσμένων εκτοξευτών μπορούν να χρησιμοποιήσουν αυτόν τον κώδικα και να επιτρέψουν την υποστήριξη για την εκκίνηση ελεύθερης μορφής εφαρμογές παραθύρων για τους χρήστες που επιθυμούν μεγαλύτερη ευελιξία για τη διαχείριση παραθύρων στη μεγάλη οθόνη τους συσκευές.