View
se Drawable
para GIFs animados no Android.
GIFLib empacotado via JNI é usado para renderizar quadros. Dessa forma, deve ser mais eficiente que as classes WebView
ou Movie
.
Insira a seguinte dependência no arquivo build.gradle
do seu projeto.
dependências { implementação 'pl.droidsonroids.gif:android-gif-drawable:1.2.29'}
Observe que o repositório central do Maven deve ser definido, por exemplo. build.gradle
de nível superior assim:
script de construção { repositórios { mavenCentral() } } todos os projetos { repositórios { mavenCentral() } }
As compilações de desenvolvimento atuais (construídas a partir do branch dev
) são publicadas no repositório de snapshots do OSS. Para usá-los, especifique o URL do repositório no bloco de repositories
:
repositórios { mavenCentral() maven {url "https://oss.sonatype.org/content/repositories/snapshots" } } dependências { implementação 'pl.droidsonroids.gif:android-gif-drawable:1.2.+'}
<dependência> <groupId>pl.droidsonroids.gif</groupId> <artifactId>android-gif-drawable</artifactId> <version>insira a versão mais recente aqui</version> <type>ar</type> </dependency>
Consulte Exemplo de projeto Eclipse com instruções de configuração.
Últimos downloads de lançamento
Android 4.2+ (API de nível 17+)
para renderização acelerada por hardware GifTextureView
para GifTexImage2D
OpenGL ES 2.0+
Android NDK necessário para compilar fontes nativas
Consulte o diretório sample
. Projeto de amostra está em construção. Nem todos os recursos estão cobertos ainda.
A maneira mais simples é usar GifImageView
(ou GifImageButton
) como um ImageView
normal:
<pl.droidsonroids.gif.GifImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/src_anim"android:background="@drawable/bg_anim"/>
Se os drawables declarados por android:src
e/ou android:background
forem arquivos GIF, eles serão automaticamente reconhecidos como GifDrawable
se animados. Se o drawable não for um GIF, as visualizações mencionadas funcionam como ImageView
e ImageButton
simples.
GifTextView
permite que você use GIFs como drawables compostos e plano de fundo.
<pl.droidsonroids.gif.GifTextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:drawableTop="@drawable/left_anim"android:drawableStart="@drawable/left_anim"android:background="@drawable/bg_anim "/>
GifImageView
, GifImageButton
e GifTextView
também possuem ganchos para setters implementados. Portanto, GIFs animados podem ser definidos chamando setImageResource(int resId)
e setBackgroundResource(int resId)
GifDrawable
pode ser construído diretamente de várias fontes:
//arquivo de ativosGifDrawable gifFromAssets = new GifDrawable( getAssets(), "anim.gif" ); //recurso (desenhável ou bruto)GifDrawable gifFromResource = new GifDrawable( getResources(), R.drawable.anim ); //UriContentResolver contentResolver = ... //pode ser nulo para arquivo:// UrisGifDrawable gifFromUri = new GifDrawable( contentResolver, gifUri );//byte arraybyte[] rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes ); //FileDescriptorFileDescriptor fd = new RandomAccessFile( "/path/anim.gif", "r" ).getFD();GifDrawable gifFromFd = new GifDrawable( fd ); //arquivo caminhoGifDrawable gifFromPath = new GifDrawable( "/path/anim.gif" ); //arquivoFile gifFile = new File(getFilesDir(),"anim.gif");GifDrawable gifFromFile = new GifDrawable(gifFile); //AssetFileDescriptorAssetFileDescriptor afd = getAssets().openFd( "anim.gif" );GifDrawable gifFromAfd = new GifDrawable( afd ); //InputStream (deve suportar marcação)InputStream sourceIs = ...BufferedInputStream bis = new BufferedInputStream( sourceIs, GIF_LENGTH );GifDrawable gifFromStream = new GifDrawable( bis ); //direto ByteBufferByteBuffer rawGifBytes = ...GifDrawable gifFromBytes = new GifDrawable( rawGifBytes );
InputStreams são fechados automaticamente no finalizador se GifDrawable não for mais necessário, então você não precisa fechá-los explicitamente. Chamar recycle()
também fechará a fonte de entrada subjacente.
Observe que todas as fontes de entrada precisam ter a capacidade de retroceder até o início. É necessário reproduzir corretamente GIFs animados (onde a animação é repetível), uma vez que os quadros subsequentes são decodificados sob demanda da fonte.
GifDrawable
implementa Animatable
e MediaPlayerControl
para que você possa usar seus métodos e muito mais:
stop()
- interrompe a animação, pode ser chamado de qualquer thread
start()
- inicia a animação, pode ser chamado de qualquer thread
isRunning()
- retorna se a animação está em execução ou não
reset()
- retrocede a animação, não reinicia a parada
setSpeed(float factor)
- define um novo fator de velocidade da animação, por exemplo. passar 2.0f dobrará a velocidade da animação
seekTo(int position)
- busca animação (dentro do loop atual) para determinada position
(em milissegundos)
getDuration()
– retorna a duração de um loop da animação
getCurrentPosition()
- retorna o tempo decorrido desde o início de um loop atual de animação
Os controles padrão para um MediaPlayer (como no VideoView) podem ser usados para controlar a animação GIF e mostrar seu progresso atual.
Basta definir GifDrawable
como MediaPlayer em seu MediaController assim:
@Overrideprotected void onCreate(Bundle saveInstanceState) {super.onCreate(savedInstanceState);GifImageButton gib = new GifImageButton(this);setContentView(gib);gib.setImageResource(R.drawable.sample);final MediaController mc = new MediaController(this) ;mc.setMediaPlayer((GifDrawable) gib.getDrawable());mc.setAnchorView(gib);gib.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(Ver v) {mc.show(); } }); }
getLoopCount()
- retorna uma contagem de loop conforme definido na extensão NETSCAPE 2.0
getNumberOfFrames()
- retorna o número de frames (pelo menos 1)
getComment()
- retorna o texto do comentário ( null
se o GIF não tiver comentários)
getFrameByteCount()
- retorna o número mínimo de bytes que podem ser usados para armazenar pixels do quadro único
getAllocationByteCount()
- retorna o tamanho (em bytes) da memória alocada usada para armazenar pixels de um determinado GifDrawable
getInputSourceByteCount()
- retorna o comprimento (em bytes) dos dados de entrada de apoio
toString()
- retorna informações legíveis por humanos sobre o tamanho da imagem e o número de quadros (destinados a fins de depuração)
GifDrawable
a vários View
s Normalmente, uma única instância GifDrawable
associada a vários View
s será animada apenas na última. Para resolver a criação de uma instância MultiCallback
, adicione View
s a ela e defina o retorno de chamada para determinado drawable, por exemplo:
MultiCallback multiCallback = new MultiCallback();imageView.setImageDrawable(gifDrawable);multiCallback.addView(imageView);anotherImageView.setImageDrawable(gifDrawable);multiCallback.addView(anotherImageView);gifDrawable.setCallback(multiCallback);
Observe que se você alterar um drawable, por exemplo, ImageView
, o retorno de chamada será removido do drawable anterior. Depois disso, você deve reatribuir o retorno de chamada ou a mesma instância GifDrawable
irá parar de ser animada. Consulte #480 para obter mais informações.
recycle()
- fornecido para acelerar a liberação de memória (como em android.graphics.Bitmap
)
isRecycled()
- verifica se o drawable é reciclado
getError()
- retorna detalhes do último erro
O nível mínimo da API agora é 17 (Android 4.2). armeabi
(arm v5 e v6) não é mais compatível.
O nível mínimo da API agora é 14 (Android 4.0).
Significativo apenas se as regras de proguard do consumidor (incluídas na biblioteca) não forem usadas (elas são usadas por padrão pelo Gradle).
A regra do Proguard foi alterada para -keep public class pl.droidsonroids.gif.GifIOException{<init>(int, java.lang.String);}
1.1.17 é a última versão com suporte para API nível 8 (Froyo). A partir de 1.2.0, o nível mínimo da API é 9 (Gingerbread).
O tratamento de vários casos extremos foi alterado:
GifDrawable#getNumberOfFrames()
agora retorna 0 quando GifDrawable
é reciclado
As informações incluídas no resultado de GifDrawable#toString()
quando GifDrawable
é reciclado agora contêm apenas zeros
É recomendado (mas não obrigatório) chamar LibraryLoader.initialize()
antes de usar GifDrawable
. Context
é necessário em alguns casos quando as bibliotecas nativas não podem ser extraídas normalmente. Consulte ReLinker para obter mais detalhes. Se LibraryLoader.initialize()
não foi chamado e o carregamento normal da biblioteca falhar, Context
será tentado para ser recuperado de forma alternativa, o que pode nem sempre funcionar.
O parâmetro int
loopNumber
foi adicionado a AnimationListener#onAnimationCompleted()
.
A configuração do Proguard agora vem com a biblioteca, você não precisa especificá-la.
O atributo XML src
em GifTextureView
foi renomeado para gifSource
para evitar possíveis conflitos com outras bibliotecas.
A configuração do Proguard mudou para:
-keep public class pl.droidsonroids.gif.GifIOException{<init>(int);} -keep class pl.droidsonroids.gif.GifInfoHandle{<init>(long,int,int,int);}
GifDrawable
agora usa android.graphics.Bitmap
como buffer de quadros. Tentar acessar pixels (incluindo desenho) de GifDrawable
reciclado causará IllegalStateException
como em Bitmap
.
O nível mínimo da API agora é 8 (Android 2.2).
A renderização é executada no thread de segundo plano, executando independentemente do thread principal, de modo que a animação seja executada mesmo que o drawable não seja desenhado. No entanto, a renderização não será executada se o drawable não estiver visível, consulte [#setVisible()](http://developer.android.com/reference/android/graphics/drawable/Drawable.html#setVisible(boolean, boolean)). Esse método pode ser usado para controlar a visibilidade do drawable nos casos em que ainda não é tratado pela estrutura Android.
Esta biblioteca usa código do GIFLib 5.1.3 e SKIA.
Fábrica de imagens
Plug-in NativeScript de Brad Martin disponível no NPM
Sketch Carregador de imagens poderoso e abrangente no Android, com suporte para GIF, zoom por gestos, exibição em bloco de imagens super grandes.
Quer incluir seu projeto aqui? Preencha um problema
Licença MIT
Consulte o arquivo LICENÇA.