在 Android 中显示 gif 的最佳实践
Best practice of showing gif in Android
我尝试加载 gif 列表并将它们显示在列表视图中。目前,我将每个 gif 显示到一个 webview 中,但它非常慢而且看起来很丑。我今天做了一些研究,但没有任何帮助。
你们有什么好的想法可以流畅地显示 gif 吗?顺便说一句,我从 url 链接获得了所有 gif。
我建议使用 Facebook 最近发布的开源库 fresco https://github.com/facebook/fresco. From my experience, it handles GIFs quite nicely by using some fancy caching methods outside of VM heap to avoid staggering effects of GC on bitmaps/images. User guide: http://frescolib.org/docs/getting-started.html#_
下面只是实现列表视图的基本适配器:
public class FrescoGifAdapter extends BaseAdapter {
ArrayList<String> urlList;
private static LayoutInflater inflater=null;
public FrescoGifAdapter(Activity activity, ArrayList<String> urlList) {
if(urlList==null) {
this.urlList = new ArrayList<>();
}
else {
this.urlList = urlList;
}
inflater = (LayoutInflater)activity.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return urlList.size();
}
public String getItem(int position) {
return urlList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if(convertView==null){
vi = inflater.inflate(R.layout.fresco_item, null);
//Load Uri with URL.
Uri uri = Uri.parse(getItem(position));
SimpleDraweeView draweeView = (SimpleDraweeView) vi.findViewById(R.id.my_image_view);
//Controller is required for controller the GIF animation, here I have just set it to autoplay as per the fresco guide.
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.build();
//Set the DraweeView controller, and you should be good to go.
draweeView.setController(controller);
}
return vi;
}
}
fresco_item.xml(您可以更改尺寸以适应,我只是默认为引导尺寸)。警告是缩放必须由 fresco 处理。事实上,他们建议不要设置任何自定义 ImageView 属性,因为它会破坏内容。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/ic_launcher"
/>
</LinearLayout>
然后在您的 onCreate 中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Required by Fresco to be initalized before setContentView.
Fresco.initialize(this);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.listview);
ArrayList<String> urlList = new ArrayList<>();
//Load neon cats
for(int i = 0; i < 10; i++) {
urlList.add("https://media3.giphy.com/media/JLQUx1mbgv2hO/200.gif");
}
lv.setAdapter(new FrescoGifAdapter(this, urlList));
}
webview 用于 gifimage 加载,没有任何库
我尝试加载 gif 列表并将它们显示在列表视图中。目前,我将每个 gif 显示到一个 webview 中,但它非常慢而且看起来很丑。我今天做了一些研究,但没有任何帮助。
你们有什么好的想法可以流畅地显示 gif 吗?顺便说一句,我从 url 链接获得了所有 gif。
我建议使用 Facebook 最近发布的开源库 fresco https://github.com/facebook/fresco. From my experience, it handles GIFs quite nicely by using some fancy caching methods outside of VM heap to avoid staggering effects of GC on bitmaps/images. User guide: http://frescolib.org/docs/getting-started.html#_
下面只是实现列表视图的基本适配器:
public class FrescoGifAdapter extends BaseAdapter {
ArrayList<String> urlList;
private static LayoutInflater inflater=null;
public FrescoGifAdapter(Activity activity, ArrayList<String> urlList) {
if(urlList==null) {
this.urlList = new ArrayList<>();
}
else {
this.urlList = urlList;
}
inflater = (LayoutInflater)activity.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return urlList.size();
}
public String getItem(int position) {
return urlList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if(convertView==null){
vi = inflater.inflate(R.layout.fresco_item, null);
//Load Uri with URL.
Uri uri = Uri.parse(getItem(position));
SimpleDraweeView draweeView = (SimpleDraweeView) vi.findViewById(R.id.my_image_view);
//Controller is required for controller the GIF animation, here I have just set it to autoplay as per the fresco guide.
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setAutoPlayAnimations(true)
.build();
//Set the DraweeView controller, and you should be good to go.
draweeView.setController(controller);
}
return vi;
}
}
fresco_item.xml(您可以更改尺寸以适应,我只是默认为引导尺寸)。警告是缩放必须由 fresco 处理。事实上,他们建议不要设置任何自定义 ImageView 属性,因为它会破坏内容。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="130dp"
android:layout_height="130dp"
fresco:placeholderImage="@drawable/ic_launcher"
/>
</LinearLayout>
然后在您的 onCreate 中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Required by Fresco to be initalized before setContentView.
Fresco.initialize(this);
setContentView(R.layout.activity_main);
ListView lv = (ListView) findViewById(R.id.listview);
ArrayList<String> urlList = new ArrayList<>();
//Load neon cats
for(int i = 0; i < 10; i++) {
urlList.add("https://media3.giphy.com/media/JLQUx1mbgv2hO/200.gif");
}
lv.setAdapter(new FrescoGifAdapter(this, urlList));
}
webview 用于 gifimage 加载,没有任何库