Gallery no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /Gallery no Android, Entendendo e Utilizando

Gallery no Android, Entendendo e Utilizando

Vinícius Thiengo
(4261) (18)
Go-ahead
"Ninguém se importa com o que você fez ontem. O que você fez hoje para melhorar?"
David Goggins
Kotlin Android
Capa do livro Mapas Android de Alta Qualidade - Masterização Android
TítuloMapas Android de Alta Qualidade - Masterização Android
CategoriasAndroid, Kotlin, Masterização, Especialização
AutorVinícius Thiengo
Edição
Ano2020
Capítulos11
Páginas166
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa! Blz?

Nesse vídeo mostro o componente visual Gallery do Android. Ele está depreciado devido a ineficiencia de seu script interno, porém pela simplicidade de uso e de implmentsção e por ainda ser permitido o seu uso eu achei útil mostra-lo aqui, pois para mim é a melhor maneira de se criar galerias rápidas e práticas nos nossos layouts Android. Fique atento quanto ao uso do LayoutParams, pois os elementos Gallery e internos ao Gallery têm de utilizar o Gallery.LayoutParams. Mas enfim, vou evitar mais delongas e deixar você assitir ao vídeo.

Abaixo o link do post (vídeo) que permiti você entender a implementação de uma classe que herda da classe BaseAdapter:

Utilizando BaseAdapter Para Personalização Completa da ListView

O link para download do projeto se encontra logo abaixo no post.

Página do componente Gallery no site oficial de desenvolvedores Android

Segue imagem esquema do componente visual Gallery:

Gallery no Android, Entendendo e Utilizando

Compartilhe, comente! Vlw

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

WebView no Android, Entendendo e UtilizandoWebView no Android, Entendendo e UtilizandoAndroid
Integrando WebView Android Com JavaScript de Uma WebPageIntegrando WebView Android Com JavaScript de Uma WebPageAndroid
Monitoramento de Inicio e Fim de Carregamento de Página no WebViewMonitoramento de Inicio e Fim de Carregamento de Página no WebViewAndroid
Otimizando Sua APP Android Com OnSaveInstanceStateOtimizando Sua APP Android Com OnSaveInstanceStateAndroid

Compartilhar

Comentários Facebook

Comentários Blog (18)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Vanessa Maia (1) (0)
28/03/2020
Estou tendo problema com exibição de imagens. Não aparece. Antes com SDK 27, tudo ok. Passei para SDK 28. Alterei o Picasso 2.7 e a forma de recupera-lo
Picasso.get().load(caminho).into(imageView)
Nada aparece tudo em branco. Tem como me ajudar?
Responder
Vinícius Thiengo (0) (0)
29/03/2020
Vanessa, tudo bem?

Primeiro é importante ter em mente que o componente Gallery está depreciado no Android desde a API 16 desta plataforma mobile, Android Jelly Bean.

Algumas outras boas opções ao componente Gallery seriam as APIs nativas:

-> ViewPager: https://developer.android.com/reference/android/support/v4/view/ViewPager.html

-> HorizontalScrollView: https://developer.android.com/reference/android/widget/HorizontalScrollView

E também as APIs de terceiros:

-> Carrossel de imagens: https://android-arsenal.com/tag/154?sort=rating

-> Slide de imagens: https://android-arsenal.com/tag/111?sort=rating

Sobre o problema com a Picasso API, que para mim é a melhor API de carregamento de imagens.

Sobre isso, preciso que você me informe o que está sendo apresentado nos logs do Android Studio assim que o carregamento falha.

Estou assumindo que o seu aplicativo está ao menos com a permissão de Internet definida no AndroidManifest.xml.

Outra coisa, não deixe de verificar se as imagens funcionam com o SSL na URL (https) e sem o SSL (http).

Vanessa, caso você não conheça os logs do Android Studio, então primeiro dê uma lida na página do link a seguir:

-> Gravar e visualizar registros com o Logcat: https://developer.android.com/studio/debug/am-logcat?hl=pt-br

É isso.

Surgindo mais dúvidas, pode perguntar.

Abraço.
Responder
13/04/2017
Olá Thiengo, tudo bem?

Sei que estou sendo um tanto "incoveniente", mas estou correndo atrás de livros e apostilas para aprender e não ficar importunando tanto assim. Mas gostaria de finalizar esse app que peguei para criar.

Gostaria de agradecer você pela ajuda, consegui colocar a animação que queria (UFA! Finalmente!). O antigo código que enviei, estava meio confuso mesmo.

Só não entendi uma coisa. Antes de colocar a animação de fundo, aparecia um texto no meu app, depois que inseri a animação, não aparece mais esse texto. Na verdade era apenas uma palavra que aparecia quando era tocado no tela. Parece que a animação ficou tudo na frente, não apare aparecendo mais as palavras na tela.

