Android的學(xué)習(xí)與實(shí)踐2 (界面的布局,控件的添加缺脉,測(cè)量控件的坐標(biāo)和本身的大小痪欲,圖案解鎖前面部分)

1.收獲

今天開(kāi)始做小的Android的demo,雖然在早上大部分時(shí)間講的都是理論,雖然這些理論聽(tīng)著是有點(diǎn)枯燥的攻礼,但是對(duì)于我這種人來(lái)說(shuō)业踢,是非常好的,因?yàn)槲乙粋€(gè)愛(ài)去搞明白的人礁扮,當(dāng)我碰到一些難題時(shí)知举,就會(huì)去思考他為什么是這樣,為什么要這么做太伊,不搞明白不罷休的那種雇锡,這些理論的知識(shí)就為后面的做demo種下了基礎(chǔ),就不會(huì)在講的去耽誤很多的時(shí)間僚焦。所以我在后面的demo中理解上很輕松遮糖。就是有的方法不是太熟悉,不知道怎末用他們叠赐,自己害怕忘記了欲账,自己還把他們記下來(lái)了。這集訓(xùn)的一個(gè)月就這樣過(guò)去了芭概,自己學(xué)到了多少東西赛不,只有自己知道,時(shí)間還有罢洲,初心還在踢故!加油!

2.技術(shù)

(1)界面的布局
(2)scaleType的使用
(3)控件的添加
(4)測(cè)量控件的坐標(biāo)和本身的大小
(5)圖案解鎖demo(前面小部分)

3.技術(shù)的實(shí)際應(yīng)用和實(shí)踐

(1)界面的布局
在上節(jié)課中我們講了界面布局的方式有6種

image.png

這節(jié)課可我們講了怎樣去布局惹苗,哪些布局方式是常用的殿较,有哪些屬性,接下來(lái)如下圖
線性布局 LinearLayout
LinearLayout: LinearLayout.LayoutParams
Margin:控件邊緣和其他控件的間距- 外間距
Padding:控件內(nèi)部和?自?己邊緣的間距- 內(nèi)間距

image.png

其中的屬性


image.png

相對(duì)布局 RelativeLayout
在MaraginLayout的基礎(chǔ)上添加了對(duì)齊
(當(dāng)前這個(gè)控件和v1哪邊對(duì)齊)
Layout_alignRight=”@id/v1”
Layout_alignLeft=”@id/v1”
Layout_alignTop=”@id/v1”
Layout_alignBottom=”@id/v1”

約束布局 ConstraintLayout
添加約束條件(代碼):

 <View
        android:id="@+id/v1"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@color/colorAccent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/v2"

        android:layout_marginLeft="50dp"
        android:layout_marginTop="50dp"
        android:layout_marginRight="50dp"
        android:layout_marginBottom="50dp"
        />

    <View
        android:id="@+id/v2"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@color/colorPrimary"
        app:layout_constraintStart_toEndOf="@id/v1"
        app:layout_constraintTop_toTopOf="@id/v1"
        app:layout_constraintBottom_toBottomOf="@id/v1"
        app:layout_constraintEnd_toEndOf="parent"

        android:layout_marginRight="50dp"
        />

圖片:


image.png

效果:


image.png

(2)scaleType的使用
在設(shè)置背景圖片時(shí)的Android:scaleType=”T”表示什么意思

image.png

現(xiàn)在解釋如下:
image.png

(3)控件的添加
首先我們要確定該容器是什么布局桩蓉,我們才能知道用什么屬性和方法
首先在這里修改布局方式

image.png

讓后在XML文件中添加控件
添加背景圖片(想要添加自己想要的圖片要把圖片拖到drawble下面)
image.png

<ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/main_bg"
        android:scaleType="fitXY"/>

添加子控件

<ImageView
        android:id="@+id/opview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/op_bg"
        android:layout_centerInParent="true"
        />

