日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android實(shí)現(xiàn)Z軸布局效果

瀏覽:29日期:2022-09-22 16:46:41

如果需要在布局中創(chuàng)造一個(gè)層疊的概念,那么使用Android系統(tǒng)中的ViewGroup是不夠的,但是可以通過改變ViewGroup的繪制順序?qū)崿F(xiàn)

Android實(shí)現(xiàn)Z軸布局效果

代碼下載

繼承自FrameLayout

FrameLayout已經(jīng)幫我們實(shí)現(xiàn)了子View的measure和layout過程,我們只需在它的基礎(chǔ)上改變繪制順序即可

自定義LayoutParams

layoutParams的作用是向父布局請(qǐng)求布局參數(shù)(MeasureSpec),這個(gè)參數(shù)會(huì)在View inflate時(shí)添加到布局中,我們?nèi)绻褂肔ayoutParams將會(huì)得到很大的方便

// 這里繼承FrameLayout的LayoutParams即可public static class LayoutParams extends FrameLayout.LayoutParams { public final static int DEFAULT_ZORDER = 1; public int zOrder; public LayoutParams(@NonNull Context c, @Nullable AttributeSet attrs) { super(c, attrs); TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ZOrderLayout); zOrder = a.getInt(R.styleable.ZOrderLayout_layout_zorder, DEFAULT_ZORDER); a.recycle(); }}

我們自定義個(gè)Attribute,那么就可以在XML中進(jìn)行使用了

<declare-styleable name='ZOrderLayout'> <attr name='layout_zorder' format='integer'/></declare-styleable>

這樣我們的View就可以這么使用

<!--layout_zorder 表示該View在第1層--><tianrui.viewgroup.MyTextView android:text='0' android:layout_width='50dp' android:layout_height='50dp' android:background='@android:color/holo_red_light' app:layout_zorder='1'/><!--layout_zorder=2 表示該View在第2層--><tianrui.viewgroup.MyTextView android:text='1' android:layout_width='50dp' android:layout_height='50dp' android:layout_marginLeft='20dp' android:background='@android:color/holo_blue_light' app:layout_zorder='2'/>

同時(shí)需要重寫ViewGroup的generateLayoutParams(),讓它生成我們的LayoutParams

初始化繪制順序

在所有的子View加載完成后初始化需要繪制的順序(根據(jù)我們的ZorderLayoutParams)

