目的
首先是,有时候我们看见别人的一个ImageView控件里面显示多个图片。
那么,这个是如何实现的呢?
这个就是我们的目的。
如下图:
思考
如果是你,你会如何去实现呢?
那么思考……数据源是什么?
数据源是要显示的多个图片……
重新写一个Imageview布局?
然后在 Imageview里面实现逻辑?
效果图:
一开始我的思路是使用drawable 或者 R.drawable 资源,然后拼接图片
后来,我的实现是利用canvas去画图……把多个bitmap拼接起来
首先create 一个bitmap作为画布使用
Canvas canvas = new Canvas(bitmap)
在这个时候,bitmap需要先定义好bitmap 的宽度和长度哦~~
最后使用
canvas.drawBitmap(Bitmap bitmap1, Rect src, Rect dst, Paint paint)
就可以把bitmap1画进新的bitmap中
重点来了
Rect src 这个是原来图片的取值范围
Rect dst 这个是bitmap1 在新画图中的位置
那么代码来了……
下面的代码中处理的是1个~3个的bitmap 当然,没有的话会直接报错哦。
public class DrawPicture{
private Bitmap bitmap1;
private Bitmap bitmap2;
private Bitmap bitmap3;
private int number;
/**
* 类似微信朋友圈显示图片
* 一个imageview 显示多个图片
* 参数 bitmap>=1
* 本质上是返回bitmap 把多个bitmap重新画成一个bitmap
* @param bitmaps
*/
public DrawPicture(Bitmap...bitmaps){
number = bitmaps.length;
if (number==1){
bitmap1 = bitmaps[0];
}else if (number==2){
bitmap1 = bitmaps[0];
bitmap2 = bitmaps[1];
}else if (number>=3){
bitmap1 = bitmaps[0];
bitmap2 = bitmaps[1];
bitmap3 = bitmaps[2];
}else {
throw new IllegalArgumentException("没有初始化bitmap");
}
}
public Bitmap getBitmap(){
if (number==1){
return bitmap1;
}else if (number==2){
Bitmap bitmap = Bitmap.createBitmap(bitmap1.getWidth(),bitmap1.getHeight(),bitmap1.getConfig());
Canvas canvas = new Canvas(bitmap);
Rect rect = new Rect(bitmap1.getWidth()/2-bitmap1.getWidth()/4,0,bitmap1.getWidth()/2+bitmap1.getWidth()/4,bitmap1.getHeight());
Rect rect1 = new Rect(0,0,bitmap.getWidth()/2-2,bitmap.getHeight());
canvas.drawBitmap(bitmap1,rect,rect1,null);
Rect rect2 = new Rect(bitmap2.getWidth()/2-bitmap2.getWidth()/4,0,bitmap2.getWidth()/2+bitmap2.getWidth()/4,bitmap2.getHeight());
Rect rect3 = new Rect(bitmap.getWidth()/2+2,0,bitmap.getWidth(),bitmap.getHeight());
canvas.drawBitmap(bitmap2,rect2,rect3,null);
return bitmap;
}else if (number>=3){
Bitmap bitmap = Bitmap.createBitmap(bitmap1.getWidth(),bitmap1.getHeight(),bitmap1.getConfig());
Canvas canvas = new Canvas(bitmap);
Rect rect = new Rect(subaverage(bitmap1.getWidth()),0,addaverage(bitmap1.getWidth()),bitmap1.getHeight());
Rect rect1 = new Rect(0,0,bitmap.getWidth()/2-2,bitmap.getHeight());
canvas.drawBitmap(bitmap1,rect,rect1,null);
Rect rect2 = new Rect(subaverage(bitmap2.getWidth()),subaverage(bitmap2.getHeight()),addaverage(bitmap2.getWidth()),addaverage(bitmap2.getHeight()));
Rect rect3 = new Rect(bitmap.getWidth()/2+2,0,bitmap.getWidth(),bitmap.getHeight()/2-2);
canvas.drawBitmap(bitmap2,rect2,rect3,null);
Rect rect4 = new Rect(subaverage(bitmap3.getWidth()),subaverage(bitmap3.getHeight()),addaverage(bitmap3.getWidth()),addaverage(bitmap3.getHeight()));
Rect rect5 = new Rect(bitmap.getWidth()/2+2,bitmap.getHeight()/2+2,bitmap.getWidth(),bitmap.getHeight());
canvas.drawBitmap(bitmap3,rect4,rect5,null);
return bitmap;
}
return null;
}
private int addaverage(int number) {
return number/2+number/4;
}
private int subaverage(int number) {
return number/2-number/4;
}
}
####使用方法:
ImageView imageView = findViewById(R.id.imageView)
imageView.setImageBitmap(new DrawPicture(bitmap1,bitmap2,bitmap3));
小结
从层面上而言,是几个bitmap合并成一个bitmap。从实际开发上,或许可以这样加载本地图片。但从网络上加载就比较麻烦,因为没有写好的缓存机制,例如内存缓存,硬盘缓存。
从技术层面上,就是就是讲解了canvas.drawBitmap 的使用。