O meu código java é esse:

...
public class MainActivity extends Activity {

private ImageButton ibMiado;
private TextView tvMiado;

@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ImageView img = (ImageView)findViewById(R.id.animacao);
        img.setBackgroundResource(R.drawable.correndo);
        AnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground();
        frameAnimation.start();


        ibMiado = (ImageButton)findViewById(R.id.imgBotao);
        tvMiado = (TextView)findViewById(R.id.tvMiado);
        tvMiado.setTextSize(16);

        TextView tv = (TextView) findViewById(R.id.tvMiado);
    
        ibMiado.setOnClickListener(new View.OnClickListener() {


    @Override
public void onClick(View v) {
tvMiado.setTextSize(30);
decidir();
}
});
     }

public void decidir(){
    TextView tv = (TextView) findViewById(R.id.tvMiado);

try {
int rndPhrase;
final Random rndNbr = Random();
switch (rndPhrase) {

case 1:
tvDecider.setText("Felix");
mPlayer = MediaPlayer.create(this, R.raw.f_miado);
break;


case 2:
tvDecider.setText("Tom");
mPlayer = MediaPlayer.create(this, R.raw.t_miado);
break;

...


No meu layout, utilizei a ferramenta tools:context, que ficou assim:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android "
    xmlns:customfontdemo="http://schemas.android.com/apk/res-auto "
    xmlns:tools="http://schemas.android.com/tools "
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.jardimiado.MainActivity">

    <ImageButton
        android:id="@+id/imgBotao"
        android:background="@android:color/transparent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true"
        android:layout_gravity="center"
        android:contentDescription="@null"
        />

    <TextView
        android:id="@+id/tvMiado"
android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="#FF0000"
        android:text="@string/gatos"
        android:gravity="center"

        />
    <ImageView
        android:id="@+id/animacao"
        android:layout_width="match_parent"
        android:scaleType="fitCenter"
        android:layout_height="match_parent"
        />
</RelativeLayout>


Mais uma vez, agradeço pela ajuda!
Responder
Vinícius Thiengo (0) (0)
27/04/2017
Joana, tudo bem?

Utilize o FrameLayout como layout root do layout de sua MainActivity. Hoje você está utilizando o RelativeLayout.

Antes de somente alterar para FrameLayout, veja o vídeo do link a seguir, pois assim você vai entender como trabalhar com essa View: http://www.thiengo.com.br/entendendo-e-utilizando-framelayout-no-android

Assim que entender, posicione as Views corretamente e terá o texto sendo apresentado sempre que necessário.

Com o RelativeLayout também é possível fazer isso, mas o entendimento é um pouco menos trivial que quando com o FrameLayout.

Depois informe aqui se conseguiu. Abraço.
Responder
09/04/2017
Thiengo, boa tarde,

Desculpe por tantas perguntas, é que realmente estou começando no mundo android. E o seu site é o melhor que encontrei para tirar minhas dúvidas, pois você realmente responde com exatidão quando faço algumas perguntas. Estou há dias tentando encontrar um jeito para esse código e você está me ajudando bastante;

Agora sim estou "quase finalizando" o meu aplicativo. O meu aplicativo é um jardim onde o usuário quando clica na tela, toca o som de um miado de gato (3 sons diferentes) e como background aparece um felino correndo.

Quando fiz as modificações que você me passou, o fundo animado finalmente apareceu, mas quando é tocado na tela, não toca mais o som. E quando retiro o fundo animado e toca na tela, o som toca normalmente. No layout, usei o "framelayout"


Só falta isso para finalizar: a animação de fundo do gato correndo e quando toca o dedo na tela, ativa o áudio de miado.

Esse é como o código ficou depois que modifiquei com sua ajuda e passarei o codigo do layout também:


public class MainActivity extends Activity {
    /** Called when the activity is first created. */


private ImageButton ibFelinos;
private TextView tvDecider;
private AnimationDrawable felino;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        }


ImageView felinoImage = new ImageView(this);
felinoImage.setBackgroundResource(R.drawable.correndo);
felino = (AnimationDrawable) felinoImage.getBackground();
setContentView(felinoImage);

felino.start(); return;
    }



        ibDecider = (ImageButton)findViewById(R.id.imgBotao);
        tvDecider = (TextView)findViewById(R.id.tvDecider);
                
        TextView tv = (TextView) findViewById(R.id.tvDecider);
            
}
      
    }

public void decidir(){
    TextView tv = (TextView) findViewById(R.id.tvDecider);

final Random rndNbr = Random();
switch (rndPhrase) {


case 1:
tvDecider.setText("Felix");
mPlayer = MediaPlayer.create(this, R.raw.f_miado);
         break;


case 2:
tvDecider.setText("Tom");
mPlayer = MediaPlayer.create(this, R.raw.t_miado);
break;


case 3:
tvDecider.setText("Siames");
mPlayer = MediaPlayer.create(this, R.raw.s_miado);
break;
}
    
    }
}




