参考: https://www.geeksforgeeks.org/how-to-use-picasso-image-loader-library-in-android/
Picasso是开源的,也是Android中广泛使用的图像下载库之一。
它由Square创建和维护。它是Android强大的图像下载和缓存库之一。Picasso简化了从外部url加载图像并将其显示在应用程序上的过程。例如,从服务器下载映像是任何应用程序中最常见的任务之一。通过android网络API来实现这一点需要相当多的代码。通过使用Picasso,您可以通过几行代码实现这一点。
简单的说, 使用Piccaso 库,可以为ImageView 设置图片,并且图片是从网络下载下来的。
无需自己开启线程下载,只需提供网络图片的url
目录
1. app build.gradle 添加依赖
implementation ‘com.squareup.picasso:picasso:2.5.2’
然后同步gradle
2. AndroidManifest 添加网络权限声明
<users-permission android:name=”android.permission.INTERNET”/>
3. 布局文件中添加ImageView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
tools:context=".MainActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:padding="16dp" />
</RelativeLayout>
4. 调用Piccaso API 下载并设置图片
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
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.with(this)
.load("https://media.geeksforgeeks.org/wp-content/cdn-uploads/logo-new-2.svg")
.into(imageView);
}
}
5. 附加功能
5.1 调整图片大小(resize)
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
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.with(this)
.load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
.resize(300, 300)
.into(imageView);
}
}
5.2 占位图片(Placeholder )
即在表示已经调用Piccaso API 进行下载,但是还没有结果时显示的图片。
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
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.with(this)
.load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
.placeholder(R.mipmap.ic_launcher)
.into(imageView);
}
}
5.3 下载失败时的错误反馈
可以设定失败时显示的图片
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
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.with(this)
.load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo.png")
.error(R.drawable.error_gfg)
.into(imageView);
}
}
5.4 修剪(Cropping )
当你不确定下载图片的大小时,可以设置为中心裁剪
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
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.with(this)
.load("https://media.geeksforgeeks.org/wp-content/uploads/20210101144014/gfglogo-300x300.png") // Equivalent of what ends up in onBitmapLoaded
.placeholder(R.mipmap.ic_launcher)
.error(R.drawable.error_gfg)
.centerCrop()
.fit()
.into(imageView);
}
10. 问题汇总
10.1 网络问题导致没有下载
可能解决方法: 在AndroidManifest.xml 的application 标签中,添加
android:usesCleartextTraffic="true"