BadgeView實現原始碼分析

2021-07-16 06:58:38 字數 1914 閱讀 1624

badgeview實現:public class badgeview extends textview-->本質是textview   (badgetview:徽章,獎章)

使用 view target = findviewbyid(r.id.target_view);

badgeview badge = new badgeview(this, target);

badge.settext("1"); // textview自帶的方法

badge.show();

原始碼分析:

1.入口1 badgeview badge = new badgeview(this, target);

public badgeview(context context, view target)

public badgeview(context context, attributeset attrs, int defstyle, view target, int tabindex)

private void init(context context, view target, int tabindex)

/*實現核心:

找到目標控制項target,將該控制項從其父控制項中移除,並且新增乙個新控制項framelayout(這個控制項新增原來目標控制項和新增當前控制項badgeview)

*/layoutparams lp = target.getlayoutparams();

viewparent parent = target.getparent(); // 找到目標控制項的父控制項

framelayout container = new framelayout(context);

// todo verify that parent is indeed a viewgroup

viewgroup group = (viewgroup) parent;

int index = group.indexofchild(target);

group.removeview(target);

group.addview(container, index, lp);

container.addview(target);

this.setvisibility(view.gone); // 預設情況badgetview是不可見

container.addview(this);

group.invalidate(); // 重新整理顯示

}入口2:badge.show();

public void show()

private void show(boolean animate, animation anim)

this.setvisibility(view.visible); // 使badgetview可見,預設情況是不可見(構造的時候設定為gone)

isshown = true;

}總結:

1.bageview實現原理:把原本target去除掉,然後對target進行包裝成framelayout,並新增到target原本位置中

1.1 找到target的parent

1.2 獲取target在其parent中的位置,並把target從其對應的parent中移除掉

1.3 建立乙個framelayout把target和badgetview新增到framelayout

1.4 把framelayout新增到1.2步驟刪除掉target的位置上去(這樣原本target就好像沒被刪除一樣)

2.實現的思路2:

類似之前imageview的適配任何尺寸的寬高(谷歌應用市場),把要設定badgetview的target外巢狀乙個framelayout,然後通過

在framelayout中新增badgetview這個控制項,來實現類似功能

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...

ThreadLocal實現原理與原始碼分析

threadlocal底層實現內部類 threadlocalmap 一 threadlocal的set方法原始碼分析 1 public void set t value thread t thread.currentthread threadlocalmap map getmap t if map ...

AbstractListView原始碼分析3

normal list that does not indicate choices public static final int choice mode none 0 the list allows up to one choice public static final int choice ...