ESSE É O LAYOUT:


<?xml version="1.0" encoding="utf-8"?>

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android "
    xmlns:customfontdemo="http://schemas.android.com/apk/res-auto "
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/correndo">
  
  
    <ImageButton
        android:id="@+id/imgBotao"
        android:background="@android:color/transparent"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:layout_gravity="center"
        android:contentDescription="@null"
    />
    
    <TextView
        android:id="@+id/tvDecider"
android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
    />
      
        
</FrameLayout>
Responder
Vinícius Thiengo (0) (0)
13/04/2017
Joana, tudo bem?

Não consegui entender seu código, nem mesmo encontrei o método que responde aos cliques em tela.

Se possível, coloque-o bem formatado no PasteBin (https://pastebin.com/ ) e então compartilhe o link dele aqui. Com o código lá fica tranquilo de entender, pois eles formatam como código em um IDE. Abraço.
Responder
08/04/2017
Thiengo, td bem?

Aqui está o código que aparece a mensagem "Multiple markers at this line
- overrides android.app.Activity.onCreate
- Duplicate method onCreate(Bundle) in type MainActivity":

Quando sigo as instruções do Eclipse e retiro o @Override e renomeio para "public void onCreate1 (Bundle savedinstanceState)" perde todo o efeito.


package com.zoo;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import java.util.ArrayList;
import java.util.Random;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.graphics.Typeface;
import android.graphics.drawable.AnimationDrawable;
import android.content.Intent;

@SuppressLint("CutPasteId")



public class MainActivity extends Activity {
    /** Called when the activity is first created. */



private AnimationDrawable felino;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ImageView felinoImage = new ImageView(this);
felinoImage.setBackgroundResource(R.drawable.correndo);
felino = (AnimationDrawable) felinoImage.getBackground();
setContentView(felinoImage);

}


private ImageButton ibFelinos;
private TextView tvDecider;




    @Override
    public void onCreate(Bundle savedInstanceState) {
        
        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        ibDecider = (ImageButton)findViewById(R.id.imgBotao);
        tvDecider = (TextView)findViewById(R.id.tvDecider);
        tvDecider.setTextSize(23);
        
        TextView tv = (TextView) findViewById(R.id.tvDecider);
      
      
}
      
    }
    
  

Tem outro jeito de consertar esse código do que renomear o onCreate e retirar o @Override?
Responder
Vinícius Thiengo (0) (0)
09/04/2017
Joana, o @Override é apenas uma annotation que indica que você está sobrescrevendo um método da classe pai, em seu caso a classe pai é a classe Activity.

O problema que vejo em seu código é que há dois métodos onCreate(). Tem que haver apenas um, digo, os dois têm a mesma assinatura. Você tem que colocar todo o código de seus onCreate() em apenas um deles e com a seguinte assinatura:

@Override
protected void onCreate(Bundle savedInstanceState){
        /* RESTANTE DO CÓDIGO AQUI */
}

Assim seu projeto deve funcionar.

Mesmo assim, antes de tentar a correção, veja o vídeo do link a seguir para entender mais sobre o que está acontecendo de errado em seu código: http://www.thiengo.com.br/ciclo-de-vida-de-uma-atividade-no-android

Abraço.
Responder
04/04/2017
Olá Thiengo, tudo bem?

Agradeço pela ajuda, consegui fazer o que queria, mas ocorreu um erro que não estou conseguindo solucionar e, novamente, pedirei a sua ajuda.

Resolvi criar um novo projeto android no eclipse para ter apenas essas imagens mudando, quando consegui, transferi o código para o meu aplicativo que estou quase finalizando e apresentou o seguinte erro:

"Multiple markers at this line
- overrides android.app.Activity.onCreate
- Duplicate method onCreate(Bundle) in type MainActivity"

