Android图片库与gif动画

时间:2015-02-25 02:37:58

标签: android image animation gallery

自从我使用Android应用程序以来已经很长时间了。我正在寻找所有yinz的观点和建议,他们比我更经常在android上开发。我正在尝试制作一个应用程序,允许用户使用下一个/上一个按钮浏览图像库。该画廊将存放在我的网络服务器上。我已经有办法向服务器发送当前图像的ID号以及它正在移动的方向(下一个/上一个)。这将返回当前ID和URL的一些json。我的问题是我应该使用什么样的查看器对象。我希望能够做到静止,动画gif / png并最终在网站上加载youtube vids或其他视频。我知道WebView可以在一定程度上完成所有工作。但如果我打算建立一个移动网站,我就会这样做。 Imageview不做动画。我从哪里开始整个事情?有人可以给我一些建议,或者指点一个教程或者某些东西来帮助我决定我可以从哪里开始。

提前致谢。

2 个答案:

答案 0 :(得分:0)

上周末我花了我的Android应用程序尝试动画GIF,让我告诉你:你可以让他们工作,但永远不会好。为许多OutOfMemory致命异常和可怕的滞后UI性能做好准备。我最终将WebM文件流式传输到VideoView中,这非常快速和高效。由于听起来您正在策划服务器上的某些图像集,我强烈建议您将所有动画GIF转换为WebM格式,并使用VideoView显示它们。

以下是我的一些代码,可以帮助您入门:

VideoView videoView = (VideoView) layout.findViewById(R.id.videoView);
videoView.setVideoPath(url);
videoView.start();
videoView.setOnPreparedListener(new OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.setLooping(true);
    }
});
// videoView.setMediaController(new MediaController(singleton));

使用没有MediaController的looper(如上所示)来模拟正常的GIF动画行为。或者,取消注释MediaController代码并摆脱looper以显示更像传统视频视图。

如果你必须绝对没有任何例外地使用实际的动画GIF,这里有一些很好的图书馆可以查看:

GifAnimationDrawable是Android的Movie类和AnimationDrawable的包装器。这是最容易实现和快速的,但是容易出错,因为GIF的每一帧都在动画时被加载到内存中。

android-gif-drawable可能是您能找到的最佳解决方案。它使用Native Development Kit与C模块一起编译,因此性能更好,但实现起来有点困难。

希望所有这些信息都有帮助,如果您有任何其他问题,请与我们联系!

答案 1 :(得分:0)

Integer[] imageIDs = {
        R.drawable.elphanto,
        R.drawable.large,
        R.drawable.night,
        R.drawable.anim_flag_iceland,
        R.drawable.galaxy

        };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallary_view);

    Gallery gallery = (Gallery) findViewById(R.id.gallery1);
    gallery.setAdapter(new ImageAdapter(this));
    gallery.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position,long id)
{

            if(position==3||position==4){
                GifImageView gifImageView =(GifImageView)findViewById(R.id.giv_demo);
                gifImageView.setVisibility(View.VISIBLE);
                ((ImageView) findViewById(R.id.image1)).setVisibility(View.GONE);
                try {
                    GifDrawable gifDrawable = new GifDrawable(getResources(), R.drawable.anim_flag_iceland);
                    gifImageView.setImageDrawable(gifDrawable);

                    Toast.makeText(getBaseContext(),"pic" + (position + 1) + " selected",
                            Toast.LENGTH_SHORT).show();
                    gifImageView.setImageResource(imageIDs[position]);

                } catch (NotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            else{
                ((GifImageView)findViewById(R.id.giv_demo)).setVisibility(View.GONE);
                ((ImageView) findViewById(R.id.image1)).setVisibility(View.VISIBLE);
                Toast.makeText(getBaseContext(),"pic" + (position + 1) + " selected",
                        Toast.LENGTH_SHORT).show();
                // display the images selected
                ImageView imageView = (ImageView) findViewById(R.id.image1);
                imageView.setImageResource(imageIDs[position]);
            }


    }
});
}


public class ImageAdapter extends BaseAdapter {
    private Context context;
    private int itemBackground;
    public ImageAdapter(Context c)
    {
        context = c;
        // sets a grey background; wraps around the images
        TypedArray a =obtainStyledAttributes(R.styleable.HelloGallery);
        itemBackground = a.getResourceId(R.styleable.HelloGallery_android_galleryItemBackground, 0);
        a.recycle();
    }
    // returns the number of images
    public int getCount() {
        return imageIDs.length;
    }
    // returns the ID of an item
    public Object getItem(int position) {
        return position;
    }
    // returns the ID of an item
    public long getItemId(int position) {
        return position;
    }                                                                                              
    // returns an ImageView view
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView = new ImageView(context);
        imageView.setImageResource(imageIDs[position]);
        imageView.setLayoutParams(new Gallery.LayoutParams(250, 250));
        imageView.setBackgroundResource(itemBackground);
        return imageView;
    }
}


@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

}