2. Brasil - #appsum11br
Argentina - #appsum11ar
México - #appsum11m
developer.motorola.com
Título da apresentação Versão 1.0 24.02.09
3. Nós estamos em um lugar totalmente
novo.
Leve as coisas certas a bordo.
4. Adquira a mágica
01 PENSE NA ERGONOMIA
02 ENVOLVA OS SENTIDOS
03 USE APARÊNCIAS INCRÍVEIS
04 TORNE-O ÓBVIO
5. Adquira a mágica
01 PENSE NA ERGONOMIA
Layouts com orientação paisagem
Notificações elaboradas
Tamanhos de textos
02 ENVOLVA OS SENTIDOS
Imagens
Sensibilidade ao toque
03 USE APARÊNCIAS INCRÍVEIS
Temas, temas, temas
04 TORNE-O ÓBVIO
Barras de ações
Fragmentos
Clique e arraste
19. Notificações elaboradas
Use a classe Notification.Builder
Notification.Builder builder = new
Notification.Builder( this );
Como AlertDialog.Builder
20. Notificações elaboradas
Crie a notificação que você quiser
builder.setSmallIcon(R.drawable.icon)
.setContentTitle(title)
.setContentText(text)
.setContentIntent(pintent) // Um “pending intent”
.setLargeIcon(myBitmap)
;
22. Notificações elaboradas
Adquira um pouco de mágica: crie um botão clicável
RemoteViews layout = new RemoteViews
getPackageName(), R.layout.notification);
layout.setTextViewText(R.id.notification_title,
getString(R.string.app_name));
layout.setOnClickPendingIntent(R.id.notification_button,
getDialogPendingIntent("Tapped") );
builder.setContent(layout);
23. Notificações elaboradas
Estratégia para compatibilidade com versões anteriores
(“backward compatibility”)
private static boolean isHoneycomb =
android.os.Build.VERSION.SDK_INT > 10;
if (!isHoneycomb)
// iniciar um intent de Activity
else
// iniciar outro
24. Adquira a mágica
01 PENSE NA ERGONOMIA
02 ENVOLVA OS SENTIDOS
Imagens
Sensibilidade ao toque
03 USE APARÊNCIAS INCRÍVEIS
04 TORNE-O ÓBVIO
25. A visão supera todos os
outros sentidos.
Regras do cérebro
Dr. John Medina
28. Imagens
Escolha uma estratégia de imagem
Um conjunto de imagens e deixe o Android dimensionar
automaticamente?
Conjuntos de recursos personalizados para tamanhos e
densidades diferentes?
Determinar a densidade mais comumente usada?
Recuperar imagens dinamicamente em tempo de execução e
escalar para o dispositivo?
29. Imagens
Memória vs tamanho do arquivo: um exemplo
Dimensionamento automático
32 MB de memória
324 KB de tamanho
Conjuntos de imagens
23 MB de memória
728 KB de tamanho
31. Imagens
Apresente amostras de imagens grandes em tempo de
execução para economizar memória
BitmapFactory.Options options = new
BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 4;
options.inScaled = true;
options.inTargetDensity = screenDensity;
Bitmap bitmap =
BitmapFactory.decodeResource(
getResources(),
R.drawable.clover, options);
32. Imagens
Onde colocar imagens e ícones
Padrão, dimensionado
automaticamente
Ícones de alta
resolução
Pré-dimensionado para
Combine estilo 3.0 densidade
35. Sensibilidade ao toque
Certifique-se de que todos os alvos possam ser tocados
public View getView( int position,
View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mImageIds[position]);
i.setLayoutParams(new Gallery.LayoutParams(
300, 200));
i.setScaleType(ImageView.ScaleType.FIT_XY);
i.setBackgroundResource(
mGalleryItemBackground);
return i;
}
36. Sensibilidade ao toque
Veja como as imagens são transferidas entre dispositivos
160 dpi – média
Proporção 16:9
37. Adquira a mágica
01 PENSE NA ERGONOMIA
02 ENVOLVA OS SENTIDOS
03 USE APARÊNCIAS INCRÍVEIS
Temas, temas, temas
04 TORNE-O ÓBVIO
40. Temas
Mas eles exigem aceleração de hardware (“hardware
acceleration”)
<application android:icon="@drawable/icon"
android:label="@string/app_name"
android:hardwareAccelerated="true" >
Disponível somente no
Honeycomb
41. Temas
Porém, você pode querer que sua aplicação funcione em várias
versões do Android
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="11" />
42. Temas
Crie diversos temas para versões do Android
<style … parent=
"@android:style/Theme">
<style … parent=
"@android:style/Theme.Holo">
43. Certifique-se de que todas as chamadas de
API que você usa funcionam para todas as
versões de API que você suporta.
44. Adquira a mágica
01 PENSE NA ERGONOMIA
02 ENVOLVA OS SENTIDOS
03 USE APARÊNCIAS INCRÍVEIS
04 TORNE-O ÓBVIO
Barras de ações
Fragmentos
Clique e arraste
45. Barras de ações
Torne os recursos de seus aplicativos prontamente disponíveis
Ícone da
app Diálogo dropdown
Visualização Itens de ações
de ações
47. Barras de ações
Etapa 1: foco no nível 11 de API
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="11" />
48. Barras de ações
Etapa 2: coloque itens do menu na barra de ações
<item android:id="@+id/favorite"
android:title="@string/favorite"
android:icon="@drawable/ic_menu_star"
android:showAsAction="ifRoom" />
49. Barras de ações
Etapa 3: manipule a seleção de opções como de costume
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.favorite:
// faça algo
return true;
…
}
51. Barras de ações
Use um pouco de mágica, estilize
<style name="MyTheme"
parent="android:style/Theme.Holo" >
<item name="android:actionBarStyle">
@style/ActionBar</item>
</style>
<style name="ActionBar"
parent="android:style/Widget.Holo.ActionBar">
<item name="android:background">
@drawable/my_background</item>
</style>
52. Barras de ações
Use um pouco de mágica, adicione um diálogo
Use AlertDialog.Builder
Crie um diálogo personalizado em XML
Use um DialogFragment
53. Barras de ações
Mas faça coisas do Honeycomb somente no Honeycomb
private static boolean isHoneycomb =
android.os.Build.VERSION.SDK_INT > 10;
se (isHoneycomb) {
// criar o diálogo personalizado aqui
}
58. Fragments (Fragmentos)
Encontre seus fragments, em sua Activity principal
Fragment gridFrag =
getFragmentManager().
findFragmentById(R.id.photogrid);
Fragment photoFrag =
getFragmentManager().
findFragmentById(R.id.the_frag);
59. Fragments (Fragmentos)
Verifique a orientação e ajuste as exibições (“views”)
private boolean photoInline = false;
photoInline = (photoFrag != null &&
getResources().getConfiguration().orientation
== Configuration.ORIENTATION_LANDSCAPE);
if (photoInline) {
// faça algo
} else if ( photoFrag != null ) {
getView().setVisibility(View.GONE);
}
61. Fragments (Fragmentos)
Use um pouco de mágica: anime a exibição do fragmento –
passo 1
<set>
<objectAnimator
xmlns:android=
http://schemas.android.com/apk/res/android
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="-1280"
android:valueTo="0"
android:duration="500" />
</set>
62. Fragments (Fragmentos)
Use um pouco de mágica: anime a exibição do fragmento –
passo 2
FragmentTransaction ft =
getFragmentManager().beginTransaction();
ft.setCustomAnimations( R.anim.slide_in_left,
R.anim.slide_out_right );
DetailsFragment newFrag =DetailsFragment.newInstance();
ft.replace(R.id.details_fragment_container, newFrag,
"detailFragment");
ft.commit();
63. Clique e arraste (“Drag and drop”)
Cria envolvimento físico, direto e imediato
64. Clique e arraste (“Drag and drop”)
Tem diversos estados de evento
ACTION_DRAG_STARTED
ACTION_DRAG_ENTERED
65. Clique e arraste (“Drag and drop”)
Tem diversos estados de evento
ACTION_DROP
ACTION_DRAG_ENDED
66. Clique e arraste (“Drag and drop”)
Veja como isso funciona nos fragmentos
67. Clique e arraste (“Drag and drop”)
Para iniciar, chame startDrag()
Escolha um gesto que inicia um arrasto: long click?
Crie um listener: OnLongClickListener()
Crie objetos ClipData e DragShadowBuilder
Inicie um arrasto
public boolean onLongClick(View v) {
ClipData data = ClipData.newPlainText("foo","bar");
DragShadowBuilder shadowBuilder = new DragShadowBuilder();
v.startDrag(data, shadowBuilder, v, 0);
return true;
}
68. Clique e arraste (“Drag and drop”)
Em seguida, continue com um listener e onDrag()
Criar um ouvinte de arrasto (implementar OnDragListener)
Substituir onDrag e manipular eventos
class BoxDragListener implements OnDragListener {
public boolean onDrag(View self, DragEvent event) {
if (event.getAction() ==
DragEvent.ACTION_DRAG_STARTED) {
// fazer algo
}
// manipular outros eventos
}
69. Perguntas?
@suzalex
@motodev
@motodevbr
Brasil - #appsum11br
Argentina - #appsum11ar
México - #appsum11mx
community.developer.motorola.com