Android studio一個(gè)手勢(shì)鎖的界面布局

目的:完成一個(gè)手勢(shì)鎖的界面布局古胆,對(duì)Relative,Contains等布局進(jìn)行簡(jiǎn)單的使用喊儡,onWindowFocusChanged進(jìn)行一定的熟練愚臀。大概來說科雳,就是增加對(duì)界面布局的了解。
技術(shù):(1)簡(jiǎn)單的RelativeLayout布局
(2)簡(jiǎn)單的onWindowFocusChanged的使用
(3)內(nèi)部類Layout的使用
(4)簡(jiǎn)單視圖方法

效果:
效果.jpg

代碼:
這是我們的源代碼
package ly.pxd.mtext;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);//讀取XML的,系統(tǒng)自帶不用管
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        //當(dāng)Activity的當(dāng)前Window獲得或失去焦點(diǎn)時(shí)會(huì)被回調(diào)此方法蕾域。
        // 當(dāng)回調(diào)了這個(gè)方法時(shí)表示Activity是完全對(duì)用戶可見的拷肌,即是真正的界面構(gòu)建完成了。
        // 當(dāng)對(duì)話框彈起/消失及Activity新創(chuàng)建及回退等都會(huì)調(diào)用此方法旨巷。
        //相比之下巨缘,onResume()方法更多的是指Activity進(jìn)入了可見的狀態(tài),并不是真正的界面構(gòu)
        // 建完成了契沫,因此獲得手機(jī)界面的高度和寬度用這個(gè)方法比較好带猴。
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {//判斷是否已經(jīng)顯示
            RelativeLayout mtemp1 = findViewById(R.id.fir_iv);
            //一個(gè)視圖鏈接我們主視圖的ID
            ImageView mtemp2 = findViewById(R.id.thr_iv);
            //得到我們所需操作界面
            float mscale = getResources().getDisplayMetrics().density;
            //得到我們手機(jī)的分辨率
            int x = (int) mtemp2.getX();
            int y = (int) mtemp2.getY();
            //這個(gè)界面的坐標(biāo)
            for (int i = 0; i < 2; i++)//豎線
                for (int j = 0; j < 3; j++) {
                    ImageView mtemp3 = new ImageView(this);
                    mtemp3.setBackgroundResource(R.drawable.normal_highlight2);
                    RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT,
                            ViewGroup.LayoutParams.WRAP_CONTENT
                    );
                    temp.leftMargin = (int) (x + 42 * mscale) + (int) (99 * mscale) * j;
                    temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * i;
                    mtemp1.addView(mtemp3, temp);
                }
            for (int i = 0; i < 2; i++)//一個(gè)循環(huán),因?yàn)槲覀兊倪@個(gè)界面要求6
                // 個(gè)這種控件
                for (int j = 0; j < 3; j++) {
                    ImageView mtemp3 = new ImageView(this);
                    //一個(gè)新的視圖懈万,它的環(huán)境在我們的MainActivity
                    mtemp3.setBackgroundResource(R.drawable.normal_highlight1);
                    //背景環(huán)境資源
                    RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT,
                            ViewGroup.LayoutParams.WRAP_CONTENT
                    );//一個(gè)控件的尺寸拴清,定義時(shí)要表示出它的寬高
                    temp.leftMargin = (int) (x + 42 * mscale) + (int) (99 * mscale) * i;
                    temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * j;
                    mtemp1.addView(mtemp3, temp);
                }
            for (int i = 0; i < 2; i++)//左斜線
                for (int j = 0; j < 2; j++) {
                    ImageView mtemp3 = new ImageView(this);
                    mtemp3.setBackgroundResource(R.drawable.normal_highlight3);
                    RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT,
                            ViewGroup.LayoutParams.WRAP_CONTENT
                    );
                    temp.leftMargin = (int) (x + 42 * mscale) + (int) (99 * mscale) * i;
                    temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * j;
                    mtemp1.addView(mtemp3, temp);
                }
            for (int i = 0; i < 2; i++)//右斜線
                for (int j = 0; j < 2; j++) {
                    ImageView mtemp3 = new ImageView(this);
                    mtemp3.setBackgroundResource(R.drawable.normal_highlight4);
                    RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT,
                            ViewGroup.LayoutParams.WRAP_CONTENT
                    );
                    temp.leftMargin = (int) (x + 50 * mscale) + (int) (99 * mscale) * i;
                    temp.topMargin = (int) (y + 170 * mscale) + (int) (99 * mscale) * j;
                    mtemp1.addView(mtemp3, temp);
                }
            for (int i = 0; i < 3; i++)//右斜線
                for (int j = 0; j < 3; j++) {
                    ImageView mtemp3 = new ImageView(this);
                    mtemp3.setBackgroundResource(R.drawable.selected_dot);
                    RelativeLayout.LayoutParams temp = new RelativeLayout.LayoutParams(
                            ViewGroup.LayoutParams.WRAP_CONTENT,
                            ViewGroup.LayoutParams.WRAP_CONTENT
                    );
                    temp.leftMargin = (int) (x + 35 * mscale) + (int) (99 * mscale) * i;
                    temp.topMargin = (int) (y + 165* mscale) + (int) (99 * mscale) * j;
                    mtemp1.addView(mtemp3, temp);
                }
        }

    }
    //這下面是我的一些隨筆可看可不看
    //view是所有視圖的父類,只有最基本的功能
    //線性布局默認(rèn)是橫向的

    //改容器所有控件都會(huì)改變会通,所以只想改一個(gè)控件的話口予,要單獨(dú)改這個(gè)控件
    //background背景顏色
    //線性布局的方向:orientation方法(也可能是類)里的
    // Vertical縱向
    // horizontal橫向

    //layout 有左右Left Right 與開始結(jié)束 Start End的Margin邊距,注意開始結(jié)束是相對(duì)這個(gè)控件而言的(對(duì)于相鄰的控件或者手機(jī)邊距)
    //上邊距 Top 下邊距 Button
    // 外間距 既然View里面都能用
    //那......所有布局都有(所有的布局類里面涕侈,包括控件)應(yīng)為所有的布局類都維護(hù)一個(gè)LayoutParams

    //padding是一個(gè)控件與自己內(nèi)容位置的關(guān)系 內(nèi)間距
    //權(quán)重按比例分配沪停,layout_weight值越小越重要

    //線性布局,沒有交叉
    //相對(duì)布局裳涛,在Margin_layout的基礎(chǔ)上添加了對(duì)齊木张,layout_align(上下左右),兩個(gè)控件采用一個(gè)設(shè)置id一個(gè)調(diào)用方法的方式也是一種方法
    //margin_horizontal="大小"  橫向?qū)R的基礎(chǔ)上,移動(dòng)多少
    //center_horizontal=中間的基礎(chǔ)上橫向?qū)R
    //constraint(上下左右)相對(duì)大小端三,設(shè)置的默認(rèn)大小為0不知道不為0時(shí)會(huì)怎樣舷礼,應(yīng)該會(huì)失敗吧(特有方法)androidx.constraintlayout.widget.ConstraintLayout
    //constraintDimensionRatio(h/w,?:?)的用法不是太清楚高寬比或者寬高比,后面的為前面那個(gè)高或者寬
    //要試一試
    //align是什么郊闯?
    //資源圖片的名稱妻献,必須a-z,0-9或者下劃線
    //scaleType里面用fitXY進(jìn)行拉伸
    //R-values-style-noActionbar不要標(biāo)題欄
    //一個(gè)Imageview對(duì)象下的setbackgroudResource()方法是什么蛛株?
    //坐標(biāo)的獲取......onWindowFocusChanged
    //控件是矩形的
    // RelativeLayout mfirst=findViewById(R.id.fir_iv);
    //ImageView temp=new ImageView(this);
    //創(chuàng)建了一個(gè)視圖,
    //temp.setBackgroundResource(R.drawable.selected_dot);
    //設(shè)置視圖背景資源
    //一個(gè)控件的尺寸,只是尺寸
    //RelativeLayout.LayoutParams templocation=new RelativeLayout.LayoutParams(
    //      ViewGroup.LayoutParams.WRAP_CONTENT,
    //    ViewGroup.LayoutParams.WRAP_CONTENT);
    //這個(gè)類是內(nèi)部靜態(tài)類,每個(gè)布局都有的,一般
    //這個(gè)方法怎么用的育拨,我的理解是谨履,每個(gè)布局都有其特有的LayoutParams方法,其創(chuàng)建這個(gè)對(duì)
    // 象時(shí)需要給予兩個(gè)參數(shù)熬丧,大小笋粟,一個(gè)橫一個(gè)縱寬高,就是寬高......可能不是析蝴,去查查
    //getlocalVisibleRect......一些找坐標(biāo)的方法
    //安卓 在容器中添加的控件需要被window計(jì)算
    //Viewgroup的意義矗钟?
    //Constraint里面那個(gè)對(duì)齊方法會(huì)調(diào)整邊框大小
    //重寫onWindowFocusChanged這個(gè)方法,因?yàn)樗鼤?huì)在所有子控件測(cè)量好后調(diào)用嫌变,不過這個(gè)方法好像會(huì)調(diào)用多次,占內(nèi)存
    //addView(?,?)第一個(gè)參數(shù)是我們要加入的視圖躬它,第二個(gè)是以怎樣的尺寸去添加這個(gè)視圖
    //get可以上下左右腾啥,而且可以得到寬高
    //真正的圖片要用另一個(gè)方法
    //不同的屏幕分辨率不一樣,顯示同一張圖片的大小不同
    //什么是屏幕的密度冯吓?嗯倘待,,组贺,凸舵,,分辨率失尖?嗯啊奄。
    //float fentemp=getResources().getDisplayMetrics().density;
    // System.out.println(fentemp);//得到拉伸尺寸
    //x,y超出了圖片的范圍會(huì)閃屏,掀潮,昨天那個(gè)程序的問題
    //setVisibility設(shè)置隱藏性
    //onTouchEvent方法菇夸,來實(shí)現(xiàn)點(diǎn)亮功能


}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/fir_iv">
    <ImageView
        android:id="@+id/sec_iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/main_bg"
        android:scaleType="fitXY"/>
    <ImageView
        android:id="@+id/thr_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/op_bg"
        android:layout_centerInParent="true"/>
