Saudações!
Hoje falaremos sobre a interface do usuário no Android em aplicativos criados usando a estrutura de desenvolvimento de plataforma cruzada Kivy. Talvez você não saiba disso, mas para o Kivy existe a biblioteca KivyMD, que fornece widgets no estilo Material Design para seus programas. Infelizmente, nada disso existe na plataforma iOS. Além disso, o KivyMD, aparentemente, foi deixado por seu criador, já que o último commit no nabo ocorreu cerca de um ano atrás. O que fazer e como viver com isso, continue a ler ...
Ocasionalmente, visitando o
repositório oficial do KivyMD , infelizmente descobri que nada estava mudando nele e não iria mudar:
Nos meus projetos Kivy, eu posso implementar qualquer interface do usuário, o que de fato eu faço. Mas, recentemente, descobri que estou arrastando uma parte crescente dos módulos que implementei de projeto para projeto, o que é terrivelmente inconveniente. Algumas dessas soluções são publicadas como repositórios separados no GitHub. No entanto, ainda não é conveniente compartilhar, gerenciar e usar tudo isso, porque existem mais e mais módulos desse tipo. A decisão foi tomada há relativamente pouco tempo: o KivyMD, como um projeto de código aberto, está sob minha responsabilidade. Agora, um garfo desta biblioteca está
aqui .
Corrigi erros que alguns widgets sofreram. Por exemplo, o widget MDDropDownMenu foi privado da função de rolar e selecionar um item. Agora fica assim:
Além de várias outras correções, grandes e não muito, novos widgets e controles foram adicionados. Além dos
MDFlatButton existentes
, MDRaisedButton, MDIconButton MDFloatingActioButton ...
... Implementei vários controles:
MDRectangleFlatButton, MDRectangleFlatIconButton, MDRoundFlatIconButton, MDRoundFlatButton, MDFillRoundFlatButton , que estavam claramente
ausentes no kit:
Também tento simplificar o trabalho com o KivyMD o máximo possível. O uso dos novos controles descritos acima na sua marcação terá a seguinte aparência:
MDRectangleFlatButton: text: "MDRectangleFlatButton" MDRectangleFlatIconButton: text: "I love Python" icon: "language-python" MDRoundFlatButton: text: "I love Python" icon: "language-python" MDRoundFlatIconButton: text: "I love Python" icon: "language-python" MDFillRoundFlatButton: text: "I love Python"
Recentemente, uma postagem foi adicionada ao meu grupo VKontakte no qual uma pessoa solicitou ajuda na implementação de um cartão de contato:
Saudações!
Pergunta sobre o layout.
Estou criando um cartão de contato e não posso escolher o tipo de layout para
a) não esticaram, e os elementos foram dispostos um após o outro verticalmente
b) não houve lacunas gigantescas entre os elementos
Sobre o BoxLayout experimentado, o StackLayout - por algum motivo, as lacunas entre os elementos. Anexo a tela do formulário e o código kv.
Pode-se ver que após o primeiro bloco com um avatar existe uma lacuna, depois dos blocos de texto também. Como corrigir para que haja espaços iguais em todos os lugares, para que todos os elementos sejam do tipo valign: True?
Aqui está o resultado:
Corrigi o código e, ao mesmo tempo, adicionei um widget de cartão ao KivyMD -
MDUserAnimationCard , que implementa esse comportamento:
Tudo o que você cria é conteúdo que será exibido no cartão do usuário. A função de rolagem do conteúdo será aplicada automaticamente se sua altura exceder o espaço restante na tela:
Em seguida, basta adicionar a classe do conteúdo que você criou ao
MDUserAnimationCard :
def show_user_card(self): user_animation_card = MDUserAnimationCard( user_name="Lion Lion", path_to_avatar="./assets/african-lion-951778_1280.jpg", callback=main_back_callback) user_animation_card.box_content.add_widget(ContentForAnimCard()) user_animation_card.open()
MDStackFloatingButtons, já conhecido pelo
artigo , migrou para o KivyMD:
O uso desse widget também foi simplificado ao máximo:
def example_add_stack_floating_buttons(self): def set_my_language(instance_button): toast(instance_button.icon) screen = self.main_widget.ids.scr_mngr.get_screen('stack buttons') screen.add_widget(MDStackFloatingButtons( icon='lead-pencil', floating_data={ 'Python': 'language-python', 'Php': 'language-php', 'C++': 'language-cpp'}, callback=set_my_language))
Vários cartões prontos para uso foram implementados, por exemplo, para uma lista de postagens, etc .:
Exemplo de uso:
MDCardPost(text_post='Card with text', swipe=True, callback=callback))
menu_items = [ {'viewclass': 'MDMenuItem', 'text': 'Example item %d' % i, 'callback': self.callback_for_menu_items} for i in range(2) ] MDCardPost( right_menu=menu_items, swipe=True, callback=callback text_post='Card with a button to open the menu MDDropDown'))
MDCardPost( likes_stars=True, callback=callback, swipe=True, text_post='Card with asterisks for voting.'))
buttons = ['facebook', 'vk', 'twitter'] text_post = \ "This is my favorite cat. He's only six months " "old. He loves milk and steals sausages :) " "And he likes to play in the garden." MDCardPost( source="./assets/kitten-1049129_1280.jpg", tile_text="Little Baby", tile_font_style="Headline", text_post=text_post, with_image=True, swipe=True, callback=callback, buttons=buttons))
Progresso do download de conteúdo do servidor, um gerenciador de arquivos simples, widget PullToUpdate:
Demonstração em vídeo completa dos widgets da biblioteca:
Voltando ao início, direi que tudo isso é bom apenas para Android, porque, é claro, não podemos usar o Design de materiais em aplicativos para a plataforma iOS. E eu gostaria muito de adaptar o KivyMD para gerar uma interface do usuário que parecesse nativa no iOS também. Tecnicamente, não há barreiras para essa tarefa. O único problema é que eu não tenho um dispositivo iOS, então não sei como é a interface do usuário, a animação e outros designs. Obviamente, existem guias de design para iOS, mas os guias são guias, e fiquei feliz se uma pessoa interessada em desenvolver a biblioteca KivyMD enviou dezenas de capturas de tela e animações do design de referência de aplicativos na plataforma iOS. Por exemplo, basta o que já está implementado no KivyMD, mas apenas para uma maçã. Para sim, deixe-me despedir-se, bata no PM, espero que, como sempre, não tenha sido inútil.