Todo lo que necesitas saber sobre tecnología

Etiqueta: arsenal androide

El arsenal de Android: redes

Biblioteca de Android NetworkStateObserver Una biblioteca que le ayuda a verificar el estado de su red, si está disponible, perdida o no disponible y también verificar la accesibilidad de su red cuando su servidor no funciona o su ISP está conectado pero no tiene suscripción de datos. Demostración: 1. Agregar NetworkStateObserver a su proyecto Incluya jitpack en su archivo raíz settings.gradle. pluginManagement { repositorios { … maven { url ‘https://jitpack.io’ } } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositorios { … maven { url ‘https://jitpack.io’ } } } Y agregue su dependencia al archivo build.gradle a nivel de aplicación: dependencias { implementación ‘com.github.RhymezxCode:NetworkStateObserver:1.1.3’ //Implementación de Livedata ‘androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0’ implementación ‘androidx.lifecycle:lifecycle-livedata-core-ktx:2.7.0’ implementación ‘androidx.lifecycle:lifecycle-runtime-ktx:2.7.0’ implementación ‘android.arch.lifecycle:extensions:1.1.1’ } Sincronización tu proyecto, y ???? auge???? ha agregado NetworkStateObserver con éxito. ❗ 2. Uso Primero inicialice la clase de constructor: val network = NetworkStateObserver.Builder() .activity(activity = this@NetworkStateObserverExample) .build() Si solo desea verificar la conectividad, antes de realizar una tarea o trabajo(): if (CheckConnectivity.isNetworkAvailable(requireContext())){ showToast( this@NetworkStateObserverExample, «Red restaurada») } Utilice el método de datos en vivo para determinar el estado de su red y reemplace el código en lifecycleScope.launchWhenStarted { ….your codifique aquí } para hacer lo que quiera: network.callNetworkConnection().observe(this) { isConnected -> lifecycleScope.launch(Dispatchers.IO) { if (isConnected) { cuando { Reachability.hasServerConnected( contexto = this@NetworkStateObserverExample, serverUrl = «https://www.your-server-url.com» ) -> lifecycleScope.launch{ showToast( «La URL del servidor funciona») } Reachability.hasInternetConnected( contexto = this@NetworkStateObserverExample ) -> lifecycleScope.launch{ showToast( «Red restaurada» ) } else -> lifecycleScope.launch{ showToast( «La red se perdió o hay problemas con el servidor») } } } else { //verificar si hay conexión perdida lifecycleScope.launch{ showToast( «Sin conexión de red») } } } } } Utilice el método de flujo para determinar el estado de su red y también vuelva a intentarlo cuando se produzca una excepción: lifecycleScope.launch { network.callNetworkConnectionFlow() .observe() .collect { when (it) { NetworkObserver.Status.Available -> { lifecycleScope.launch { cuando { Reachability.hasServerConnectedFlow( contexto = this@NetworkStateObserverExample, serverUrl = «https://www.github.com» ).retryWhen { causa, intento -> si (la causa es IOException && intento < 3) { delay(2000) return@retryWhen true } else { return@retryWhen false } }.buffer().first() -> lifecycleScope.launch { showToast( this@NetworkStateObserverExample, «La URL del servidor funciona») } Reachability.hasInternetConnectedFlow( contexto = this@NetworkStateObserverExample ).retryWhen { causa, intento -> si (la causa es IOException && intento < 3) { delay(2000) return@retryWhen true } else { return@retryWhen false } }.buffer().first() -> lifecycleScope.launch { showToast( this@NetworkStateObserverExample, «Red restaurada») } else -> lifecycleScope.launch { showToast( this@NetworkStateObserverExample, «La red se perdió o hay problemas con el servidor») } } } } NetworkObserver.Status.Unavailable -> { showToast( «¡La red no está disponible!» ) } NetworkObserver.Status.Losing -> { showToast( «¡Estás perdiendo tu red!» ) } NetworkObserver.Status.Lost -> { showToast( «¡La red está perdida!» ) } } } } Puede verificar si su conexión a Internet es estable solo si no tiene una URL de servidor: network.callNetworkConnection().observe(this) { isConnected -> lifecycleScope.launch(Dispatchers.IO) { if (isConnected) { cuando { Reachability.hasInternetConnected( contexto = this@NetworkStateObserverExample ) -> lifecycleScope.launchW{ showToast( «Red restaurada») } else -> lifecycleScope.launch{ showToast( «La red se pierde o hay problemas con el servidor») } } } else { //comprueba si hay conexión perdida lifecycleScope.launch{ showToast( «Sin conexión de red») } } } } } 3. También puedes inyectar NetworkStateObserver y usarlo en todas partes de tu aplicación con Hilt ???? : Cree un objeto para NetworkStateModule en su paquete di: @Module @InstallIn(ActivityComponent::class) object NetworkStateModule { @Provides fun provideNetworkStateObserver( actividad: Actividad ): NetworkStateObserver { return NetworkStateObserver.Builder() .actividad(actividad = actividad) .build() } } Declara la variable en tu clase como fragmento o actividad, funciona en ambos: @AndroidEntryPoint clase myFragment : Fragment(){ @Inject lateinit var network: NetworkStateObserver private fun callNetworkConnection() { network.callNetworkConnection() .observe(this) { isConnected -> lifecycleScope.launch(Dispatchers.IO) { if (isConnected) { cuando { Reachability.hasInternetConnected( contexto = this@NetworkStateObserverExample ) -> lifecycleScope.launch{ showToast( «Red restaurada») } else -> lifecycleScope.launch{ showToast( «La red se perdió o hay problemas con el servidor») } } } else { //verificar si hay conexión perdida lifecycleScope.launch{ showToast( «No hay conexión de red» ) } } } } } } anular diversión enResume () { super.onResume() callNetworkConnection() } } Agrega el método en onResume() de tu fragmento o actividad para tener una gran experiencia: override fun onResume() { super.onResume() callNetworkConnection() } ???? Por favor, no dudes en regalarme una estrella ????, también me encantan los destellos ✨ ☺️

Source link

El arsenal de Android: notificaciones push/pull

Actualice el estado de la interfaz de usuario de sus aplicaciones de Android e iOS en tiempo de ejecución. Motivación Actualizar el estado de la interfaz de usuario en tiempo de ejecución es una herramienta muy útil para fines de validación y creación rápida de prototipos. También agrega el beneficio de que puede ser utilizado por todo el equipo de pruebas, ya sean desarrolladores, diseñadores, control de calidad, etc. demo.mov ¿Cómo funciona? Android Android Debug Bridge (ABD) se utiliza para enviar una señal de transmisión al aplicación deseada con una carga útil json como extra. adb shell estoy transmitiendo -p [package] -a [action] -mi [extra key] [extra value]

En el lado de la aplicación hay un BroadcastReceiver que escucha estas cargas útiles. Tras una deserialización exitosa, se emitirá un nuevo estado y, en consecuencia, se activará una actualización de la interfaz de usuario. Disponibilidad: todos los simuladores y/o dispositivos físicos (incluso con depuración wifi) conectados. iOS Las herramientas de desarrollo Xcode de Apple proporcionan una herramienta de línea de comandos para interactuar con el simulador de iOS. Esta herramienta le permite simular el proceso de envío de notificaciones automáticas a un dispositivo: xcrun simctl push [UDID] [bundle id] [path to .apns]

En el lado de la aplicación hay un NotificationBroadcaster que monitorea activamente las notificaciones entrantes. Luego, estas notificaciones se transmiten a los observadores internos dentro de la aplicación. Tras una deserialización exitosa, se emitirá un nuevo estado y, en consecuencia, se activará una actualización de la interfaz de usuario. Disponibilidad: todos los simuladores arrancados. Instalación Android Agregue la dependencia de la biblioteca: implementación(«com.github.guilhe:json-broadcast-handler:${LATEST_VERSION}'») Administrador de paquetes Swift Las implementaciones de Swift están disponibles a través del Administrador de paquetes Swift. En Xcode, vaya a Archivo > Agregar paquetes… y proporcione la URL https://github.com/GuilhE/JsonBroadcaster.git; Utilice el hash de confirmación de la última etiqueta JsonBroadcasterHandler-x. CocoaPods Si usa CocoaPods, agregue lo siguiente a su Podfile: pod ‘JsonBroadcasterHandler’, :git => ‘https://github.com/GuilhE/JsonBroadcaster.git’, :tag => ‘JsonBroadcasterHandler-x’ Uso: desarrolladores Android Sus clases UiState deben estar anotadas con kotlinx.serialization.Serializable (dependencia): @Serializable data class UiState(val memberA: String, val memberB: String) Cree una implementación BroadcastUiModelHost para escuchar las actualizaciones de estado, como se muestra a continuación: host val privado = objeto: BroadcastUiModelHost(coroutineScope, UiState.serializer()) { override fun updateState(new: UiState) { //… } } Agréguelo donde mejor se adapte a su proyecto, ejemplos: si está utilizando androidx.lifecycle.ViewModel, puede hacerlo lo siguiente: clase MatchViewModel : ViewModel() { valor privado _uiState = MutableStateFlow(MatchUiState(home = Team(«PRT», «?????????»), away = Team(«BRA», «??? ?????»))) val uiState: StateFlow = _uiState host val privado = objeto: BroadcastUiModelHost(viewModelScope, MatchUiState.serializer()) { override fun updateState(new: MatchUiState) { _uiState.update { new } } } } Pero en realidad no necesitas un ViewModel, simplemente puedes usar un @Composable, por ejemplo: @Composable divertido MatchScreen() { var uiState: MatchUiState por recordar { mutableStateOf(MatchUiState(casa = Equipo(«PRT», «?????????»), lejos = Equipo(«BRA», «????? ???»))) } LaunchedEffect(Unidad) { val host = objeto: BroadcastUiModelHost(this, MatchUiState.serializer()) { override fun updateState(new: MatchUiState) { uiState = new } } } Match(uiState) } Y lo bueno de esto es que puedes elegir lo que más te convenga: ViewModel, @Composable, Actividad, Fragmento, etc. Para deshabilitarlo, por ejemplo en compilaciones de lanzamiento, anule la declaración del receptor en AndroidManifest agregando una propiedad manifestPlaceholders en build.gradle: android { buildTypes { getByName(«release») { manifestPlaceholders[«enableJsonBroadcastReceiver»] = falso } getByName(«depurar») { manifestPlaceholders[«enableJsonBroadcastReceiver»] = verdadero } } }



iOS Sus clases UiState deben implementar el protocolo Codable: struct UiState: Codable { let memberA: String let memberB: String } Cree una instancia BroadcastUIModelHost dentro de una clase para escuchar las actualizaciones de estado, como se muestra a continuación: var privada uiModelHost: BroadcastUIModelHost! init() { uiModelHost = BroadcastUIModelHost(initState) { [weak self] newState en //… } } Agréguelo donde mejor se ajuste a su proyecto, ejemplo: Si está utilizando un ObservableObject, puede hacer lo siguiente: import SwiftUI import JsonBroadcasterHandler class MatchViewModel: ObservableObject { private var uiModelHost: BroadcastUIModelHost! @Estado var publicado: MatchUiState = MatchUiState(local: Equipo(país:»PRT», bandera:»?????????»), visitante: Equipo(país:»BRA», bandera:»???? ????»)) init() { uiModelHost = BroadcastUIModelHost(estado) { [weak self] newState in self?.state = newState } } } Y lo bueno de esto es que puedes elegir lo que más te convenga, SwiftUI o UIKit: struct MatchScreen: View { @StateObject private var viewModel = MatchViewModel() var body: some View { ZStack { } .onReceive(viewModel.$state) { nuevo en //… } } clase MatchScreen: UIViewController { var privada viewModel: MatchViewModel! cancelables var privados = Establecer() anular la función viewDidLoad() { super.viewDidLoad() viewModel = MatchViewModel() viewModel.$state .receive(on: DispatchQueue.main) .sink { [weak self] state in self?.updateUI(with: state) } .store(in: &cancellables) } función privada updateUI(with state: MatchUiState) { //… } } Dentro de su AppDelegate regístrese para RemoteNotifications y reenvíelos con NotificationBroadcaster: importar UIKit importar JsonBroadcasterHandler clase AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { func aplicación(_ aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().delegate = self application.registerForRemoteNotifications() devuelve verdadero } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notificación: UNNotification, withCompletionHandler completeHandler: @escaping (UNNotificationPresentationOptions) -> Void) { NotificationBroadcaster .broadcast(notification) } } consejo: puede crear indicadores personalizados del compilador, DEBUG_MODE, para encapsular NotificationBroadcaster: func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notificación: UNNotification, withCompletionHandler completeHandler: @escaping (UNNotificationPresentationOptions) -> Void) { #if DEBUG_MODE NotificationBroadcaster.broadcast(notificación) #endif } Uso: equipo de pruebas Android El SDK de Android de Google debe estar instalado para poder utilizar herramientas de línea de comandos; Solicite una versión instalada de la aplicación (depuración wifi o cable conectado); Utilice la GUI de la aplicación de escritorio. Se debe instalar XCode de iOS Apple para poder utilizar herramientas de línea de comandos; Abra XCode y ejecute un simulador con la aplicación; Utilice la GUI de la aplicación de escritorio. Aplicación de escritorio Aunque podemos usar la terminal para enviar comandos, no es práctico. La aplicación de escritorio proporciona una interfaz de usuario sencilla para ayudarnos con esa tarea. Para ejecutarlo, puede: Clonar este proyecto y escribir ./gradlew :desktopApp:run en la terminal. Descargue un .dmg (solo MacOS) e instálelo. Consiguelo aqui. nota: por razones de seguridad, dado que esta aplicación no es de un Desarrollador Identificado, MacOS bloqueará su ejecución. Para evitarlo, deberá hacer clic en «Abrir de todos modos» en Configuración del sistema en Seguridad. Solo es necesario una vez: (Esto no sucederá con el primer enfoque) Patios de juegos Utilice la siguiente carga útil para comenzar: { «home»:{ «country»:»PRT», «flag»:»??????? ?» }, «lejos»:{ «país»:»BRA», «bandera»:»????????? }, «homeGoals»:0, «awayGoals»:0, «started»: false, «running»: false, «finished»: false } Android Dentro del módulo de muestra encontrarás una aplicación de juegos lista para que la pruebes . Para ejecutarlo, puede: Clonar este proyecto y escribir ./gradlew :androidApp:installDebug en la terminal. Descargue el .apk de muestra e instálelo. Consiguelo aqui. El ID de aplicación es com.jsonbroadcaster.matchday iOS. Dentro de la carpeta sample-ios encontrará una aplicación de juegos lista para que la pruebe. Para ejecutarlo: ábralo en Xcode y ejecute la configuración estándar. Importe JsonBroadcaster utilizando el método que prefiera. LICENCIA Copyright (c) 2022-presente GuilhE Licenciado bajo la Licencia Apache, Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link

El arsenal de Android – Base de datos

Un marco de almacenamiento de objetos modular para proyectos multiplataforma de Kotlin. Uso ObjectStore proporciona una interfaz de almacenamiento de clave/valor simple que, de forma predeterminada, utiliza detalles de tipo para derivar la clave automáticamente. Para crear un ObjectStore necesita dos cosas: ObjectStoreWriter: proporciona el mecanismo de persistencia para almacenar datos para acceso posterior. ObjectStoreSerializer: proporciona el mecanismo de serialización para transformar objetos para su almacenamiento. val store = ObjectStore( storeWriter = SharedPreferencesStoreWriter(«prefs», context), storeSerializer = JsonStoreSerializer() ) // Almacenar un objeto store.put(User(«username», «email», …)) // Obtener un objeto o usuario de valor nulo: ¿Usuario? = tienda.getOrNull() // Obtener un objeto o lanzar val usuario: Usuario = store.get() // Obtener un objeto o valor predeterminado usuario: Usuario = store.get(default = Usuario(…)) // Obtener un valor StateFlow userFlow: StateFlow = tienda.getFlow() // Se emitirán llamadas para `poner` nuevos objetos de usuario userFlow.collect { println(it) } // Obtener todas las claves store.keys() // Eliminar un objeto store.remove() // Eliminar todos los objetos store.clear() Al almacenar tipos básicos como String, Boolean, etc., debe proporcionar una clave para el registro. store.put(false, clave = «mi_clave») store.get(predeterminado = falso, clave = «my_key») NOTA: Cuando se apunta a Javascript, todas las clases utilizadas con ObjectStore deben estar anotadas con @Serializable. Esto se usa para derivar claves basadas en nombres de parámetros y clases; otras plataformas no usan la biblioteca Kotlinx.serialization en objectstore-core. Serializadores Para convertir objetos en datos adecuados para el almacenamiento se requiere una implementación de ObjectStoreSerializer. Los siguientes módulos proporcionan capacidades de serialización utilizando el módulo Kotlinx.serialization correspondiente. objectstore-cbor: CborStoreSerializer() objectstore-json: JsonStoreSerializer() objectstore-protobuf: Escritores ProtoBufStoreSerializer() El almacenamiento de datos de objetos requiere una implementación de ObjectStoreWriter. Los siguientes escritores se proporcionan en el módulo objectstore-core: Android: SharedPreferencesStoreWriter(«prefs_name», context) iOS/macOS/tvOS/watchOS: UserDefaultsStoreWriter() Navegador JS: LocalStorageStoreWriter() Todos: InMemoryStoreWriter() File Writer The objectstore-fs proporciona almacenamiento basado en archivos usando okio. Todos los destinos son compatibles excepto iosArm32 y jsBrowser. val store = ObjectStore( storeWriter = FileStoreWriter(«/storage-directory») ) La ruta proporcionada no debe existir o ser un directorio existente donde se puedan almacenar archivos. Cada valor se almacenará en un archivo separado utilizando la clave codificada en hexadecimal como nombre de archivo. Escritores seguros Para almacenar datos de forma segura, el módulo objectstore-secure proporciona escritores que cifran los datos cuando se almacenan en el disco. iOS/macOS/tvOS/watchOS: KeychainStoreWritre(«com.service.name», «com.service.group») Android: EncryptedSharedPreferencesStoreWriter(«prefs_name», context) Escritores envueltos ValueTransformingStoreWriter proporciona un enlace para codificar/decodificar valores antes de que se escriben en el disco. Los métodos de transformación se definen como (tipo: KType, valor: T) -> T, cuando no se controlan debe devolver el valor original. val storeWriter = InMemoryStoreWriter().transformValue( transformGet = { _, valor -> (valor como? Cadena)?.base64Decoded() ?: valor }, transformSet = { _, valor -> (valor como? Cadena)?.base64Encoded () ?: valor } ) MemCachedStoreWriter proporciona almacenamiento en caché diferido en memoria alrededor de cualquier implementación de ObjectStoreWriter. val storeWriter = FileStoreWriter(«/data»).memCached() Descargar repositorios { mavenCentral() // O instantáneas maven(«https://s01.oss.sonatype.org/content/repositories/snapshots/») } dependencias { implementación(«org.drewcarlson:objectstore-core:$VERSION») // Serializadores implementación(«org.drewcarlson:objectstore-cbor:$VERSION») implementación(«org.drewcarlson:objectstore-json:$VERSION») implementación( «org.drewcarlson:objectstore-protobuf:$VERSION») // Implementación de escritores(«org.drewcarlson:objectstore-fs:$VERSION») implementación(«org.drewcarlson:objectstore-secure:$VERSION») } Toml (Haga clic expandir) [versions]
almacén de objetos = «1.0.0-INSTANTÁNEA»

[libraries]
objectstore-core = { module = «org.drewcarlson:objectstore-core», version.ref = «objectstore» } objectstore-fs = { module = «org.drewcarlson:objectstore-fs», version.ref = «objectstore» } objectstore-cbor = { module = «org.drewcarlson:objectstore-cbor», version.ref = «objectstore» } objectstore-json = { module = «org.drewcarlson:objectstore-json», version.ref = «objectstore» } objectstore-protobuf = { module = «org.drewcarlson:objectstore-protobuf», version.ref = «objectstore» } objectstore-secure = { module = «org.drewcarlson:objectstore-secure», version.ref = «objectstore» } Licencia Este proyecto tiene la licencia Apache-2.0, que se encuentra en LICENCIA.

Source link

El arsenal de Android: procesamiento de imágenes

Una biblioteca de Android para aplicar 62 (se agregarán más) filtros LUT fáciles, rápidos y efectivos a las fotos. Con RenderScript, el objetivo es procesar los espacios de color en la LUT y aplicarlos a la imagen en forma de filtro. ¿Qué es LUT? La traducción directa de LUT («Tabla de búsqueda») del inglés significa «tabla de búsqueda». En informática, significa datos donde se asignan y calculan los valores de entrada (entrada) y los valores de salida (salida). Instalación inicial Gradle Agregue los siguientes códigos a su archivo raíz build.gradle (no al archivo build.gradle de su módulo). allprojects { repositories { maven { url ‘https://jitpack.io’ } } } Y agregue un código de dependencia al archivo build.gradle de su módulo. dependencias { implementación ‘com.github.zekierciyas:FancyFilter:Tag’ } Uso La biblioteca Fancy Filter, que es rápida y fácil de usar, generalmente incluye un patrón de construcción simple. Se basa en proporcionar los parámetros necesarios y obtener la imagen filtrada en tipo mapa de bits. FancyFilter.Builder() .withContext(this) .filter(FancyFilters.NO_1) .bitmap(bitmap) .applyFilter { bitmap -> // Obteniendo el mapa de bits filtrado aquí } Copyright 2022 github/zekierciyas (Zeki Erciyas) Con licencia Apache , Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link

El arsenal de Android – Vistas

¡Una biblioteca de Android ligera con animaciones emergentes! Fácil de usar Tamaño pequeño Altamente personalizable Primeros pasos Para usar esta biblioteca en su proyecto, agregue la siguiente dependencia a su archivo build.gradle: allprojects { repositories { … maven { url ‘https://jitpack.io’ } } } dependencias { implementación ‘com.github.gold24park:PopcornView:release-1.0.2’ } Uso Agregue PopcornView a su archivo XML de diseño:
O configure las propiedades de las palomitas de maíz e inicie la animación mediante programación: val popcornView = findViewById(R.id.popcornView) val forma = PopcornShape.DrawableShape( tamaño = 100F, dibujable = ContextCompat.getDrawable(context, R.drawable.popcorn)!!, ) popcornView.start( forma = forma, cantidad = 40, intervalo = 10, ) gravedad: La aceleración debida a la gravedad en píxeles por segundo al cuadrado. (Predeterminado: 0.37F) minVelocity: La velocidad mínima de las palomitas de maíz en píxeles por segundo. (Predeterminado: 20) maxVelocity: La velocidad máxima de las palomitas de maíz en píxeles por segundo. (Predeterminado: 40) angleRangeStart: el ángulo mínimo de lanzamiento de las palomitas de maíz en grados. (Predeterminado: 45) angleRangeEnd: El ángulo máximo de lanzamiento de las palomitas de maíz en grados. (Predeterminado: 135) elasticidad: La elasticidad de las colisiones entre las palomitas de maíz y las paredes. (Predeterminado: 0.6F) fricción: El coeficiente de fricción de las palomitas de maíz en las paredes. (Predeterminado: 0.39F) ttl: El tiempo de vida de las palomitas de maíz en milisegundos. (Predeterminado: 30,000L) desvanecimiento: si las palomitas de maíz deben desvanecerse antes de desaparecer. (Valor predeterminado: verdadero) Personalizar formas con PopcornShape TextShape TextShape representa una forma que se dibuja como texto. Tiene las siguientes propiedades: val forma = PopcornShape.TextShape( tamaño = 100F, texto = «Pop!», textColor = ContextCompat.getColor(this, R.color.amarillo) ) tamaño (obligatorio): El tamaño del texto a ser dibujado. texto (obligatorio): El texto que se va a dibujar. textColor (opcional): el color del texto que se va a dibujar. (Predeterminado: Color.NEGRO). DrawableShape val shape = PopcornShape.DrawableShape( size = 100F, drawable = ContextCompat.getDrawable(this, R.drawable.popcorn)!!, ) DrawableShape representa una forma que se dibuja como un elemento de diseño. Tiene las siguientes propiedades: tamaño (obligatorio): El tamaño del elemento de diseño que se va a dibujar. dibujable (obligatorio): El dibujable que se va a dibujar. Configuración de la posición para hacer estallar Puede especificar la posición desde donde se generarán las palomitas de maíz en el método start(). PopcornView.start(…startX: Float, startY): genera palomitas de maíz a partir de las coordenadas (startX, startY). Alternativamente, puede usar StartPosition: StartPosition StartPosition( xAxis: XAxisPosition.CENTER, yAxis: YAxisPosition.CENTER,) xAxis: XAxisPosition.LEFT | XAxisPosition.CENTRO | XAxisPosition.RIGHT Eje y: YAxisPosition.TOP | YAxisPosition.CENTRO | YAxisPosition.BOTTOM Contribuir Le invitamos a contribuir a este proyecto. Si encuentra algún error, tiene alguna solicitud o sugerencia de función, o simplemente desea mejorar el código, no dude en abrir un problema o enviar una solicitud de extracción. Se agradecen mucho sus contribuciones. Licencia Este proyecto tiene licencia según los términos de la licencia MIT. Consulte LICENCIA para obtener más información.

Source link

Página 2 de 2

Funciona con WordPress & Tema de Anders Norén

suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6 suc6