六邊形RecyclerView

吐槽

來個效果圖吧先~


這里寫圖片描述

哎╮(╯▽╰)╭本月的開發(fā)項目終于在月底的時候拿到了接口,所以趕緊用迅雷掩耳不及盜鈴之響叮當之勢擼完了那個從Eclipse中導入的古董級項目.今天早上看到了個效果,感覺還挺有意思的,照著擼了一下,記錄總結(jié)一下實現(xiàn)過程吧

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

簡介

其實也沒啥,這個動畫效果是RecyclerView 自帶的,之前一直用notifyDateSetChange(),一直沒有發(fā)現(xiàn),其實recyclerview很好心的自帶了插入動畫,調(diào)用notifyItemInserted()插入即可
自己寫的也就兩個部分,第一自定義Drawable ,類似自定義view吧,將圖片化成六邊形.第二,通過自定義LayoutManager實現(xiàn)按照六邊形位置擺放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;
        //數(shù)學計算 每一層的最后一個都為  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)));
        }
        
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市令杈,隨后出現(xiàn)的幾起案子匀哄,更是在濱河造成了極大的恐慌搏予,老刑警劉巖泌射,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兢榨,死亡現(xiàn)場離奇詭異拯啦,居然都是意外死亡账阻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來染突,“玉大人匪傍,你說我怎么就攤上這事【跬矗” “怎么了役衡?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長薪棒。 經(jīng)常有香客問我手蝎,道長,這世上最難降的妖魔是什么俐芯? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任棵介,我火速辦了婚禮,結(jié)果婚禮上吧史,老公的妹妹穿的比我還像新娘邮辽。我一直安慰自己,他們只是感情好贸营,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布吨述。 她就那樣靜靜地躺著,像睡著了一般钞脂。 火紅的嫁衣襯著肌膚如雪揣云。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天冰啃,我揣著相機與錄音邓夕,去河邊找鬼。 笑死阎毅,一個胖子當著我的面吹牛焚刚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扇调,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼矿咕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肃拜?” 一聲冷哼從身側(cè)響起痴腌,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雌团,失蹤者是張志新(化名)和其女友劉穎燃领,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锦援,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡猛蔽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曼库。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡区岗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毁枯,到底是詐尸還是另有隱情慈缔,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布种玛,位于F島的核電站藐鹤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赂韵。R本人自食惡果不足惜娱节,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祭示。 院中可真熱鬧肄满,春花似錦、人聲如沸质涛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇陆。三九已至轧抗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瞬测,已是汗流浹背横媚。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留月趟,地道東北人灯蝴。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像孝宗,于是被迫代替她去往敵國和親穷躁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評論 25 707
  • 別里科夫的意義 如果別里科夫的意義只是讓我們知道他是一個保守腐朽的衛(wèi)道士又是一個舊制度的犧牲品的可恨又可悲的形象的...
    黃實媽媽閱讀 1,326評論 0 5
  • 這段日子以來因妇,心里頗不寧靜问潭。 是倍感無聊,亦或是思緒紛飛婚被,讓我深感力不從心狡忙,甚是有氣無力≈沸荆總在尋思著:是不是該找一...
    傾我一生獨癡閱讀 180評論 2 0
  • 哈哈禀挫,一看題目,就很旖旎對不對拓颓,別想太多哦语婴,今天推介的書目,可是三觀很正噠驶睦! Deng deng deng den...
    可樂寶寶閱讀 758評論 0 1
  • 有物混成腻格,先天地生。 道生一啥繁,一生二菜职,二生三,三生萬物旗闽,可以為天下母酬核。 天下萬物生于有,有生于無适室。 在那不知道年月...
    皇甫江南閱讀 1,125評論 2 3