一、使用Glide庫
在安卓開發中,圖片加載是非常常見的需求,而使用Glide庫可以輕鬆地實現高品質、流暢的圖片加載,增強用戶體驗。
Glide庫支持本地圖片、網絡圖片、GIF圖片等多種圖片格式,同時還支持圖像縮放、動畫、轉換等高級功能。
需要注意的是,在使用Glide庫之前,需要先在build.gradle文件中添加Glide依賴:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
接下來在代碼中使用Glide加載圖片:
Glide.with(this)
.load("http://www.xxx.com/xxx.jpg")
.placeholder(R.drawable.placeholder) // 佔位圖
.error(R.drawable.error) // 錯誤圖
.into(imageView);
二、使用LruCache進行圖片緩存
為了優化圖片加載的性能,可以使用LruCache進行圖片緩存,減少網絡請求的次數。
LruCache是基於LRU(Least Recently Used)算法實現的一個緩存類,它可以按照緩存數據的使用頻率來移除最近最少使用的數據對象。
// 初始化緩存
private LruCache mMemoryCache;
private void initCache() {
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int cacheSize = maxMemory / 8; // 1/8作為緩存大小
mMemoryCache = new LruCache(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
// 存儲緩存
private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemoryCache(key) == null) {
mMemoryCache.put(key, bitmap);
}
}
// 讀取緩存
private Bitmap getBitmapFromMemoryCache(String key) {
return mMemoryCache.get(key);
}
使用緩存的方式:
Bitmap bitmap = getBitmapFromMemoryCache(url);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
Glide.with(MainActivity.this)
.load(url)
.placeholder(R.drawable.placeholder) // 佔位圖
.error(R.drawable.error) // 錯誤圖
.listener(new RequestListener() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
addBitmapToMemoryCache(url, bitmap); // 存儲到緩存
return false;
}
})
.into(imageView);
}
三、使用RecyclerView進行圖片列表展示
在實際開發中,經常需要實現圖片列表的展示,而使用RecyclerView可以高效地展示大量圖片,同時還可以實現下拉刷新、上拉加載等功能。
在RecyclerView中,可以使用GridLayoutManager來實現網格布局。
需要注意的是,在網格布局中,圖片的寬度應該按比例調整,以避免圖片變形。
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); // 網格布局,2列
recyclerView.setAdapter(new RecyclerView.Adapter() {
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
Glide.with(MainActivity.this)
.load(urls[position % urls.length])
.placeholder(R.drawable.placeholder) // 佔位圖
.error(R.drawable.error) // 錯誤圖
.into(holder.imageView);
}
@Override
public int getItemCount() {
return 50;
}
});
private static class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView imageView;
MyViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
ViewGroup.LayoutParams lp = imageView.getLayoutParams();
lp.width = getScreenWidth() / 2; // 調整寬度,保持比例
lp.height = lp.width * 9 / 16;
imageView.setLayoutParams(lp);
}
}
private static int getScreenWidth() {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Point point = new Point();
windowManager.getDefaultDisplay().getSize(point);
return point.x;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/192550.html