Android仿知乎图片墙

公司项目中有一个需求,需要在一个游戏列表顶部显示一个由此列表中游戏图标拼接而成的图片。


就是类似知乎的这种效果。



初步思路:1.获得图片地址并下载图片
                  2.根据下载的图片拼接一张大图片
                  3.图片旋转45度
开搞:
第一步:怎么下载图片:

这个比较简单,项目使用的是Sketch框架类似Fresco,大家可以根据自己的项目修改:
将下载完成的Drawable 保存到bitmapList中,当全部图片下载完成后,进行拼接。
bitmapList,显示区域的宽和高 作为参数传入makeWithDrawable ()。 

Sketch.with(context).load(urlList.get(i), new LoadListener() {
    @Override
    public void onStarted() {

    }
    @Override
    public void onCompleted(Drawable drawable, ImageFrom imageFrom, String mimeType) {
        bitmapList.add(drawable);
        compeletedNum++;
        if (compeletedNum == urlList.size()) {
            Bitmap finalBitmap = makeWithDrawableList(bitmapList, width, height);
            imageView.setImageBitmap(finalBitmap);
        }
    }

    @Override
    public void onFailed(FailCause failCause) {
    }

    @Override
    public void onCanceled(CancelCause cancelCause) {

    }
}).commit();


第二部,怎么拼成一张大图片?
首先需要创建一个bitmap出来 
Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);


高度和宽度怎么确定呢?
看效果图,整个大图片需要12张小图片拼接出来(4*3)。每张小图片的宽度大概是最终显示区域宽度的0.5倍,高度是0.6倍。所以大图片的宽度是小图片宽度的3倍,高度是小图片高度的四倍。
开始画吧。。。
从bitmapList数组中遍历去取drawable对象,这里为了减少内存开销只由前张图片进行拼接。
拿到drawable之后,开始从左到右,从上到下画图片,new 一个Canvas对象。
这里通过drawable.setBounds() 指定一个矩形区域,然后通过draw(Canvas)画的时候,就只在这个矩形区域内画图。
Canvas canvas = new Canvas(result);
for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 3; j++) {
        drawable = bitmapList.get((i * 3 + j) % bitmapList.size());
        drawable.setBounds(smallWidth * j, smallHeight * i, smallWidth * (j + 1), smallHeight * (i + 1));
        drawable.draw(canvas);
    }
}



现在大图片Bitmap上面已经绘制了12张小图片,还差最后一步旋转。

第三部:旋转怎么做?
这里有一个技巧就是旋转画布:就是说你把画布旋转45度,再去画,就相当去图片旋转了45度。 

Bitmap bmp = Bitmap.createBitmap(needWidth, needHeight, Bitmap.Config.RGB_565); 
Canvas canvas = new Canvas(bmp); 
canvas.rotate(45, needWidth, needHeight * 0.3f); 
Paint paint = new Paint(); 
canvas.drawBitmap(bitmap, 0, 0, paint); 

这样就完成了。最后加了一个内存缓存,用图片集的URL拼接了key。
防止频繁进入和退出时的内存消耗。



最终效果图: 


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值