零、前言:

个人感觉Picasso还是非常好用的,它是图片加载的类库

1.依赖
implementation 'com.squareup.picasso:picasso:2.71828'
2.如果是请求网络图片:记得权限
 <uses-permission android:name="android.permission.INTERNET"/>
3.如果是SD卡图片:记得权限、及运行时处理
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

一、简单使用:

9414344-19c7f88694d355e5.png
加载图片.png
1.加载网络图片资源:http://www.toly1994.com:8080/imgs/HXqqASHJETSlvpnc.jpg
Picasso.get()
        .load("http://www.toly1994.com:8080/imgs/HXqqASHJETSlvpnc.jpg")
        .into(mIdIdImg);

这里顺便说一句:Picasso网络加载默认是缓存到本地的:在data/data/本包/cache下

9414344-1a6c06a48724d054.png
图片缓存.png
2.左上角指示器:

怎么知道图片从哪加载的呢?

 Picasso.get().setIndicatorsEnabled(true);

图片的左上角三角形颜色:
蓝色,磁盘加载---红色,网络加载---绿色,内存加载
在加载这张图片,可见是使用缓存加载的,也就是磁盘。
如果把缓存文件删掉,就是红色。别关闭在点一下加载就是绿色,也就是缓存
Picasso默认实现三级缓存,真的很棒的感觉。

9414344-a64ec0133dec11d4.png
加载图片2.png

3.加载res图片资源:

这个应该很熟了:

Picasso.get().setIndicatorsEnabled(true);
Picasso.get()
        .load(R.mipmap.wql)//资源文件
        .into(mIdIdImg);
4.加载assets图片资源
Picasso.get().setIndicatorsEnabled(true);
Picasso.get()
        .load("file:///android_asset/wql.jpg")//assets
        .into(mIdIdImg);
5.加载文件图片
Picasso.get().setIndicatorsEnabled(true);
Picasso.get()
        .load(new File("/data/data/com.toly1994.picassotest/cache/picasso-cache/8da4f93c94072639f4e0ea4a8b6c2df1.1"))//文件
        .into(mIdIdImg);

二、Picasso图片处理

1.重置大小:resize(W, H)

默认单位是px

Picasso.get().setIndicatorsEnabled(true);
Picasso.get()
        .load(R.mipmap.wql)//资源文件
        .resize(200,150)
        .into(mIdIdImg);
9414344-8ed8440345a96295.png
加载图片3.png
2.自定义裁切:

原型剪裁没有什么难度:搞个星星剪裁吧:更多形状,可见我的LogicCanvas库简单使用:

9414344-0d4a7265f341d955.png
剪裁图片.png
设置剪裁:
Picasso.get().setIndicatorsEnabled(true);
Picasso.get()
        .load(R.mipmap.wql)//资源文件
        .transform(new StarTransformation(8,500,300))
        .into(mIdIdImg);
裁剪类:StarTransformation
/**
 * 作者:张风捷特烈<br/>
 * 时间:2018/8/30 0030:21:44<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:星星裁剪类
 */
public class StarTransformation implements Transformation {
    private static final int STROKE_WIDTH = 6;

    private int num;
    private float R;
    private float r;

    public StarTransformation(int num, float R, float r) {
        this.num = num;
        this.R = R;
        this.r = r;
    }


    @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 squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
        if (squaredBitmap != source) {
            source.recycle();
        }
        Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
        Canvas canvas = new Canvas(bitmap);
        Paint avatarPaint = new Paint();
        BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
        avatarPaint.setShader(shader);
        Paint outlinePaint = new Paint();
        outlinePaint.setColor(Color.WHITE);
        outlinePaint.setStyle(Paint.Style.STROKE);
        outlinePaint.setStrokeWidth(STROKE_WIDTH);
        outlinePaint.setAntiAlias(true);
//        float r = size / 2f;
//        canvas.drawCircle(r, r, r, avatarPaint);

        canvas.drawPath(nStarPath(num,R,r), avatarPaint);
        canvas.drawPath(nStarPath(num,R,r), outlinePaint);

        squaredBitmap.recycle();
        return bitmap;
    }


    private Path nStarPath(int num,float R,float r) {
        Path path = new Path();

        float perDeg = 360 / num;
        float degA = perDeg / 2 / 2;
        float degB = 360 / (num - 1) / 2 - degA / 2 + degA;

        path.moveTo((float) (Math.cos((degA + perDeg * 0) / 180 * Math.PI) * R + R * Math.cos(degA / 180 * Math.PI)),
                (float) (-Math.sin((degA + perDeg * 0) / 180 * Math.PI) * R + R));

        for (int i = 0; i < num; i++) {

            path.lineTo((float) (Math.cos((degA + perDeg * i) / 180 * Math.PI) * R + R * Math.cos(degA / 180 * Math.PI)),
                    (float) (-Math.sin((degA + perDeg * i) / 180 * Math.PI) * R + R));
            path.lineTo((float) (Math.cos((degB + perDeg * i) / 180 * Math.PI) * r + R * Math.cos(degA / 180 * Math.PI)),
                    (float) (-Math.sin((degB + perDeg * i) / 180 * Math.PI) * r + R));
        }
        path.close();
        return path;
    }

    @Override
    public String key() {
        return "circleTransformation()";
    }
}
3.其他配置:
.memoryPolicy(MemoryPolicy.NO_CACHE)//本地文件不缓存
.networkPolicy(NetworkPolicy.NO_CACHE)//读取网络文件不缓存
.placeholder(R.drawable.ic_launcher_background)//图片显示之前的占位图片
.error(R.mipmap.ic_launcher)//错误图片
.noFade()//不淡入淡出, 直接显示

后记、

1.声明:

[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力

2.连接传送门:

更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

3.联系我

QQ:1981462002
邮箱:1981462002@qq.com

微信:zdl1994328

4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
9414344-c474349cd3bd4b82.jpg
公众号.jpg
posted on 2018-09-10 16:17  张风捷特烈  阅读(234)  评论(0编辑  收藏  举报