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