Quando sigo as recomendações do Eclipse (como renomear onCreate, depois deletar "@Override", etc...) esse meu código perde todo o efeito e quando mantenho esse meu novo código (sem alterar nada) e faço as modificações no código que já estava funcionando, o meu novo código (de mudar as imagens no background") funciona perfeito e o que alterei fica inoperante.

Tem como resolver isso? Estou iniciando no android e ainda tenho muitas dificuldades, mas aos poucos estou aprendendo.

Agradeço pela sua ajuda!
Responder
Vinícius Thiengo (0) (0)
08/04/2017
Joana, fiquei na dúvida sobre o problema do onCreate().

Se possível, coloque no PasteBin (https://pastebin.com/ ) esse seu código com problema e compartilhe o link aqui. Sinalize nele o método que deveria estar funcionando e não está. Abraço.
Responder
27/03/2017
Thiengo, boa tarde.

pode me dar um help numa aplicação aqui que não estou conseguindo fazer? estou quase finalizando um app aqui, mas quero que a imagem de fundo (background) mude sempre que o aplicativo é iniciado. Por exemplo, quando o aplicativo é iniciado, a imagem de fundo seria um cachorro, caso o usuário inicie novamente o aplicatido, a imagem de fundo já mudaria, ao invés de aparecer o cachorro, a imagem de fundo mudaria para um gato. Tenho 10 imagens de fundo que gostaria que fosse mudado sempre que o apçlicativo é iniciado.


Criei uma imageview no layout e configurei o id android:id="@+id/imgRandom", depois inseri esse código, mas nada funcionou:


<code>

final Random rnd = new Random();

    @Override
    protected void onCreate(
        final Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.rnd_images);

        final ImageView img = (ImageView) findViewById(R.id.imgRandom);
        
        final String str = "img_" + rnd.nextInt(2);
        img.setImageDrawable
        (
            getResources().getDrawable(getResourceID(str, "drawable",
                getApplicationContext()))
            );
    }

    protected final static int getResourceID
    (final String resName, final String resType, final Context ctx)
    {
        final int ResourceID =
            ctx.getResources().getIdentifier(resName, resType,
                ctx.getApplicationInfo().packageName);
        if (ResourceID == 0)
        {
            throw new IllegalArgumentException
            (
                "No resource string found with name " + resName
                );
        }
        else
        {
            return ResourceID;
        }
    }
}

</code>

Você teria como me ajudar como faço para que a imagem background random funcione?
Responder
Vinícius Thiengo (0) (0)
01/04/2017
Joana, tudo bem?

Para esse efeito de mudança de imagem em background você não precisa de um ImageView, pode alterar o background do View root do layout.

Primeiro, certifique-se de ter ao menos quatro versões de cada imagem de background de seu App. Uma para cada folder: drawable-mdpi, drawable-hdpi, drawable-xhdpi e drawable-xxhdpi.

Veja as medições no link a seguir: http://stackoverflow.com/a/13228830/2578331

Depois, para apresentar uma imagem em background, utilize o código a seguir:

ViewGroup vg = (ViewGroup) findViewById( R.id.identificador_do_view_que_tera_um_novo_bg );
vg.setBackgroundResource( R.drawable.nome_imagem );

Para saber qual imagem apresentar, você pode utilizar um algoritmo junto ao SharedPreferences para saber qual imagem ainda não foi apresentada e então mostra-la como background.

Quando todas as imagens estiverem com a mesma quantidade de apresentações como background, inicie o ciclo novamente.

Você precisa persistir a quantidade de vezes que as imagens foram apresentadas caso queira que todas sejam mostradas.

Se não conhece o SharedPreferences, veja o artigo / vídeo a seguir: http://www.thiengo.com.br/sharedpreferences-no-android-entendendo-e-utilizando

Caso não tenha problema em apresentar uma mesma imagem mais vezes do que outras, então mantenha o trabalho com seu algoritmo randômico. Mas utilize o script de alteração de background que coloquei no início da resposta.

Abraço.
Responder
13/08/2015
Oi Thiengo, como implementar de forma que ele busque as imagens via web?
Responder
Vinícius Thiengo (0) (0)
14/08/2015
Escolhendo uma lib de acordo com o comentário que fiz abaixo, vc pode utilizar a lib Fresco para carregamento de imagens da Web, é mesma lib que o Facebook utiliza nas APPs dele, veja esse vídeo sobre ela (http://www.thiengo.com.br/lib-fresco-para-carregamento-de-imagens-com-gifs-e-webps-animados-material-design-android-parte-12 ). Abraço
Responder
13/08/2015
Oi Thiengo, que outra implementação substitui o gallery, uma vez que ele já está depreciado?
Responder
Vinícius Thiengo (0) (0)
14/08/2015
Fala Ilton, blz?
Tente o ImageSwitch (http://www.thiengo.com.br/imageswitcher-no-android-entendendo-e-utilizando ) ou algumas dessas libs de Gallery no Android (https://android-arsenal.com/search?q=gallery ). Abraço
Responder
claudineiarteman (0) (0)
03/10/2014
Thiengo, como fa?o para habilitar o zoom no gallery?? obrigado claudinei
Responder
Vinícius Thiengo (0) (0)
03/10/2014
Fala Claudinei, blz?
Não implementei ainda zoom na Gallery, mas tb não aconselho vc a utiliza-la, pois ela na época que fiz o vídeo já estava depreciada... de qualquer forma encontrei essa lib que pode lhe ajudar (https://github.com/davemorrissey/subsampling-scale-image-view ) Abraço
Responder