Istruzioni
Ti presentiamo Cahier: un nuovo esempio di GitHub per Android per la produttività e la creatività su schermi di grandi dimensioni
Lettura di 11 minuti
L'API Ink è ora in versione beta ed è pronta per essere integrata nella tua app. Questo traguardo è stato reso possibile dal prezioso feedback degli sviluppatori, che ha portato a continui miglioramenti delle prestazioni, della stabilità e della qualità visiva dell'API.
Le app Google, come Documenti Google, Pixel Studio, Google Foto, Chrome PDF, Youtube Effect Maker e funzionalità uniche su Android come Cerchia e Cerca,utilizzano tutte le API più recenti.
Per celebrare questo traguardo, siamo felici di annunciare il lancio di Cahier, un esempio di app completa per prendere appunti ottimizzata per i dispositivi Android di tutte le dimensioni, in particolare tablet e smartphone pieghevoli.
Cos'è Cahier?
Cahier ("quaderno" in francese) è un'app di esempio progettata per mostrare come creare un'applicazione che consenta agli utenti di acquisire e organizzare i propri pensieri combinando testo, disegni e immagini.
Il campione può fungere da riferimento principale per migliorare la produttività e la creatività degli utenti su schermi di grandi dimensioni. Mostra le best practice per la creazione di queste esperienze, accelerando la comprensione e l'adozione da parte degli sviluppatori di tecniche e API potenti correlate. Questo post illustra le funzionalità principali di Cahier, le API chiave e le decisioni architetturali che rendono l'esempio un ottimo riferimento per le tue app.
Le funzionalità principali dimostrate nell'esempio includono:
- Creazione versatile di note:mostra come implementare un sistema flessibile di creazione di contenuti che supporti più formati all'interno di una singola nota, tra cui testo, disegni a mano libera e allegati di immagini.
- Strumenti di inchiostrazione creativi: implementa un'esperienza di disegno a bassa latenza e ad alte prestazioni utilizzando l'API Ink. Il campione fornisce un esempio pratico di integrazione di vari pennelli, un selettore di colori, la funzionalità Annulla/Ripeti e uno strumento gomma.
- Integrazione di contenuti fluidi con il trascinamento: mostra come gestire i contenuti in entrata e in uscita utilizzando il trascinamento. Ciò include l'accettazione di immagini rilasciate da altre app e la possibilità per gli utenti di trascinare i contenuti fuori dalla tua app per una condivisione senza problemi.
- Organizzazione delle note: contrassegna le note come preferite per accedervi rapidamente. Filtra la visualizzazione per tenere tutto sotto controllo.
- Architettura offline first: creata con un'architettura offline first utilizzando Room, che garantisce che tutti i dati vengano salvati localmente e che l'app rimanga completamente funzionale senza una connessione a internet.
- Supporto potente di multi-finestra e multi-istanza: mostra come supportare più istanze, consentendo di avviare l'app in più finestre in modo che gli utenti possano lavorare su note diverse affiancate, migliorando la produttività e la creatività su schermi di grandi dimensioni.
- UI adattiva per tutti gli schermi: l'interfaccia utente si adatta perfettamente a diverse dimensioni e orientamenti dello schermo utilizzando ListDetailPaneScaffold e NavigationSuiteScaffold per offrire un'esperienza utente ottimizzata su smartphone, tablet e pieghevoli.
- Integrazione profonda del sistema: fornisce una guida su come impostare la tua app come app predefinita per prendere appunti su Android 14 e versioni successive rispondendo agli intent di sistema per le note, consentendo l'acquisizione rapida di contenuti da vari punti di ingresso del sistema.
Progettato per la produttività e la creatività su schermi di grandi dimensioni
Per il lancio iniziale, ci concentreremo su alcune funzionalità di base che rendono Cahier una risorsa di apprendimento fondamentale per i casi d'uso di produttività e creatività.
Una base di adattabilità
Cahier è progettato per essere adattabile fin dalle fondamenta. Il campione utilizza la libreria material3-adaptive, in particolare ListDetailPaneScaffold e NavigationSuiteScaffold, per adattare perfettamente il layout dell'app a varie dimensioni e orientamenti dello schermo. Si tratta di un elemento fondamentale per un'app per Android moderna e Cahier fornisce un esempio chiaro di come implementarlo in modo efficace.
UI adattiva Cahier creata con la libreria adattiva Material 3
Mostrare le API e le integrazioni chiave
L'esempio si concentra sulla dimostrazione di potenti API di produttività che puoi sfruttare nelle tue applicazioni, tra cui:
Un approfondimento sulle API principali
Vediamo più nel dettaglio due delle API fondamentali che Cahier integra per offrire un'esperienza di presa di appunti di prima classe.
Creare esperienze di inchiostro naturale con l'API Ink
L'input della stilo trasforma i dispositivi con schermi di grandi dimensioni in notebook e album da disegno digitali. Per aiutarti a creare esperienze di inchiostrazione fluide e naturali, abbiamo reso l'API Ink un elemento fondamentale dell'esempio. L'API Ink semplifica la creazione, il rendering e la manipolazione di tratti di inchiostro di alta qualità con la migliore latenza della categoria.
L'API Ink offre un'architettura modulare, quindi puoi personalizzarla in base alle esigenze e allo stack specifici della tua app. I moduli dell'API includono:
- Moduli di creazione (Compose - views): gestisci l'input di scrittura in tempo reale per creare tratti fluidi con la latenza più bassa che un dispositivo possa fornire.
- In DrawingSurface, Cahier utilizza il nuovo composable InProgressStrokes per gestire l'input in tempo reale con stilo o tocco. Questo modulo è responsabile dell'acquisizione degli eventi puntatore e del rendering dei tratti di inchiostro digitale con la latenza più bassa possibile.
- Modulo Tratti: rappresenta l'input di inchiostro e la sua rappresentazione visiva.Quando un utente finisce di disegnare una linea, il callback onStrokesFinished fornisce all'app un oggetto Stroke finalizzato/secco. Questo oggetto immutabile, che rappresenta il tratto di inchiostro completato, viene quindi gestito in DrawingCanvasViewModel.
- Modulo di rendering:visualizza in modo efficiente i tratti di inchiostro, consentendo di combinarli con Jetpack Compose o visualizzazioni Android.
- Per visualizzare i tratti esistenti e quelli appena asciugati, Cahier utilizza CanvasStrokeRenderer in DrawingSurface per il disegno attivo e in DrawingDetailPanePreview per mostrare un'anteprima statica della nota. Questo modulo disegna in modo efficiente gli oggetti Tratto su un Canvas.
- Moduli pennello (Compose - visualizzazioni): forniscono un modo dichiarativo per definire lo stile visivo dei tratti. Gli aggiornamenti recenti (dalla release alpha03) includono un nuovo pennello a linea tratteggiata, particolarmente utile per funzionalità come la selezione a lazo. DrawingCanvasViewModel contiene lo stato di currentBrush. Una casella degli strumenti in DrawingCanvas consente agli utenti di selezionare diverse famiglie di pennelli (ad esempio StockBrushes.pressurePen() o StockBrushes.highlighter()) e cambiare i colori. ViewModel aggiorna l'oggetto Brush, che viene poi utilizzato dal composable InProgressStrokes per i nuovi tratti.
- Moduli di geometria (Compose - visualizzazioni): supportano la manipolazione e l'analisi dei tratti per funzionalità come la cancellazione e la selezione.
- Lo strumento gomma all'interno della casella degli strumenti e la funzionalità in DrawingCanvasViewModel si basano sul modulo di geometria. Quando la gomma è attiva, crea un MutableParallelogram intorno al percorso del gesto dell'utente. La gomma controlla quindi le intersezioni tra la forma e i riquadri di delimitazione dei tratti esistenti per determinare quali tratti cancellare, rendendo la gomma intuitiva e precisa.
- Modulo Storage: fornisce funzionalità di serializzazione e deserializzazione efficienti per i dati di inchiostro, con conseguente risparmio significativo di spazio su disco e dimensioni della rete. Per salvare i disegni, Cahier rende persistenti gli oggetti Tratto nel database Room. In Converters, l'esempio utilizza la funzione encode del modulo di archiviazione per serializzare StrokeInputBatch (i dati dei punti non elaborati) in un ByteArray. L'array di byte, insieme alle proprietà del pennello, viene salvato come stringa JSON. La funzione decode viene utilizzata per ricostruire i tratti quando viene caricata una nota.
Oltre a questi moduli principali, i recenti aggiornamenti hanno ampliato le funzionalità dell'API Ink:
- Le nuove API sperimentali per gli oggetti
BrushFamilypersonalizzati consentono agli sviluppatori di creare tipi di pennello creativi e unici, offrendo la possibilità di utilizzare strumenti come i pennelli Matita e Puntatore laser.
Cahier utilizza pennelli personalizzati, tra cui l'esclusivo pennello musicale mostrato di seguito, per illustrare le possibilità creative avanzate.
Laser arcobaleno creato con i pennelli personalizzati dell'API Ink
Pennello musicale creato con i pennelli personalizzati dell'API Ink
- I moduli di interoperabilità Jetpack Compose nativi semplificano l'integrazione delle funzionalità di inchiostro direttamente nelle UI di Compose per un'esperienza di sviluppo più idiomatica ed efficiente.
L'API Ink offre diversi vantaggi che la rendono la scelta ideale per le app di produttività e creatività rispetto a un'implementazione personalizzata:
- Facilità d'uso:l'API Ink astrae le complessità della grafica e della geometria, consentendoti di concentrarti sulle funzionalità principali di Cahier.
- Prestazioni:il supporto integrato per la bassa latenza e il rendering ottimizzato garantiscono un'esperienza di scrittura fluida e reattiva.
- Flessibilità:il design modulare ti consente di scegliere i componenti necessari, il che consente l'integrazione perfetta dell'API Ink nell'architettura di Cahier.
L'API Ink è già stata adottata in molte app Google, tra cui per il markup in Documenti e per Cerchia e Cerca, nonché in app partner come Orion Notes e PDF Scanner.
"L'API Ink è stata la nostra prima scelta per Cerchia e Cerca. Grazie alla loro vasta documentazione, l'integrazione dell'API Ink è stata semplicissima e ci ha permesso di realizzare il nostro primo prototipo funzionante in una sola settimana. Il supporto per la texture e l'animazione personalizzate del pennello di Ink ci ha permesso di eseguire rapidamente l'iterazione sul design del tratto." - Jordan Komoda, ingegnere software - Google
Diventare l'app per le note predefinita con il ruolo Note
La funzionalità di prendere appunti è una funzionalità di base che migliora la produttività degli utenti sui dispositivi con schermi di grandi dimensioni. Con la funzionalità di ruolo delle note, gli utenti possono accedere alle tue app compatibili dalla schermata di blocco o mentre sono in esecuzione altre app. Questa funzionalità identifica e imposta le app per prendere appunti predefinite a livello di sistema e concede loro l'autorizzazione per essere avviate per l'acquisizione di contenuti.
Implementazione in Cahier
L'implementazione del ruolo di annotatore prevede alcuni passaggi chiave, tutti illustrati nell'esempio:
- Dichiarazione del file manifest: innanzitutto, l'app deve dichiarare la propria capacità di gestire gli intent di presa di appunti. In AndroidManifest.xml, Cahier include un
<intent-filter>per l'azione android.intent.action.CREATE_NOTE. Indica al sistema che l'app è un potenziale candidato per il ruolo di note. - Controllo dello stato del ruolo: SettingsViewModel utilizza RoleManager di Android per determinare lo stato attuale. SettingsViewModel verifica se il ruolo per le note è disponibile sul dispositivo (isRoleAvailable) e se Cahier attualmente detiene questo ruolo (isRoleHeld). Questo stato viene esposto all'interfaccia utente utilizzando i flussi Kotlin.
- Richiesta del ruolo: nel file Settings.kt, viene visualizzato un pulsante per l'utente se il ruolo è disponibile ma non detenuto. Quando viene fatto clic, il pulsante chiama la funzione
requestNotesRolein ViewModel. La funzione crea un intent per aprire la schermata delle impostazioni dell'app predefinita in cui l'utente può selezionare Cahier. Il processo viene gestito utilizzando l'API rememberLauncherForActivityResult, che gestisce l'avvio dell'intent e la ricezione del risultato. - Aggiornamento della UI: dopo che l'utente torna dalla schermata delle impostazioni, il callback ActivityResultLauncher attiva una funzione nel ViewModel per aggiornare lo stato del ruolo, assicurando che la UI rifletta con precisione se l'app è ora l'app predefinita.
Scopri come integrare il ruolo delle note nella tua app nella nostra guida alla creazione di un'app per prendere appunti.
Cahier viene avviato in una finestra mobile come app predefinita per prendere appunti su un tablet Lenovo
Un importante passo avanti: Lenovo attiva il ruolo Note
Siamo felici di annunciare un importante passo avanti per la produttività di Android su schermi di grandi dimensioni: Lenovo ha attivato il supporto del ruolo Note sui tablet con Android 15 e versioni successive. Con questo aggiornamento, ora puoi aggiornare le tue app per prendere appunti per consentire agli utenti con dispositivi Lenovo compatibili di impostarle come predefinite, garantendo un accesso semplice dalla schermata di blocco e sbloccando le funzionalità di acquisizione dei contenuti a livello di sistema.
Questo impegno di un OEM leader dimostra la crescente importanza del ruolo delle note nell'offrire un'esperienza utente davvero integrata e produttiva su Android.
Multi-istanza, multi-finestra e finestre delle app
La produttività su un ampio schermo si basa sulla gestione efficiente di informazioni e flussi di lavoro. Per questo motivo, Cahier è progettato per sfruttare appieno le funzionalità avanzate di gestione delle finestre di Android, fornendo uno spazio di lavoro flessibile che si adatta alle esigenze degli utenti. L'app supporta:
- Multifinestra: la funzionalità di base per eseguire un'app insieme a un'altra in modalità schermo diviso o in formato libero. È essenziale per attività come fare riferimento a una pagina web mentre prendi appunti in Cahier.
- Multi-istanza: è qui che il vero multitasking brilla. Cahier consente agli utenti di aprire più finestre indipendenti dell'app contemporaneamente. Immagina di confrontare due note diverse affiancate o di fare riferimento a una nota di testo in una finestra mentre lavori a un disegno in un'altra. Cahier mostra come gestire queste istanze separate, ognuna con il proprio stato, trasformando la tua app in uno strumento potente e sfaccettato.
- Finestre delle app: quando è collegata a un display esterno, la modalità desktop Android trasforma un tablet o un dispositivo pieghevole in una workstation. Poiché Cahier è realizzato con una UI adattiva e supporta più istanze, l'app funziona perfettamente in questo ambiente. Gli utenti possono aprire, ridimensionare e posizionare più finestre di Cahier proprio come su un computer tradizionale, consentendo flussi di lavoro complessi che prima non erano possibili sui dispositivi mobili.
Cahier in esecuzione in modalità finestra del desktop su Pixel Tablet
Ecco come abbiamo implementato queste funzionalità in Cahier:
Per abilitare la funzionalità multi-istanza, abbiamo dovuto prima segnalare al sistema che l'app supporta l'avvio più volte aggiungendo la proprietà PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI alla dichiarazione di MainActivity in AndroidManifest:
<activity android:name="com.example.cahier.MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.MyApplication" android:showWhenLocked="true" android:turnScreenOn="true" android:resizeableActivity="true" android:launchMode="singleInstancePerTask"> <property android:name="android.window.PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI" android:value="true"/> ... </activity>
Successivamente, abbiamo implementato la logica per avviare una nuova istanza dell'app. In CahierHomeScreen.kt, quando un utente sceglie di aprire una nota in una nuova finestra, creiamo un nuovo intent con flag specifici che indicano al sistema come gestire l'avvio della nuova attività. La combinazione di FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_MULTIPLE_TASK e FLAG_ACTIVITY_LAUNCH_ADJACENT garantisce che la nota si apra in una nuova finestra separata accanto a quella esistente.
fun openNewWindow(activity: Activity?, note: Note) {
val intent = Intent(activity, MainActivity::class.java)
intent.putExtra(AppArgs.NOTE_TYPE_KEY, note.type)
intent.putExtra(AppArgs.NOTE_ID_KEY, note.id)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK or
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
activity?.startActivity(intent)
}Per supportare la modalità multi-finestra, abbiamo dovuto segnalare al sistema che l'app supporta il ridimensionamento impostando l'elemento <activity> o <application> del manifest.
<activity android:name="com.example.cahier.MainActivity" android:resizeableActivity="true" ...> </activity>
L'interfaccia utente è stata creata con la libreria adattiva Material 3, il che le consente di adattarsi perfettamente in scenari multi-finestra come la modalità schermo diviso di Android.
Per migliorare l'esperienza utente, abbiamo aggiunto il supporto del trascinamento. Di seguito viene illustrato come abbiamo implementato questa funzionalità in Cahier.
Trascinare
Un'app davvero produttiva o creativa non funziona in isolamento, ma interagisce perfettamente con il resto dell'ecosistema del dispositivo. Il trascinamento è un elemento fondamentale di questa interazione, soprattutto sugli schermi di grandi dimensioni in cui gli utenti lavorano spesso su più finestre delle app. Cahier lo fa implementando una funzionalità di trascinamento intuitiva per aggiungere e condividere contenuti.
- Importazione semplice: gli utenti possono trascinare le immagini da altre applicazioni, come un browser web, una galleria fotografica o un gestore di file, e rilasciarle direttamente sul canvas di una nota. A questo scopo, Cahier utilizza il modificatore dragAndDropTarget per definire una zona di rilascio, verificare la presenza di contenuti compatibili (come
image/*) ed elaborare l'URI in entrata. - Condivisione semplice: i contenuti all'interno di Cahier sono facili da condividere come quelli di altre app. Gli utenti possono premere a lungo un'immagine all'interno di una nota di testo o premere a lungo l'intera tela di una nota di disegno e di un composito di immagini e trascinarla in un'altra applicazione.
Approfondimento tecnico: trascinamento dall'area di disegno
L'implementazione del gesto di trascinamento sul canvas di disegno presenta una sfida unica. Nel nostro DrawingSurface, i composable che gestiscono l'input di disegno in tempo reale (InProgressStrokes dell'API Ink) e il Box che rileva il gesto di pressione prolungata per avviare il trascinamento sono composable fratelli.
Per impostazione predefinita, il sistema di input del puntatore di Jetpack Compose è progettato in modo che solo un composable fratello, il primo nell'ordine di dichiarazione che si sovrappone alla posizione del tocco, riceva l'evento. Nel caso di Cahier, vogliamo che la nostra logica di gestione dell'input di trascinamento abbia la possibilità di essere eseguita e potenzialmente di consumare gli input prima che il composable InProgressStrokes utilizzi tutti gli input non consumati per disegnare e poi li consumi. Se non disponiamo gli elementi nel giusto ordine, la nostra scatola non rileverà il gesto di pressione prolungata per iniziare un trascinamento oppure InProgressStrokes non riceverà l'input per disegnare.
Per risolvere il problema, abbiamo creato un modificatore pointerInputWithSiblingFallthrough personalizzato e abbiamo inserito il nostro Box utilizzando questo modificatore prima di InProgressStrokes nel codice componibile. Questa utilità è un wrapper sottile intorno al sistema pointerInput standard, ma con una modifica fondamentale: esegue l'override della funzione sharePointerInputWithSiblings() per restituire true. Indica al framework Compose di consentire agli eventi puntatore di passare ai composable fratelli, anche dopo essere stati utilizzati.
internal fun Modifier.pointerInputWithSiblingFallthrough(
pointerInputEventHandler: PointerInputEventHandler
) = this then PointerInputSiblingFallthroughElement(pointerInputEventHandler)
private class PointerInputSiblingFallthroughModifierNode(
pointerInputEventHandler: PointerInputEventHandler
) : PointerInputModifierNode, DelegatingNode() {
var pointerInputEventHandler: PointerInputEventHandler
get() = delegateNode.pointerInputEventHandler
set(value) {
delegateNode.pointerInputEventHandler = value
}
val delegateNode = delegate(
SuspendingPointerInputModifierNode(pointerInputEventHandler)
)
override fun onPointerEvent(
pointerEvent: PointerEvent,
pass: PointerEventPass,
bounds: IntSize
) {
delegateNode.onPointerEvent(pointerEvent, pass, bounds)
}
override fun onCancelPointerInput() {
delegateNode.onCancelPointerInput()
}
override fun sharePointerInputWithSiblings() = true
}
private data class PointerInputSiblingFallthroughElement(
val pointerInputEventHandler: PointerInputEventHandler
) : ModifierNodeElement<PointerInputSiblingFallthroughModifierNode>() {
override fun create() = PointerInputSiblingFallthroughModifierNode(pointerInputEventHandler)
override fun update(node: PointerInputSiblingFallthroughModifierNode) {
node.pointerInputEventHandler = pointerInputEventHandler
}
override fun InspectorInfo.inspectableProperties() {
name = "pointerInputWithSiblingFallthrough"
properties["pointerInputEventHandler"] = pointerInputEventHandler
}
}Ecco come viene utilizzato in DrawingSurface:
Box(
modifier = Modifier
.fillMaxSize()
// Our custom modifier enables this gesture to coexist with the drawing input.
.pointerInputWithSiblingFallthrough {
detectDragGesturesAfterLongPress(
onDragStart = { onStartDrag() },
onDrag = { _, _ -> /* consume drag events */ },
onDragEnd = { /* No action needed */ }
)
}
)
// The Ink API's composable for live drawing sits here as a sibling.
InProgressStrokes(...)In questo modo, il sistema rileva correttamente sia i tratti di disegno sia il gesto di trascinamento con pressione prolungata contemporaneamente. Una volta avviato il trascinamento, creiamo un URI condivisibile con FileProvider e lo trasmettiamo al framework di trascinamento della selezione del sistema utilizzando view.startDragAndDrop(). Questa soluzione garantisce un'esperienza utente solida e intuitiva, dimostrando come superare i complessi conflitti di gesti nelle UI a più livelli.content://
Costruito con architettura moderna
Oltre alle API specifiche, Cahier mostra pattern architetturali cruciali per la creazione di applicazioni adattive e di alta qualità.
Il livello di presentazione: Jetpack Compose e adattabilità
Il livello di presentazione è creato interamente con Jetpack Compose. Come accennato, Cahier adotta la libreria material3-adaptive per l'adattabilità dell'interfaccia utente. La gestione dello stato segue un rigoroso pattern di flusso di dati unidirezionale (UDF), con le istanze ViewModel utilizzate come contenitori di dati che contengono le informazioni sulle note e lo stato dell'interfaccia utente.
Il livello dati: repository e Room
Per il data layer, Cahier utilizza un'interfaccia NoteRepository per astrarre tutte le operazioni sui dati. Questa scelta di progettazione consente all'app di passare in modo pulito da un'origine dati locale (Room) a un potenziale backend remoto futuro. Il flusso di dati per un'azione come la modifica di una nota è semplice:
- La UI di Jetpack Compose attiva un metodo nella ViewModel.
- Il ViewModel recupera la nota da NoteRepository, gestisce la logica e restituisce la nota aggiornata al repository.
- NoteRepository salva l'aggiornamento in un database Room.
Supporto completo per l'input
Per essere un vero e proprio strumento di produttività, un'app deve gestire una serie di metodi di input in modo impeccabile. Cahier è progettato per essere conforme alle linee guida per l'input su schermi di grandi dimensioni e supporta:
- Stilo:integrazione con l'API Ink, rifiuto del palmo, registrazione per il ruolo di note, input dello stilo nei campi di testo e modalità immersiva.
- Tastiera:supporto delle scorciatoie da tastiera e delle combinazioni più comuni (ad esempio Ctrl+clic, meta+clic) e indicazione chiara dello stato attivo della tastiera.
- Mouse e trackpad:supporto per il clic con il tasto destro del mouse e gli stati di passaggio del mouse.
Il supporto di interazioni avanzate con tastiera, mouse e trackpad è un aspetto fondamentale per ulteriori miglioramenti.
Inizia oggi stesso!
Ci auguriamo che Cahier possa fungere da trampolino di lancio per la tua prossima app straordinaria. L'abbiamo creato come risorsa open source completa che dimostra come combinare un'interfaccia utente adattiva, API potenti come Ink e il ruolo delle note e un'architettura moderna e adattiva.
Vuoi iniziare?
- Esplora il codice: visita il nostro repository GitHub per esplorare il codebase di Cahier e vedere i principi di progettazione in azione.
- Crea la tua app: utilizza Cahier come base per la tua applicazione di presa di appunti, markup di documenti o creatività.
- Contributi: i tuoi contributi sono graditi. Aiutaci a rendere Cahier una risorsa ancora migliore per la community di sviluppatori Android.
Consulta le guide ufficiali per gli sviluppatori e inizia subito a creare la tua app di produttività e creatività di nuova generazione. Non vediamo l'ora di vedere le tue creazioni.
Continua a leggere
-
Istruzioni
Consapevole del fatto che il consumo eccessivo della batteria è una delle principali preoccupazioni degli utenti Android, Google ha adottato misure significative per aiutare gli sviluppatori a creare app più efficienti dal punto di vista energetico.
Alice Yuan • Lettura di 8 minuti
-
Istruzioni
Volevamo fornirti esempi di funzionalità basate sull'AI che utilizzano modelli sul dispositivo e sul cloud e ispirarti a creare esperienze piacevoli per i tuoi utenti.
Thomas Ezan, Ivy Knight • Lettura di 2 minuti
-
Istruzioni
La guida al livellamento delle prestazioni è suddivisa in 5 livelli. Inizieremo con il livello 1, che introduce strumenti di misurazione delle prestazioni con uno sforzo di adozione minimo, e arriveremo al livello 5, ideale per le app che dispongono delle risorse per mantenere un framework delle prestazioni personalizzato.
Alice Yuan • Lettura di 9 minuti
Segui gli aggiornamenti
Ricevi ogni settimana gli ultimi approfondimenti sullo sviluppo per Android direttamente nella tua casella di posta.