一個簡單的可控的頭像列表疊加控件

一個簡單的可控的頭像列表疊加控件

  • 需求:評論/點贊頭像橫向排列芽淡,第N個疊加在第N+1個上面,并且N小于一個固定的數
  • 分析:1豆赏、假設N=4挣菲;頭像列表最多顯示4個,不足4個掷邦,有幾個顯示幾個白胀;2、頭像第N個疊加在第N+1個上面抚岗,無法使用margin負數實現(疊加順序不對)

效果圖

SDAvatarLayout.png

控件實現代碼

幾個要點:控件可以橫向滑動或杠,繼承HorizontalScrollView;創(chuàng)建RelativeLayout存放頭像集合宣蔚;

public class SDAvatarListLayout extends HorizontalScrollView {
    private Context context;
    /**
     * 存放創(chuàng)建的最大的ImageView集合
     */
    private List<SDCircleImageView> imageViewList;
    /**
     * 默認圖片大小
     */
    private int imageSize = Math.round(SDTransitionUtil.dp2px(50));
    /**
     * 默認圖片數量
     */
    private int imageMaxCount = 6;
    /**
     * 默認圖片偏移百分比 0~1
     */
    private float imageOffset = 0.3f;

    public SDAvatarListLayout(Context context) {
        this(context, null);
    }

    public SDAvatarListLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SDAvatarListLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        TypedArray ta = getResources().obtainAttributes(attrs, R.styleable.SDAvatarListLayout);
        imageMaxCount = ta.getInt(R.styleable.SDAvatarListLayout_image_max_count, imageMaxCount);
        imageSize = (int) ta.getDimension(R.styleable.SDAvatarListLayout_image_size, imageSize);
        imageOffset = ta.getFloat(R.styleable.SDAvatarListLayout_image_offset, imageOffset);
        imageOffset = imageOffset > 1 ? 1 : imageOffset;
        init();
        ta.recycle();
    }

    private void init() {
        setHorizontalScrollBarEnabled(false);
        RelativeLayout relativeLayout = new RelativeLayout(context);
        int offset = imageSize - (int) (imageSize * imageOffset);
        imageViewList = new ArrayList<>(imageMaxCount);
        for (int i = 0; i < imageMaxCount; i++) {
            SDCircleImageView imageView = new SDCircleImageView(context);
            imageView.setId(imageView.hashCode() + i);
            imageView.setBorderColor(Color.WHITE);
            imageView.setBorderWidth(Math.round(SDTransitionUtil.dp2px(1)));
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(imageSize, imageSize);
            params.addRule(ALIGN_PARENT_LEFT);
            params.setMargins((imageMaxCount - i - 1) * offset, 0, 0, 0);
            relativeLayout.addView(imageView, params);
            imageViewList.add(imageView);
        }
        relativeLayout.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        this.addView(relativeLayout);
    }

    public void setAvatarListListener(ShowAvatarListener listener) {
        hideAllImageView();
        listener.showImageView(imageViewList);
    }


    public void setAvatarListListener(List<Integer> drawableList) {
        if (drawableList == null) {
            return;
        }
        hideAllImageView();
        int i = imageMaxCount - 1;
        for (int url : drawableList) {
            imageViewList.get(i).setImageResource(url);
            imageViewList.get(i).setVisibility(VISIBLE);
            if (i == 0) {
                break;
            }
            --i;
        }
    }

    private void hideAllImageView() {
        for (SDCircleImageView head : imageViewList) {
            head.setVisibility(View.GONE);
        }
    }

    public interface ShowAvatarListener {
        void showImageView(List<SDCircleImageView> imageViewList);
    }
}

自定義屬性

 <declare-styleable name="SDAvatarListLayout">
        <!--創(chuàng)建的最大ImageView數量-->
        <attr name="image_max_count" format="integer" />
        <!--創(chuàng)建的ImageView的大小-->
        <attr name="image_size" format="dimension" />
        <!--要疊加的ImageView偏移量-->
        <attr name="image_offset" format="float" />
    </declare-styleable>