(4)測(cè)量控件的坐標(biāo)和本身的大小
現(xiàn)在有一問(wèn)題就是我們把控件添加到什么地方淋纲,我們就需要坐標(biāo),那麼這個(gè)坐標(biāo)我們?cè)趺慈カ@取呢
搞清楚手機(jī)的坐標(biāo)系

image.png

然后再來(lái)確定控件的坐標(biāo)和本身的大小
在這里我們需要重寫(xiě)方法onWindowFocusChanged(boolean hasFocus) {}

@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        //獲取屏幕密度
        float a=getResources().getDisplayMetrics().density;
        //判斷是否已經(jīng)顯示
        if(hasFocus){
            //獲取容器
            RelativeLayout rl=findViewById(R.id.rootlayout);
            //獲取背景視圖
            ImageView iv=findViewById(R.id.opview);
            //獲取x和y以及本身的長(zhǎng)和寬
            int x=iv.getLeft();
            int y=iv.getTop();
          int w=iv.getWidth();
            int h=iv.getHeight();
}

安卓 在容器中添加的控件需要被window計(jì)算/測(cè)量
通常在onCreat,onStart,onResume無(wú)法獲取控件本身的尺寸
所有的測(cè)量都是在另一個(gè)線程中操作
如果想要獲取控件的尺寸 就得要用重寫(xiě)onWindowFocusChanged(boolean hasFocus){}方法
Android中獲取手機(jī)屏幕的高度和寬度院究,我們知道在onCreate方法中獲取到的值都是為0的洽瞬,有人說(shuō)可以在onClick方法中獲取值本涕,這個(gè)也是個(gè)方法 ,但在onWindowFocusChanged方法中可以直接獲取到伙窃,而且有的時(shí)候場(chǎng)景的需要菩颖,就不得不在Activity渲染完成后立馬獲取值,這時(shí)候onWindowFocusChanged()方法就用到實(shí)處了,類(lèi)似的有PopupWindow的顯示为障,如果在onCreate方法中執(zhí)行的話晦闰,會(huì)報(bào)沒(méi)有token的異常,就是因?yàn)锳ctivity沒(méi)有渲染成功.
onWindowFocusChanged():當(dāng)Activity的當(dāng)前Window獲得或失去焦點(diǎn)時(shí)會(huì)被回調(diào)此方法。當(dāng)回調(diào)了這個(gè)方法時(shí)表示Activity是完全對(duì)用戶(hù)可見(jiàn)的(只是可見(jiàn)鳍怨,還一片黑呼呼的鹅髓,有待draw..)。當(dāng)對(duì)話框彈起/消失及Activity新創(chuàng)建及回退等都會(huì)調(diào)用此方法京景。
相比之下窿冯,onResume()方法更多的是指Activity進(jìn)入了可見(jiàn)的狀態(tài),但只是狀態(tài)确徙,并不是真正的界面構(gòu)建完成了醒串。
至此,如果需要獲取某個(gè)View的寬高,可以在onWindowFocusChanged()處直接獲取即可鄙皇,這比對(duì)某個(gè)view設(shè)置onGlobalLayoutListener的方式來(lái)獲取方便了許此芜赌。又比如,對(duì)于需要讀取本地文件記錄來(lái)判斷是否是第一次打開(kāi)界面去提示文本圖片的伴逸,也可以在此方法中去讀取然后再顯示在ui上缠沈。

(5)圖案解鎖demo(前面小部分)
在前面的基礎(chǔ)上我們需要添加一些東西
//創(chuàng)建橫線

 for(int i=0;i<3;i++){
                for (int j = 0; j < 2; j++) {
                    //創(chuàng)建一個(gè)視圖顯示線
                    ImageView lineView=new ImageView(this);
                    //設(shè)置圖片
                    lineView.setBackgroundResource(R.drawable.normal_highlight1);
                    //創(chuàng)建布局參數(shù)
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                    params.leftMargin=(int)(x+46.6*a+99*a*j);
                    params.topMargin=(int)(y+170*a+99*a*i);
                    rl.addView(lineView,params);
                }
            }
