Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Thêm thư viện Picasso vào Android Studio

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ứcMô 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