自定義控件交叉布局(customViewGroupCrossLayout)

效果是:點擊按鈕使一個自定義布局里的的控件交叉

初始化一下數(shù)據(jù):
自定義控件的代碼:

package test.pgl.com.customviewgroupcrosslayout;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Administrator on 2017/5/28.
 */

public class MyViewGroup extends ViewGroup {
    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //遍歷所有的子view
        int left=0;
        int top=0;
        for (int i = 0; i < getChildCount(); i++) {
            //根據(jù)索引獲取到當(dāng)前的子view
            View childView = getChildAt(i);
            if(i%2==0){
                left = 0;
            }else{
                left = getMeasuredWidth()-childView.getMeasuredWidth();
            }
            //給每一個子view 擺放到一個合適的位置
            childView.layout(left,top,left+childView.getMeasuredWidth(),top+childView.getMeasuredHeight());
            //修改top實現(xiàn)每一個子view從上到下的疊放效果
            top+=childView.getMeasuredHeight();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //主動測量所有的孩子
        measureChildren(0,0);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="test.pgl.com.customviewgroupcrosslayout.MainActivity">

    <Button
        android:onClick="Cross"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕" />
    <test.pgl.com.customviewgroupcrosslayout.MyViewGroup
        android:id="@+id/myViewGroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:background="#ff0000"/>
        <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:background="#00ff00"/>
        <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:background="#0000ff"/>
        <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:background="#000000"/>
    </test.pgl.com.customviewgroupcrosslayout.MyViewGroup>
</LinearLayout>

效果:

Paste_Image.png

現(xiàn)在來處理點擊按鈕后的邏輯:

package test.pgl.com.customviewgroupcrosslayout;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    private MyViewGroup myViewGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myViewGroup = (MyViewGroup) findViewById(R.id.myViewGroup);
    }

    public void Cross(View view) {
        myViewGroup.setFlag(!myViewGroup.isFlag());
    }
}

自定義控件的代碼:

package test.pgl.com.customviewgroupcrosslayout;

        import android.content.Context;
        import android.util.AttributeSet;
        import android.view.View;
        import android.view.ViewGroup;

/**
 * Created by Administrator on 2017/5/28.
 */

public class MyViewGroup extends ViewGroup {
    private boolean flag=false;

    public MyViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
        //重新布局 使原有的布局無效 重新執(zhí)行l(wèi)ayout階段    request 請求 要求
        requestLayout();
    }
    public boolean isFlag(){
        return flag;
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        //遍歷所有的子view
        int left=0;
        int top=0;
        for (int i = 0; i < getChildCount(); i++) {
            //根據(jù)索引獲取到當(dāng)前的子view
            View childView = getChildAt(i);
            if(flag){
                if(i%2==0){
                    left = 0;
                }else{
                    left = getMeasuredWidth()-childView.getMeasuredWidth();
                }
            }else{
                if(i%2==0){
                    left = getMeasuredWidth()-childView.getMeasuredWidth();
                }else{
                    left = 0;
                }
            }
            //給每一個子view 擺放到一個合適的位置
            childView.layout(left,top,left+childView.getMeasuredWidth(),top+childView.getMeasuredHeight());
            //修改top實現(xiàn)每一個子view從上到下的疊放效果
            top+=childView.getMeasuredHeight();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //主動測量所有的孩子
        measureChildren(0,0);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

點擊按鈕后的設(shè)計邏輯是:
讓布局交叉:就兩種情況所以用true和false來區(qū)分:
這種布局點擊按鈕交叉無非就重新布局一次
所以:
點擊按鈕之前的布局 isFlag為false

兩種情況 兩種布局 一一對應(yīng)

Paste_Image.png

當(dāng)按鈕點擊,布局要改變就得讓flag改變
所以要setFlag

 public void setFlag(boolean flag) {
        this.flag = flag;
        //重新布局 使原有的布局無效 重新執(zhí)行l(wèi)ayout階段    request 請求 要求
        requestLayout();
    }

注意: requestLayout();必須寫上,只有前一個布局無效后才能再次布局

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝶糯,更是在濱河造成了極大的恐慌瓣铣,老刑警劉巖霸株,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件相味,死亡現(xiàn)場離奇詭異粹胯,居然都是意外死亡特幔,警方通過查閱死者的電腦和手機咨演,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯斯,“玉大人薄风,你說我怎么就攤上這事∨那叮” “怎么了遭赂?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長横辆。 經(jīng)常有香客問我撇他,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任困肩,我火速辦了婚禮划纽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锌畸。我一直安慰自己勇劣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布潭枣。 她就那樣靜靜地躺著比默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盆犁。 梳的紋絲不亂的頭發(fā)上命咐,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音谐岁,去河邊找鬼醋奠。 笑死,一個胖子當(dāng)著我的面吹牛翰铡,可吹牛的內(nèi)容都是我干的钝域。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼锭魔,長吁一口氣:“原來是場噩夢啊……” “哼例证!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起迷捧,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤织咧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漠秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笙蒙,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年庆锦,在試婚紗的時候發(fā)現(xiàn)自己被綠了捅位。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡搂抒,死狀恐怖艇搀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情求晶,我是刑警寧澤焰雕,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站芳杏,受9級特大地震影響矩屁,放射性物質(zhì)發(fā)生泄漏辟宗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一吝秕、第九天 我趴在偏房一處隱蔽的房頂上張望泊脐。 院中可真熱鬧,春花似錦烁峭、人聲如沸晨抡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至如捅,卻和暖如春棍现,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镜遣。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工己肮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悲关。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓谎僻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寓辱。 傳聞我的和親對象是個殘疾皇子艘绍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,358評論 0 17
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫秫筏、插件诱鞠、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 前言 這個系列主要的目的是讓讀者去練習(xí)代碼,順便可以做很多有意思并且可能會有幫助的小工具这敬,我盡力周更二次航夺。語言不一...
    Kevin_Feng閱讀 416評論 0 0
  • 為什么大多數(shù)車主老感覺前半箱油比后半箱油耐用阳掐?你可能也有這樣的疑惑,那究竟只是自己的錯覺還是有別的原因呢冷蚂? 和心理...
    蔡健文閱讀 289評論 0 1