Atividade 9: Botões Interativos
Se o usuário toca, o app tem que responder! Como criar botões clicáveis no mobile.
🎯 Objetivos desta aula
-
✓
Usar os componentes
Button,TouchableOpacityePressable -
✓
Capturar cliques via propriedade
onPress - ✓ Exibir alertas nativos rápidos do sistema
👆 Componentes de Clique
Muitos novatos tentam colocar propriedades como onClick em caixas
<View> e ficam confusos quando não funciona. No React Native, apenas "Elementos
Clicáveis Específicos" capturam toques (usando a propriedade onPress). Existem 3
principais:
1. <Button /> (O nativo sem graça)
Super fácil de usar, mas NÃO pode ser estilizado profundamente e muda de forma se você abre no Android ou iOS.
<Button title="Clique-me" color="red" onPress={suaFuncao} />
2. <TouchableOpacity> (O mais amado ❤️)
Funciona exatamente como uma
<View> onde você pode aplicar cor, border-radius e formatar o texto dento
dele do jeito que quiser! Quando tocado, ele fica levemente transparente (gera Opacidade)
dando um feedback visual excelente ao usuário.
<TouchableOpacity style={styles.botaoBonito} onPress={suaFuncao}>
<Text style={styles.textoDoBotao}>Confirmar</Text>
</TouchableOpacity>
3. <Pressable> (O mais poderoso)
O futuro dos botões. Permite saber se o dedo do usuário "acabou de encostar na tela" (onPressIn) ou se "pressionou e segurou por muito tempo" (onLongPress). Recomendado para cenários complexos.
🧐 Atenção ao case: Na web é onClick. No app (touch) é
onPress!
💻 Exemplo Prático
Neste exemplo usaremos Alertas do sistema, e você vai comparar a visual de um botão
básico com um botão totalmente customizado usando TouchableOpacity:
import React from 'react';
import { View, Text, Button, TouchableOpacity, Alert, StyleSheet } from 'react-native';
export default function App() {
// Nossas funções (ações)
const clicarBasico = () => {
Alert.alert("Sucesso", "Você clicou no botão Padrão do sistema!");
};
const clicarPersonalizado = () => {
Alert.alert("Eba!", "Você clicou no botão Bonito! 🚀");
};
// Render da tela
return (
<View style={styles.container}>
<Text style={styles.titulo}>Teste os Botões</Text>
{/* 1. Botão Padrão Sem Graça */}
<Button
title="Botão do Sistema"
onPress={clicarBasico}
/>
<View style={styles.espaco} />
{/* 2. Botão Customizado */}
<TouchableOpacity
style={styles.botaoCustomizado}
onPress={clicarPersonalizado}
activeOpacity={0.7}
>
<Text style={styles.textoBotao}>Botão Customizado ✨</Text>
</TouchableOpacity>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#fff',
},
titulo: {
fontSize: 22,
fontWeight: 'bold',
marginBottom: 30
},
espaco: {
height: 40 // Apenas empurrar os elementos
},
botaoCustomizado: {
backgroundColor: '#8b5cf6', // Roxo legal
paddingVertical: 15, // Espaço interno em cima/baixo
paddingHorizontal: 30, // Espaço interno direita/esquerda
borderRadius: 30, // Botão em "pílula"
elevation: 3 // Sombra no Android
},
textoBotao: {
color: 'white',
fontSize: 16,
fontWeight: 'bold'
}
});
🎮 Desafios Práticos
Copie o código base e trabalhe a lógica de botões no Snack:
Modificar 🛠️
- Localize as constantes de função criadas no início do javascript (`clicarPersonalizado`, por exemplo). Altere a mensagem do alerta (`Alert.alert`) nela para o seu gosto ("Olá fulano! Botão clicado").
- Altere a propriedade `activeOpacity` do TouchableOpacity que por padrão deixei em 0.7... mude ela para `0.1` e clique. O que aconteceu com o efeito quando foi muito amassado né?
Melhorar 🚀
Dois é bom, três é demais!
- Copie as linhas de código do `
` e crie um **novo** abaixo dele. - Crie no StyleSheet uma cópia dos estilos (`botaoCustomizado2` e `textoBotao2`), dessa vez mudando a cor de fundo dele para Vermelho e o borderRadius para zero, criando um botão quadradão do mal! Aplique na sua nova cópia.
Criar ✨
Lógica independente.
- Crie uma NOVA função no Javascript igualzinha a `clicarPersonalizado()`, chame ela de `clicarPerigoso()`.
- Faça ela estourar um alerta "O Sistema Será Formatado!".
- Coloque o nome da função no seu Botão Quadrado Vermelho na parte
onPress={clicarPerigoso}!