</RelativeLayout>

沒有要標(biāo)題欄,在res-values-style里面進(jìn)行了一些修改

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

這是這里要用到的圖片仪吧,很簡(jiǎn)單的一個(gè)程序庄新,嗯,不看我隨筆的話挺短的薯鼠,而且那幾個(gè)循環(huán)都是一樣的原理择诈,理解一個(gè)就行了的:
main_bg.png
normal_highlight1.png
normal_highlight2.png
normal_highlight3.png
normal_highlight4.png
op_bg.png
selected_dot.png
wrong_dot.png
wrong_highlight1.png
wrong_highlight2.png
wrong_highlight3.png
wrong_highlight4.png

感悟:萬事開頭難吧,在最近的學(xué)習(xí)中確實(shí)有很多的新東西出皇,不過羞芍,誰讓我決定學(xué)了呢。既然做了決定而且自己又有能力去學(xué)好恶迈,就不應(yīng)該放棄呀涩金。浮云落霞日悠悠谱醇,畫池鱗影月空空。伊盼君歸心無憂步做,君歸已然青云樓副渴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市全度,隨后出現(xiàn)的幾起案子煮剧,更是在濱河造成了極大的恐慌,老刑警劉巖将鸵,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勉盅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡顶掉,警方通過查閱死者的電腦和手機(jī)草娜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痒筒,“玉大人宰闰,你說我怎么就攤上這事〔就福” “怎么了移袍?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)老充。 經(jīng)常有香客問我葡盗,道長(zhǎng),這世上最難降的妖魔是什么啡浊? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任觅够,我火速辦了婚禮,結(jié)果婚禮上巷嚣,老公的妹妹穿的比我還像新娘蔚约。我一直安慰自己,他們只是感情好涂籽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布苹祟。 她就那樣靜靜地躺著,像睡著了一般评雌。 火紅的嫁衣襯著肌膚如雪树枫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天景东,我揣著相機(jī)與錄音砂轻,去河邊找鬼。 笑死斤吐,一個(gè)胖子當(dāng)著我的面吹牛搔涝,可吹牛的內(nèi)容都是我干的厨喂。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼庄呈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜕煌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诬留,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤斜纪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后文兑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒刚,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年绿贞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了因块。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡籍铁,死狀恐怖贮聂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寨辩,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布歼冰,位于F島的核電站靡狞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏隔嫡。R本人自食惡果不足惜甸怕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腮恩。 院中可真熱鬧梢杭,春花似錦、人聲如沸秸滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荡含。三九已至咒唆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間释液,已是汗流浹背全释。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留误债,地道東北人浸船。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓妄迁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親李命。 傳聞我的和親對(duì)象是個(gè)殘疾皇子登淘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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