六边形RecyclerView

吐槽

来个效果图吧先~


这里写图片描述

哎╮(╯▽╰)╭本月的开发项目终于在月底的时候拿到了接口,所以赶紧用迅雷掩耳不及盗铃之响叮当之势撸完了那个从Eclipse中导入的古董级项目.今天早上看到了个效果,感觉还挺有意思的,照着撸了一下,记录总结一下实现过程吧

Github地址 https://github.com/fushuangdage/CustomView

简介

其实也没啥,这个动画效果是RecyclerView 自带的,之前一直用notifyDateSetChange(),一直没有发现,其实recyclerview很好心的自带了插入动画,调用notifyItemInserted()插入即可
自己写的也就两个部分,第一自定义Drawable ,类似自定义view吧,将图片化成六边形.第二,通过自定义LayoutManager实现按照六边形位置摆放1~7个子控件(原文是可以添加很多圈的,我就简单写写了)

public class HiveDrawable extends Drawable {

    private Bitmap mBitmap;
    private Paint paint;
    private Path path;
    private Rect rect;


    public HiveDrawable(Bitmap bitmap) {
        init();
        if (bitmap!=null){
            BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
            paint.setShader(shader);
        }
    }

    @Override
    public int getIntrinsicHeight() {
        if (mBitmap!=null){
            return mBitmap.getHeight();
        }else {

            return super.getIntrinsicHeight();
        }
    }

    @Override
    public int getIntrinsicWidth() {
        if (mBitmap!=null){
            return mBitmap.getWidth();
        }else {
            return super.getIntrinsicWidth();
        }
    }

    @Override
    public void setBounds(int left, int top, int right, int bottom) {
        super.setBounds(left, top, right, bottom);
        rect = new Rect();
        rect.set(left,top,right,bottom);
        int l = rect.width() / 2;  //考虑横向的情况
        int h = rect.height();
        double v = Math.sqrt(3) / 2;

        path.reset();
        path.moveTo(left,h/2);
        path.lineTo(left+l/2, (float) (h/2-v*l));
        path.lineTo(right-l/2, (float) (h/2-v*l));
        path.lineTo(right,h/2);
        path.lineTo(right-l/2, (float) (h/2+v*l));
        path.lineTo(left+l/2, (float) (h/2+v*l));
        path.moveTo(left,h/2);
        
        path.close();
    }

    private void init() {

        if (paint==null){
            paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStyle(Paint.Style.FILL);
            paint.setStrokeWidth(3f);
        }

        if (path==null){
            path = new Path();
        }

    }

    @Override
    public void draw(@NonNull Canvas canvas) {
        canvas.drawPath(path,paint);
    }

    @Override
    public void setAlpha(@IntRange(from = 0, to = 255) int alpha) {
            if (paint!=null){
                paint.setAlpha(alpha);
            }
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        if (paint!=null)
            paint.setColorFilter(colorFilter);
    }

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

自定义LayouManager

public class HiveLayoutManager extends RecyclerView.LayoutManager {

    private List<List<RectF>> positionList=new ArrayList();

    @Override
    public RecyclerView.LayoutParams generateDefaultLayoutParams() {
        return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }


    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {

        detachAndScrapAttachedViews(recycler);

//        removeAllViews();
        int childCount = state.getItemCount();

        View first = recycler.getViewForPosition(0);
        measureChildWithMargins(first,0,0);
        int left = (getWidth() - getDecoratedMeasuredWidth(first)) / 2;
        int right=(getWidth() + getDecoratedMeasuredWidth(first)) / 2;
        int top=(getHeight()-getDecoratedMeasuredHeight(first))/2;
        int bottom=(getHeight()+getDecoratedMeasuredHeight(first))/2;
        //数学计算 每一层的最后一个都为  n*n*3+3*n+1

        addView(first);

        layoutDecoratedWithMargins(first,left,top,right,bottom);

        int num=childCount>7?7:childCount;
        int cX = getWidth() / 2;
        int cY = getHeight() / 2;

        for (int i = 1; i <num; i++) {
            View view = recycler.getViewForPosition(i);
            addView(view);
            measureChildWithMargins(view,0,0);
            int height = getDecoratedMeasuredHeight(view);
            int width = getDecoratedMeasuredWidth(view);
            double cos = Math.cos(Math.PI /3* (i - 1));
            double sin = Math.sin(Math.PI /3 *(i - 1));
            double viewCY = getHeight()/2-height * cos;
            double viewCX = getWidth()/ 2 - height * sin;

            layoutDecoratedWithMargins(view, ((int) (viewCX - width / 2)), ((int) (viewCY - height / 2))
                    ,((int) (viewCX + width / 2)), ((int) (viewCY + height / 2)));
        }
        
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,421评论 25 707
  • 别里科夫的意义 如果别里科夫的意义只是让我们知道他是一个保守腐朽的卫道士又是一个旧制度的牺牲品的可恨又可悲的形象的...
    黄实妈妈阅读 1,300评论 0 5
  • 这段日子以来,心里颇不宁静。 是倍感无聊,亦或是思绪纷飞,让我深感力不从心,甚是有气无力。总在寻思着:是不是该找一...
    倾我一生独痴阅读 178评论 2 0
  • 哈哈,一看题目,就很旖旎对不对,别想太多哦,今天推介的书目,可是三观很正哒! Deng deng deng den...
    可乐宝宝阅读 735评论 0 1
  • 有物混成,先天地生。 道生一,一生二,二生三,三生万物,可以为天下母。 天下万物生于有,有生于无。 在那不知道年月...
    皇甫江南阅读 1,108评论 2 3