文档章节

我学安卓——自定义drawable

tnjin
 tnjin
发布于 2016/11/01 20:21
字数 447
阅读 54
收藏 1

最近在一个QQ群里,看到有人在做一个需求,要能实现头像的聚合拼接,我本来是想的生成一个bitmap,有人说起来要用drawable实现,其实算法是一样的,只是用法不一样而已,我就顺便学一下自定义drawable来做。

先看效果:

 

就是这样了,思路应该就是一个圆形的imageview,加载上对应的bitmap或者drawable即可。

drawable的代码如下:

public class SliceDrawable extends Drawable {

    private List<Bitmap> src ;
    private Paint paint;
    public SliceDrawable(List<Bitmap> srcs) {
        if (srcs == null || srcs.size() == 0){
            throw  new IllegalStateException("bitmaps cannot be null or empty");
        }
        src = srcs;
        paint = new Paint();
        paint.setAntiAlias(true);

    }

    @Override
    public void draw(Canvas canvas) {
        Bitmap bitmap = null;
        Rect rect = getBounds();
        switch (src.size()){
            case 1:
                bitmap = src.get(0);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),rect,paint);
                break;
            case 2:
                bitmap = src.get(0);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),rect,paint);
                bitmap = src.get(1);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRigtBitmapBound(),paint);
                break;
            case 3:
                bitmap = src.get(0);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),rect,paint);
                bitmap = src.get(1);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightTopBound(),paint);
                bitmap = src.get(2);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightBottomBound(),paint);
                break;
            case 4:
                bitmap = src.get(0);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getLeftTopBound(),paint);
                bitmap = src.get(1);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightTopBound(),paint);
                bitmap = src.get(2);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getRightBottomBound(),paint);
                bitmap = src.get(3);
                canvas.drawBitmap(bitmap,getBitmapBound(bitmap),getLeftBottomBound(),paint);
                break;
            default://多于4张,那么平分绘图区域?
                break;
        }
    }

    private Rect getBitmapBound(Bitmap bitmap){
        return  new Rect(0,0,bitmap.getWidth(),bitmap.getHeight());
    }

    private Rect getLeftTopBound(){
        Rect rect = getBounds();
        return new Rect(rect.left,rect.top,rect.centerX(),rect.centerY());
    }

    private Rect getRightTopBound(){
        Rect rect = getBounds();
        return new Rect(rect.centerX(),rect.top,rect.right,rect.centerY());
    }

    private Rect getRightBottomBound(){
        Rect rect = getBounds();
        return new Rect(rect.centerX(),rect.centerY(),rect.right,rect.bottom);
    }

    private Rect getLeftBottomBound(){
        Rect rect = getBounds();
        return new Rect(rect.left,rect.centerY(),rect.centerX(),rect.bottom);
    }


    private Rect getRigtBitmapBound(){
        Rect rect = getBounds();
        return new Rect(rect.centerX(),0,rect.right+rect.centerX(),rect.bottom);
    }
    @Override
    public void setAlpha(int alpha) {

    }

    @Override
    public void setColorFilter(ColorFilter colorFilter) {

    }

    @Override
    public int getOpacity() {
        return 0;
    }
}

因为要求就是最多四张图片显示,所以更多的就没有写,如此加载到圆形的Imageview中即可达到上图的效果。

 

© 著作权归作者所有

tnjin

tnjin

粉丝 27
博文 36
码字总数 28535
作品 0
海淀
Android工程师
私信 提问
加载中

评论(1)

tnjin
tnjin 博主
实际使用中发现,这种方式会较多的占用主线程,所以依然推荐异步生成Bitmap的方式,缓存下来,供以后调用
android 加载数据或提交数据时显示转圈的提示页面

android 加载数据或提交数据时显示转圈的提示页面 提前声明一下,本博客全是自己的理解,如果内容中有理解错误的地方,欢迎指正。另外,博客内容有参考其他博客,本博客只用来学习。 当我们进...

shzwork
10/15
10
0
Android的Drawable

导语 Drawable表示的是一种可以在Canvas上进行绘制的抽象概念,它的种类有很多,最常见的就是颜色和图片。优点:使用简单,比自定义View成本低很多,非图片类型的Drawable占用空间较小。本章...

一个有故事的程序员
2018/11/20
0
0
用activity实现半透明的、淡入的menu【原创】

用activity实现半透明的、淡入的menu—供初学者研究学习 虽然android带的menu已经很漂亮,但有的时候也需要我们去自定义menu。 开始的时候只是想在android上做一个半透明的menu,但是刚刚接触...

长平狐
2012/08/14
535
0
用activity实现半透明的、淡入的menu【原创】

用activity实现半透明的、淡入的menu—供初学者研究学习 虽然android带的menu已经很漂亮,但有的时候也需要我们去自定义menu。 开始的时候只是想在android上做一个半透明的menu,但是刚刚接触...

长平狐
2012/08/09
2.3K
0
可能不知道的bitmap/drawable的属性(bitmap android:gravity)

> android属性 android:gravity属性,layout_gravity属性; Bitmap,代表一个位图图像,Android支持三种格式的位图图像:.png (preferred),.jpg (acceptable), .gif (discouraged)。 > XML中......

desaco
01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
1分钟前
0
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
29分钟前
2
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
29分钟前
4
0
Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
35分钟前
17
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
53分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部