Picasso là thư viện tải ảnh kinh điển của Square Inc., nổi tiếng với API cực kỳ đơn giản: "Picasso.with(context).load(url).into(imageView)". Dù Glide phổ biến hơn hiện nay, Picasso vẫn được dùng nhiều do nhẹ và dễ dùng.
Tích hợp Picasso
Bước 1: Thêm dependency vào build.gradle (Module: app)
dependencies {
// Phiên bản mới nhất (kiểm tra Maven Central)
implementation 'com.squareup.picasso:picasso:2.8'
// Lưu ý: Group ID cũ 'com.squareup.picasso3' đã deprecated
}
Bước 2: Layout activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="300dp"
android:layout_height="300dp"
android:scaleType="centerCrop"
android:contentDescription="Ảnh từ Picasso"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Bước 3: MainActivity.java - Sử dụng Picasso
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.imageView);
Picasso.get() // Context tự động từ Application (Picasso 2.71828+)
.load("https://www.tutorialspoint.com/images/tp-logo-diamond.png")
.placeholder(R.mipmap.ic_launcher) // Ảnh placeholder
.error(R.drawable.ic_error) // Ảnh khi lỗi
.resize(400, 400) // Resize chính xác
.centerCrop() // Crop giữa
.rotate(0) // Xoay (độ)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
Toast.makeText(MainActivity.this, "Tải ảnh thành công", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Exception e) {
Toast.makeText(MainActivity.this, "Lỗi tải ảnh: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
Các phương thức phổ biến của Picasso
| Phương thức | Mô tả |
|---|---|
| with(Context) / get() | Lấy instance Picasso (get() từ 2.71828+) |
| load(String/Uri/File/Resource) | Nguồn ảnh: URL, file, drawable resource |
| placeholder(Drawable/ResId) | Ảnh hiển thị khi đang tải |
| error(Drawable/ResId) | Ảnh hiển thị khi tải thất bại |
| resize(w, h) | Resize chính xác (có thể làm méo ảnh) |
| centerCrop() | Crop giữa, giữ tỷ lệ, lấp đầy ImageView |
| centerInside() | Fit toàn bộ ảnh vào ImageView, giữ tỷ lệ |
| fit() | Tự động đo ImageView và resize phù hợp |
| rotate(degrees) | Xoay ảnh |
| transform(Transformation) | Áp dụng transformation tùy chỉnh |
| into(ImageView) | Load vào ImageView |
| into(ImageView, Callback) | Load với callback thành công/thất bại |
| fetch() | Chỉ preload vào cache, không hiển thị |
Transformation tùy chỉnh (Circle, Rounded)
// Bo tròn hoàn toàn
public class CircleTransform implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
Bitmap result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawCircle(size/2f, size/2f, size/2f, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(squared, 0, 0, paint);
if (squared != source) squared.recycle();
return result;
}
@Override public String key() { return "circle"; }
}
// Sử dụng
Picasso.get().load(url).transform(new CircleTransform()).into(imageView);
So sánh Picasso vs Glide
- Picasso: API đơn giản hơn, nhẹ hơn, phù hợp app đơn giản, ít transformation
- Glide: Hiệu suất tốt hơn cho list/grid, hỗ trợ GIF/WebP/video thumbnail, lifecycle awareness tốt hơn, transformation phong phú hơn
Chạy ứng dụng
Cần quyền INTERNET trong Manifest. Build và chạy → ImageView hiển thị ảnh từ URL với placeholder, resize, centerCrop. Toast báo thành công/lỗi.
Lưu ý
- Picasso 2.71828+ dùng
Picasso.get()thay vìPicasso.with(context) - Không tự động cancel request khi view recycled (cần dùng Tag hoặc manual cancel)
- Hỗ trợ OkHttp3 downloader tự động nếu có trong classpath
- Để dùng trong RecyclerView:
Picasso.get().load(url).into(holder.imageView)- Picasso tự handle recycle