安卓開發(fā)第三天|圖案解鎖2

學編程前的樣子
學編程后的樣子

圖片來源于網絡,聯系磨镶,侵刪溃蔫。

一、目的

1.學習如何控制控件的移動:動作:點擊琳猫、滑動:控制點:左上角伟叛、中心、右下角
2.繼續(xù)寫圖案解鎖脐嫂。目標:實現移動和點擊點亮圖標

二统刮、知識點

1.在屏幕上點擊,控件的移動到點擊位置

@Override
    public boolean onTouchEvent(MotionEvent event) {

        //獲取事件對應類型
        int action = event.getAction();

        //解決觸摸點和移動點不對應
        //獲取屏幕的大小
        Point p = new Point();
        getWindowManager().getDefaultDisplay().getSize(p);//則屏幕高度:p.y
        //獲取容器寬高
        RelativeLayout rl = findViewById(R.id.root);//則屏幕高度:rl.getHeight
        //屏幕和容器差值(狀態(tài)欄和標題欄的高度)
        float padding = p.y-rl.getHeight();

按下

        if(action == MotionEvent.ACTION_DOWN){
            //獲取觸摸點坐標
            float x = event.getX();
            float y = event.getY()-padding;

            //改變控件的位置
            redview.setX(x-(float)redview.getWidth()/2);
            redview.setY(y-(float)redview.getHeight()/2);
        }

滑動

            float x = event.getX();
            float y = event.getY()-padding;
            //改變控件的位置
            redview.setX(x-(float)redview.getWidth());
            redview.setY(y-(float)redview.getHeight());
        }else if(action == MotionEvent.ACTION_UP){
            //離開屏幕
        }else{
            //被打斷了
        }
        return true;
    }

對應的xml文件

xml


控制中心點

//改變控件的位置
redview.setX(x-(float)redview.getWidth()/2);
redview.setY(y-(float)redview.getHeight()/2);

控制左上角

//改變控件的位置
redview.setX(x);
redview.setY(y);

控制右下角

//改變控件的位置
redview.setX(x-(float)redview.getWidth());
redview.setY(y-(float)redview.getHeight());

2.解決點擊點坐標于控件移動坐標不一致的問題

  1. 讓觸摸點切換到控件的父視圖中
Point p = new Point();        
getWindowManager().getDefaultDisplay().getSize(p);       
 //獲取容器?本身的寬高        
RelativeLayout rl = findViewById(R.id.root_layout);        
//計算狀態(tài)欄或者標題欄的距離     
float padding = p.y - rl.getHeight();        

2.讓控件切換到屏幕坐標系

ImageView firt = dotsList.get(0);
int[] loc = new int[2];       
firt.getLocationOnScreen(loc);
System.out.println("相對屏幕y:"+loc[1]);        
System.out.println("相對容器y:"+firt.getY());       
System.out.println("原本寬度:"+firt.getWidth());        

3.事件處理之 回調

(1.監(jiān)聽處理事件
1.事件源:圖片账千、按鈕侥蒙、滾動視圖
2.監(jiān)聽者:監(jiān)聽事件是否發(fā)送
3.事件:點擊、長按蕊爵、旋轉
2.回調處理事件)

重寫觸摸回調的事件(onTouchEvent)

  • 返回值 true-已處理不會繼續(xù)傳遞 false-自己不消費辉哥,事件繼續(xù)傳
  • 系統(tǒng)自動將事件包裝為MotionEvent類
  • 用戶可以獲取事件的行為 ——getAction
  • ACTION_DOWN桦山、ACTION_MOVE攒射、ACTION_UP、ACTION_CANCEL
  • 獲取觸摸點坐標——getX getY

4.使用tag查找子控件

查找一個控件可以是加id可以是使用tag值
但是對于一些不在xml文件里添加的就不能用id了
注意:用tag值查找某個控件之前要先獲取該控件的父容器恒水,然后再在父容器下用**findViewWithTag()会放; **方法去查找。