使用

 final List<Integer> imageDatas = new ArrayList<>();
        imageDatas.add(R.drawable.ic_launcher_background);
        imageDatas.add(R.drawable.meinv);
        imageDatas.add(R.drawable.meinv);
        imageDatas.add(R.drawable.meinv);
        //加載本地資源
        avatarLayout1.setAvatarListListener(imageDatas);
        //順序加載圖片使用任意框架加載
        avatarLayout2.setAvatarListListener(new SDAvatarListLayout.ShowAvatarListener() {
            @Override
            public void showImageView(List<SDCircleImageView> imageViewList) {
                //創(chuàng)建的ImageView的數量
                int imageSize = imageViewList.size();
                //實際需要顯示的圖片的數量
                int realDataSize = imageDatas.size();
                int mul = imageSize - realDataSize;
                for (int i = 0; i < imageSize; i++) {
                    if (i >= mul) {//6
                        //可以替換為網絡圖片處理
                        imageViewList.get(i).setImageResource(imageDatas.get(realDataSize - (i - mul) - 1));
                        imageViewList.get(i).setVisibility(View.VISIBLE);
                    } else {
                        imageViewList.get(i).setVisibility(View.GONE);
                    }
                }
            }
        });
        //逆序加載圖片使用任意框架加載
        avatarLayout3.setAvatarListListener(new SDAvatarListLayout.ShowAvatarListener() {
            @Override
            public void showImageView(List<SDCircleImageView> imageViewList) {
                //創(chuàng)建的ImageView的數量
                int imageSize = imageViewList.size();
                //實際需要顯示的圖片的數量
                int realDataSize = imageDatas.size();
                int mul = imageSize - realDataSize;
                for (int i = 0; i < imageSize; i++) {
                    if (i >= mul) {//6
                        //可以替換為網絡圖片處理
                        imageViewList.get(i).setImageResource(imageDatas.get(i - mul));
                        imageViewList.get(i).setVisibility(View.VISIBLE);
                    } else {
                        imageViewList.get(i).setVisibility(View.GONE);
                    }
                }
            }
        });

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末向抢,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子胚委,更是在濱河造成了極大的恐慌挟鸠,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亩冬,死亡現場離奇詭異艘希,居然都是意外死亡,警方通過查閱死者的電腦和手機鉴未,發(fā)現死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門枢冤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铜秆,你說我怎么就攤上這事淹真。” “怎么了连茧?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵核蘸,是天一觀的道長。 經常有香客問我啸驯,道長客扎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任罚斗,我火速辦了婚禮徙鱼,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己袱吆,他們只是感情好厌衙,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绞绒,像睡著了一般婶希。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓬衡,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天喻杈,我揣著相機與錄音,去河邊找鬼狰晚。 笑死筒饰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的壁晒。 我是一名探鬼主播龄砰,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼讨衣!你這毒婦竟也來了换棚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤反镇,失蹤者是張志新(化名)和其女友劉穎固蚤,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體歹茶,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夕玩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了惊豺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燎孟。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尸昧,靈堂內的尸體忽然破棺而出揩页,到底是詐尸還是另有隱情,我是刑警寧澤烹俗,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布爆侣,位于F島的核電站,受9級特大地震影響幢妄,放射性物質發(fā)生泄漏兔仰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一蕉鸳、第九天 我趴在偏房一處隱蔽的房頂上張望乎赴。 院中可真熱鬧,春花似錦、人聲如沸榕吼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽友题。三九已至,卻和暖如春戴质,著一層夾襖步出監(jiān)牢的瞬間度宦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工告匠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戈抄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓后专,卻偏偏與公主長得像划鸽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戚哎,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評論 25 707
  • ¥開啟¥ 【iAPP實現進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程裸诽,因...
    小菜c閱讀 6,365評論 0 17
  • 1. “我剛才夢見吃攤雞蛋了丈冬,正要吃就醒了!”公司同事中午睡了一覺甘畅,很快又到了下午該上班的點埂蕊,她問老板娘出去了吧,...
    溪水音閱讀 251評論 2 10
  • 謝謝季老師早上送給我的四個字:勿忘初心疏唾! 勿忘初心蓄氧,方得始終!所以該告別社交圈槐脏,重新上路喉童,向遠方開拔!
    入夏孤桐閱讀 220評論 3 0
  • 我可能有病顿天,得了想你的病泄朴, 其實,我們不熟露氮,你只是禮貌性的問候祖灰,禮貌性的和我交往,單純的朋友而已畔规。然而局扶,我卻并非如...
    西西里島的流浪船閱讀 547評論 0 0