2015-05-23 4 views
1

У меня есть изображение gif (3 точки появляются и исчезают один за другим), которые я пытаюсь установить на моем заставке. Как это сделать, используя только анимацию загрузки в xml? Ниже приведен код моего заставки.Отображение GIF-изображения

public class MainActivity extends Activity { 

    private static String TAG = MainActivity.class.getName(); 
    private static long SLEEP_TIME = 5; // Sleep for some time 

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

     setContentView(R.layout.activity_main); 

     // Start timer and launch main activity 
     IntentLauncher launcher = new IntentLauncher(); 
     launcher.start(); 



    } 

    private class IntentLauncher extends Thread { 

     @Override 
     /** 
     * Sleep for some time and than start new activity. 
     */ 
     public void run() { 
      try { 
       // Sleeping 
       Thread.sleep(SLEEP_TIME*1000); 
      } catch (Exception e) { 
       Log.e(TAG, e.getMessage()); 
      } 

      // Start main activity 
      Intent intent = new Intent(MainActivity.this, Option.class); 
      MainActivity.this.startActivity(intent); 
      MainActivity.this.finish(); 
     } 
    } 

} 
+1

Человек, это не веб-страница - ваш gif будет выглядеть уродливым на разных экранах. Вы должны сделать это с помощью родной анимации, и еще более легко. – Divers

ответ

0

Android изначально не поддерживает гифы таким образом. Чтобы играть в gif, вы можете загрузить его в WebView или использовать класс Movie.

Есть полезный скрипт Ruby (оригинал gist here), который преобразует gif в файл animation-list xml.

#!/usr/bin/ruby 
require 'fileutils' 
require 'RMagick' 
require 'slop' 
require 'builder' 

opts = Slop.new do 
    banner "gif2animdraw [options]\n" 
    on :i, :input=, 'path to animated GIF (or directory of GIFs)', :required => true 
    on :o, :outdir=, 'path to root output directory', :required => true 
    on :d, :density=, 'density name to use for frames', :required=>true 
    on :oneshot, 'if set, animation does not repeat', :required => false, :default=>false 
    help 
end 

begin 
    opts.parse 
rescue 
    puts opts.help 
    exit -1 
end 

if !['ldpi', 'mdpi', 'tvdpi', 'hdpi', 'xhdpi', 'xxhdpi', 'xxxhdpi'].include?(opts[:d]) 
    puts "Invalid density #{opts[:d]}" 
    exit -1 
end 

glob=File.directory?(opts[:i]) ? File.join(opts[:i], '*.gif') : opts[:i] 

Dir[glob].each do |gif| 
    input=Magick::ImageList.new(gif).coalesce 
    output=File.join(opts[:o], 'drawable') 
    output_density=File.join(opts[:o], 'drawable-'+opts[:d]) 
    basename=File.basename(gif, '.gif').downcase.gsub(/\W/,'_') 

    FileUtils.mkdir_p output 
    FileUtils.mkdir_p output_density 

    Dir.glob(File.join(output_density, basename+'*.png')).each {|f| File.delete(f) } 

    input.write File.join(output_density, basename+'_%d.png') 

    builder = Builder::XmlMarkup.new(:indent=>2) 

    builder.tag!('animation-list', 
       'xmlns:android'=>'http://schemas.android.com/apk/res/android', 
       'android:oneshot'=>opts[:oneshot]) do 
    i=0 
    input.each do |frame| 
     builder.item('android:drawable'=>"@drawable/#{basename}_#{i}", 
        'android:duration'=>frame.delay*1000/input.ticks_per_second) 
     i+=1 
    end 
    end 

    open(File.join(output, basename+'.xml'), 'w') do |f| 
    f.puts builder.target! 
    end 
end 
+0

Все это кажется костылем для меня – Divers

+0

Да. Я не предлагаю, чтобы кто-нибудь когда-либо использовал gifs над родными анимациями, но это решения, которые я нашел. – Andrew

0

Я думаю, что использование GIF - довольно тяжелое решение вашей проблемы. Вы думали об использовании библиотеки, такой как WaitingDots.

Для достижения того же результата автор использует пользовательский текст и текст. Это решение предоставит вам необходимое пространство для настройки анимации.

Смежные вопросы