就像你去到一個學校你要找一個人钉凌,你得先找到他所在的班級

 @Override
    public boolean onTouchEvent(MotionEvent event) {
        //更改控件的顏色
        //redview.setBackgroundColor(Color.BLACK);

        //找到父容器
        RelativeLayout rl = findViewById(R.id.root);
        //通過tag值找到父容器下的子控件
        View iv = rl.findViewWithTag("1");
        iv.setBackgroundColor(Color.BLUE);
        return true;
    }

對應的xml文件

xml

三咧最、實際應用:圖片解鎖2 | 點亮圖標

與昨天內容的區(qū)別:


QQ2.png

與昨天內容的區(qū)別2

1.監(jiān)聽觸摸事件
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //獲取事件的類型
        int action = event.getAction();
        ImageView selected;
        float x;
        float y;
        //判斷是什什么事件
        switch (action){
            case MotionEvent.ACTION_DOWN:
                //點擊
                //獲取觸摸點的坐標
                x = event.getX();
                y = event.getY();
                //判斷x y是不不是在某個點的范圍內
                selected = dotOfTouch(x, y);
                if (selected != null) {
                    selected.setVisibility(View.VISIBLE);
                }
                break;
            case MotionEvent.ACTION_MOVE:
                //滑動
                //獲取觸摸點的坐標
                x = event.getX();
                y = event.getY();
                //判斷x y是不是在某個點的范圍內
                selected = dotOfTouch(x, y);
                if (selected != null) {
                    selected.setVisibility(View.VISIBLE);
                        }
                break;
            case MotionEvent.ACTION_UP:
                break;
            default:
                break;
        }
        return true;
    }
2.寫?個方法 處理 判斷觸摸點是否在控件內部
    public ImageView dotOfTouch(float x, float y){
        for (ImageView dot:dotsList){
            //獲取這個dot相對于屏幕的x y
            int[] loc = new int[2];
            dot.getLocationOnScreen(loc);
            int dx = loc[0];
            int dy = loc[1];
            //獲取右邊的偏移量
            int r = dx + dot.getWidth();
            //獲取最底部的偏移量
            int b = dy + dot.getHeight();
            //判斷這個點是否在這個范圍內
            if ((x <= r && x >= dx) && (y <= b && y >= dy)){
                return dot;
            }
        }
        return null;
    }
實現效果:

四、心得

點的點亮很容易御雕,接下來就要思考線的點亮怎么實現了矢沿,因為線多且范圍有重復,所以不能用點亮點的方式酸纲,今天學了用tag值來找控件捣鲸,我們可以給每個控件賦tag值,通過tag值判斷是否該點亮線闽坡,那么要怎樣賦值才你很好的表示線呢栽惶?先思考一下吧,明天繼續(xù)實現點亮線疾嗅。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末外厂,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子代承,更是在濱河造成了極大的恐慌汁蝶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件论悴,死亡現場離奇詭異掖棉,居然都是意外死亡席爽,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門啊片,熙熙樓的掌柜王于貴愁眉苦臉地迎上來只锻,“玉大人,你說我怎么就攤上這事紫谷∑胍” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵笤昨,是天一觀的道長祖驱。 經常有香客問我,道長瞒窒,這世上最難降的妖魔是什么捺僻? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮崇裁,結果婚禮上匕坯,老公的妹妹穿的比我還像新娘。我一直安慰自己拔稳,他們只是感情好葛峻,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巴比,像睡著了一般术奖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轻绞,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天采记,我揣著相機與錄音,去河邊找鬼政勃。 笑死唧龄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的稼病。 我是一名探鬼主播选侨,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼然走!你這毒婦竟也來了援制?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芍瑞,失蹤者是張志新(化名)和其女友劉穎晨仑,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡洪己,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年妥凳,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片答捕。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡逝钥,死狀恐怖,靈堂內的尸體忽然破棺而出拱镐,到底是詐尸還是另有隱情艘款,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布沃琅,位于F島的核電站哗咆,受9級特大地震影響,放射性物質發(fā)生泄漏益眉。R本人自食惡果不足惜晌柬,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望郭脂。 院中可真熱鬧年碘,春花似錦、人聲如沸朱庆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娱颊。三九已至,卻和暖如春凯砍,著一層夾襖步出監(jiān)牢的瞬間箱硕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工悟衩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剧罩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓座泳,卻偏偏與公主長得像惠昔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挑势,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容