@Overrideprotected void onFinishInflate() { super.onFinishInflate(); initialZOrder();}private void initialZOrder() { final int childCount = getChildCount(); View view; ZOrderLayout.LayoutParams params; for (int i = 0; i < childCount; i++) { view = getChildAt(i); params = (LayoutParams) view.getLayoutParams(); Pair<View, Integer> pair = new Pair<>(view, params.zOrder); list.add(pair); } // 根據(jù)Zorder屬性,進(jìn)行排序 Collections.sort(list, new Comparator<Pair<View, Integer>>() { @Override public int compare(Pair<View, Integer> o1, Pair<View, Integer> o2) { return o1.second - o2.second; } });}

獲取所有的子View,然后根據(jù)他們的ZOrder進(jìn)行排序,onFinishInflate()會(huì)在裝載完所有的子View后進(jìn)行回調(diào)

改變View的繪制順序

這里使用排好序的View繪制順序就可以了, 記得調(diào)用setChildrenDrawingOrderEnabled(true);

@Overrideprotected int getChildDrawingOrder(int childCount, int i) { return indexOfChild(list.get(i).first);}

Demo演示

<?xml version='1.0' encoding='utf-8'?><tianrui.viewgroup.view.ZOrderLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' android:layout_width='match_parent' android:layout_height='match_parent'> <tianrui.viewgroup.MyTextView android:text='0' android:layout_width='50dp' android:layout_height='50dp' android:background='@android:color/holo_red_light' app:layout_zorder='1'/> <tianrui.viewgroup.MyTextView android:text='1' android:layout_width='50dp' android:layout_height='50dp' android:layout_marginLeft='20dp' android:background='@android:color/holo_blue_light' app:layout_zorder='2'/> <tianrui.viewgroup.MyTextView android:text='2' android:layout_width='50dp' android:layout_height='50dp' android:layout_marginLeft='40dp' android:background='@android:color/holo_orange_light' app:layout_zorder='3'/> <tianrui.viewgroup.MyTextView android:text='3' android:layout_width='50dp' android:layout_height='50dp' android:layout_marginLeft='60dp' android:background='@android:color/holo_green_light' app:layout_zorder='2'/> <tianrui.viewgroup.MyTextView android:text='4' android:layout_width='50dp' android:layout_height='50dp' android:layout_marginLeft='80dp' android:background='@android:color/holo_purple' app:layout_zorder='1'/></tianrui.viewgroup.view.ZOrderLayout>

可以看出這個(gè)布局是中間的zorder最高,表示中間的會(huì)壓在兩邊的上邊,而最左(右)的繪制層級(jí)(zorder)為1, 表示會(huì)繪制在最下面

Android實(shí)現(xiàn)Z軸布局效果

完整代碼

public class ZOrderLayout extends FrameLayout { private List<Pair<View, Integer>> list = new ArrayList<>(); public ZOrderLayout(@NonNull Context context) { this(context, null); } public ZOrderLayout(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public ZOrderLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); setChildrenDrawingOrderEnabled(true); } @Override protected int getChildDrawingOrder(int childCount, int i) { return indexOfChild(list.get(i).first); } @Override protected void onFinishInflate() { super.onFinishInflate(); initialZOrder(); } private void initialZOrder() { final int childCount = getChildCount(); View view; ZOrderLayout.LayoutParams params; for (int i = 0; i < childCount; i++) { view = getChildAt(i); params = (LayoutParams) view.getLayoutParams(); Pair<View, Integer> pair = new Pair<>(view, params.zOrder); list.add(pair); } Collections.sort(list, new Comparator<Pair<View, Integer>>() { @Override public int compare(Pair<View, Integer> o1, Pair<View, Integer> o2) { return o1.second - o2.second; } }); } /** * 在解析xml時(shí),會(huì)解析每個(gè)跟布局的LayoutParams */ @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } public static class LayoutParams extends FrameLayout.LayoutParams { public final static int DEFAULT_ZORDER = 1; public int zOrder; public LayoutParams(@NonNull Context c, @Nullable AttributeSet attrs) { super(c, attrs); TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ZOrderLayout); zOrder = a.getInt(R.styleable.ZOrderLayout_layout_zorder, DEFAULT_ZORDER); a.recycle(); } }}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲少妇自拍| 欧美少妇精品| 五月天久久777| 久久久精品午夜少妇| 日韩黄色大片网站| 日韩免费福利视频| se01亚洲视频| 美女网站一区| 少妇久久久久| 欧美精品一区二区久久| 亚洲一区免费| 日韩中文字幕无砖| 国产毛片久久久| 麻豆精品在线观看| 精品在线网站观看| 91精品韩国| 五月婷婷六月综合| 免费观看在线色综合| 日韩二区三区四区| 久久这里只有| 久久久夜精品| 日韩中文字幕91| 国产区精品区| 国产一区精品福利| 久久久一二三| 蜜桃久久精品一区二区| 日韩和欧美的一区| 麻豆高清免费国产一区| 高潮一区二区| 伊人精品在线| 日韩av午夜在线观看| 精品五月天堂| re久久精品视频| 日韩精品免费视频人成 | 久久av在线| 欧美日韩1区2区3区| 精品视频在线观看网站| 91精品国产调教在线观看| 快she精品国产999| 国产精品99久久免费观看| 日本高清不卡一区二区三区视频| 99视频在线精品国自产拍免费观看| 日韩激情一区二区| 黄色网一区二区| 伊人久久亚洲热| 国产精品午夜av| 麻豆精品蜜桃| 最新亚洲国产| 成人美女视频| 亚洲精品极品| 欧美羞羞视频| 青青在线精品| 日韩欧美另类一区二区| 亚州av一区| 日韩免费高清| 日韩不卡免费视频| 99精品电影| 国产精品一区二区精品视频观看 | 亚洲精品三级| 另类专区亚洲| 日本午夜精品久久久| 一本大道色婷婷在线| 日本在线视频一区二区| 国产99在线| 亚洲精品亚洲人成在线观看| 水蜜桃精品av一区二区| 亚洲视频国产| 天堂日韩电影| 久久亚洲黄色| 亚洲bt欧美bt精品777| 99精品一区| 麻豆国产精品一区二区三区| 中文精品电影| 久久亚洲国产| 久久99久久人婷婷精品综合| 亚洲综合精品| 欧美日韩尤物久久| 欧美91在线|欧美| 亚洲不卡视频| 国产精品毛片一区二区三区| 日韩av福利| 久久gogo国模啪啪裸体| 亚洲三区欧美一区国产二区| 99久久99视频只有精品| 国产精品免费99久久久| 蜜臀精品久久久久久蜜臀| 蜜桃精品在线| 国产成人调教视频在线观看| 日韩 欧美一区二区三区| 欧产日产国产精品视频| 国产精品成人**免费视频| 亚洲九九精品| 国产精品毛片| 亚洲精品网址| 久久久久一区| 三级在线看中文字幕完整版| 久久精品理论片| 国产精品久久久久久妇女| 午夜性色一区二区三区免费视频| 妖精视频成人观看www| 久久久精品午夜少妇| 国产资源在线观看入口av| 久久精品欧洲| 欧美韩一区二区| 国产图片一区| 88久久精品| 欧美在线首页| 国产亚洲精品美女久久久久久久久久| 亚洲精品免费观看| 日韩在线卡一卡二| 国产一级久久| 性色av一区二区怡红| 日韩午夜高潮| 国产亚洲午夜| 国产精品日韩欧美一区| 激情91久久| 性欧美xxxx免费岛国不卡电影| 日韩欧美网址| 国产66精品| 国产精品成人a在线观看| 久久精品三级| 97人人精品| 日韩成人综合| 亚洲四虎影院| 国产在线不卡| 亚洲激情偷拍| 日韩专区欧美专区| 日韩国产一二三区| 欧美日韩亚洲三区| 国产福利资源一区| 成午夜精品一区二区三区软件| 成人在线超碰| 精品日韩视频| 亚洲网站视频| 国产精品嫩草99av在线| 免费人成黄页网站在线一区二区| 亚洲一二av| 欧美日韩视频免费看| 国产精品一区三区在线观看| 国产精品超碰| 水蜜桃精品av一区二区| 久久蜜桃av| 中文一区一区三区免费在线观 | 国产精品原创| 99久久夜色精品国产亚洲狼| 亚洲一级网站| 亚洲一区二区av| 欧美国产先锋| 日韩欧美二区| 久久亚洲欧美| 91麻豆精品激情在线观看最新 | 国产精品亚洲二区| 狠狠躁少妇一区二区三区| 999精品一区| 日韩在线卡一卡二| 国产精品日本一区二区不卡视频| 国产精品久久久久久久免费观看| 性欧美xxxx免费岛国不卡电影| 一区二区三区午夜视频| 欧美精品国产一区| 国产va免费精品观看精品视频| 欧美一区三区| 日韩av三区| аⅴ资源天堂资源库在线| 五月婷婷亚洲| 国产精品网站在线看| 日韩精品一区二区三区免费观影| 日韩专区在线视频| 欧美激情aⅴ一区二区三区| 视频福利一区| 日韩激情啪啪| 日韩国产欧美一区二区| 一区二区三区四区日韩| 久久精品资源| 999在线观看精品免费不卡网站| 五月亚洲婷婷 | 蜜桃免费网站一区二区三区| 久久影院一区二区三区| 1024精品久久久久久久久| 日韩精品亚洲专区| 国产精品毛片一区二区在线看| 好吊一区二区三区| 国产欧美日韩精品高清二区综合区 | 欧美性www| 在线日韩视频| 国产人成精品一区二区三| 亚洲国内欧美| 国产精品毛片视频| 在线午夜精品| 精品伊人久久| 手机精品视频在线观看| 精品香蕉视频| 亚洲欧洲美洲国产香蕉| 国精品产品一区| 婷婷亚洲精品| 三级小说欧洲区亚洲区| 欧美精品国产| 国产一区二区三区自拍| 精品精品久久| 婷婷成人av|