```//創(chuàng)建豎線

            for(int i=0;i<2;i++){
                for (int j = 0; j < 3; j++) {
                    //創(chuàng)建一個(gè)視圖顯示線
                    ImageView lineView=new ImageView(this);
                    //設(shè)置圖片
                    lineView.setBackgroundResource(R.drawable.normal_highlight2);
                    //創(chuàng)建布局參數(shù)
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                    params.leftMargin=(int)(x+42*a+99*a*j);
                    params.topMargin=(int)(y+170*a+99*a*i);
                    rl.addView(lineView,params);
                }
            }

//創(chuàng)建右豎線

            for(int i=0;i<2;i++){
                for (int j = 0; j < 2; j++) {
                    //創(chuàng)建一個(gè)視圖顯示線
                    ImageView lineView=new ImageView(this);
                    //設(shè)置圖片
                    lineView.setBackgroundResource(R.drawable.normal_highlight3);
                    //創(chuàng)建布局參數(shù)
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                    params.leftMargin=(int)(x+42*a+99*a*j);
                    params.topMargin=(int)(y+170*a+99*a*i);
                    rl.addView(lineView,params);
                }
            }

            //創(chuàng)建左豎線

            for(int i=0;i<2;i++){
                for (int j = 0; j < 2; j++) {
                    //創(chuàng)建一個(gè)視圖顯示線
                    ImageView lineView=new ImageView(this);
                    //設(shè)置圖片
                    lineView.setBackgroundResource(R.drawable.normal_highlight4);
                    //創(chuàng)建布局參數(shù)
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
                    params.leftMargin=(int)(x+54*a+99*a*j);
                    params.topMargin=(int)(y+170*a+99*a*i);
                    rl.addView(lineView,params);
                }
            }

//九個(gè)點(diǎn)

            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    //創(chuàng)建用于顯示點(diǎn)的視圖
                    ImageView dotView=new ImageView(this);
                    //隱藏視圖
                    dotView.setVisibility(View.VISIBLE);
                    //顯示對(duì)應(yīng)的圖片
                    dotView.setBackgroundResource(R.drawable.selected_dot);
                    //創(chuàng)建控件的尺寸
                    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

                    params.leftMargin=(int)(x+35*a+99*a*i);
                    params.topMargin=(int)(y+164*a+99*a*j);

                    //將子控件添加到容器中
                    rl.addView(dotView,params);
                }
            }
        }
    }

效果:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市错蝴,隨后出現(xiàn)的幾起案子洲愤,更是在濱河造成了極大的恐慌,老刑警劉巖顷锰,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柬赐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡官紫,警方通過(guò)查閱死者的電腦和手機(jī)肛宋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)束世,“玉大人酝陈,你說(shuō)我怎么就攤上這事』偕妫” “怎么了沉帮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我遇西,道長(zhǎng)馅精,這世上最難降的妖魔是什么严嗜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任粱檀,我火速辦了婚禮,結(jié)果婚禮上漫玄,老公的妹妹穿的比我還像新娘茄蚯。我一直安慰自己,他們只是感情好睦优,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布渗常。 她就那樣靜靜地躺著,像睡著了一般汗盘。 火紅的嫁衣襯著肌膚如雪皱碘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天隐孽,我揣著相機(jī)與錄音癌椿,去河邊找鬼。 笑死菱阵,一個(gè)胖子當(dāng)著我的面吹牛踢俄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晴及,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼都办,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了虑稼?” 一聲冷哼從身側(cè)響起琳钉,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛛倦,沒(méi)想到半個(gè)月后槽卫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胰蝠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年歼培,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茸塞。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躲庄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钾虐,到底是詐尸還是另有隱情噪窘,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布效扫,位于F島的核電站倔监,受9級(jí)特大地震影響直砂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浩习,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一静暂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谱秽,春花似錦洽蛀、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至近哟,卻和暖如春驮审,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吉执。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工疯淫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼠证。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓峡竣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親量九。 傳聞我的和親對(duì)象是個(gè)殘疾皇子适掰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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