Android設(shè)置點(diǎn)擊事件催享,讓指定區(qū)域背景變暗

整體思路:使用FrameLayout作為變暗區(qū)域的Root英岭,并設(shè)置FrameLayout的foreground為黑色不透明的shape,之后就可以修改shape的透明度北救,讓指定區(qū)域變暗荐操。之后通過在子線程中添加延時(shí),使屏幕變化緩慢執(zhí)行珍策,實(shí)現(xiàn)漸變效果托启。

本文結(jié)構(gòu)

  • 1.簡單實(shí)現(xiàn)
  • 2.在實(shí)現(xiàn)過程中添加延時(shí)效果,讓其變暗有一個(gè)過程攘宙,再逐步恢復(fù)原樣屯耸。

1.簡單實(shí)現(xiàn)

1.1 新建dim.xml

先新建一個(gè)dim.xml文件(/drawable/dim.xml)拐迁,里面放入要用的shape。

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <solid android:color="#000000" />
</shape>

注意其中顏色為黑色(#000000)疗绣,沒有指定Alpha通道(透明度)的值线召。如果在這里指定了Alpha通道,如使用#ff000000多矮,該Alpha通道的值(0xff)就會(huì)固定缓淹,無法再通過setAlpha()方法設(shè)置

1.2 設(shè)置布局文件

將要變暗的區(qū)域放在FrameLayout中塔逃,并設(shè)置 FrameLayout 的 foreground 為上面定義的 dim.xml讯壶。
由于 dim.xml 是不透明的黑色,這里還設(shè)置了tools:foreground=""湾盗,以免在Preview窗口一團(tuán)黑鹏溯。

 <FrameLayout
        android:id="@+id/fl_forDark"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:foreground="@drawable/dim"
        tools:foreground=""
        >
        <android.support.v4.view.ViewPager
            android:id="@+id/main_viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />       
    </FrameLayout>

如果在設(shè)置tools:foreground=""時(shí)報(bào)錯(cuò),檢查一下有沒有設(shè)置:

xmlns:tools="http://schemas.android.com/tools"
1.3 java代碼部分

同樣由于 dim.xml 是黑色的淹仑,在初始化時(shí)記得首先把它設(shè)置為透明:

 mFrameLayout = (FrameLayout) findViewById(R.id.fl_forDark);
 if (mFrameLayout.getForeground()!=null){
         mFrameLayout.getForeground().setAlpha(0);
     }

然后可以在點(diǎn)擊事件中添加setAlpha()實(shí)現(xiàn)效果丙挽。

mFrameLayout.getForeground().setAlpha(127);   //此句添加到第一個(gè)點(diǎn)擊事件中,點(diǎn)擊屏幕變暗
mFrameLayout.getForeground().setAlpha(0);    //此句添加到第二個(gè)點(diǎn)擊事件中匀借,點(diǎn)擊屏幕恢復(fù)

2.添加延時(shí)效果

通過實(shí)現(xiàn)上面的代碼發(fā)現(xiàn)颜阐,屏幕變暗與恢復(fù)都是瞬間完成的,顯得突兀吓肋,在實(shí)際開發(fā)過程中可能需要讓其變化有一個(gè)過程凳怨。

2.1 新建一個(gè)Handle對象,在Hanlde調(diào)用改變透明度的方法
Handler mHandler = new Handler(){
     @Override
     public void handleMessage(Message msg) {
        switch (msg.what){
            case 1:
                mFrameLayout.getForeground().setAlpha((int)msg.obj);
             break;
          }
      }
 };
2.2 在onClick()方法中修改,

先設(shè)置一個(gè)參數(shù)

private int alpha;   //用于設(shè)定透明度的參數(shù)

將原來的兩句刪掉是鬼,

mFrameLayout.getForeground().setAlpha(127);   
mFrameLayout.getForeground().setAlpha(0);    

在用于變暗的onClick()中寫入:

                alpha = 0;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (alpha < 127) {
                            try {
                                Thread.sleep(4);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Message msg = mHandler.obtainMessage();
                            msg.what = 1;
                            alpha += 1; //每次加1肤舞,逐漸變暗
                            msg.obj = alpha;
                            mHandler.sendMessage(msg);
                        }
                    }
                }).start();

在用于恢復(fù)的onClick()寫入:

                alpha = 127;
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (alpha > 0) {
                            try {
                                Thread.sleep(4);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Message msg = mHandler.obtainMessage();
                            msg.what = 1;
                            alpha -= 1; //每次加1,逐漸變暗
                            msg.obj = alpha;
                            mHandler.sendMessage(msg);
                        }
                    }
                }).start();

這樣可以效果了均蜜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末李剖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囤耳,更是在濱河造成了極大的恐慌篙顺,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充择,死亡現(xiàn)場離奇詭異德玫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椎麦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門宰僧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人观挎,你說我怎么就攤上這事琴儿《位” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵凤类,是天一觀的道長穗泵。 經(jīng)常有香客問我,道長谜疤,這世上最難降的妖魔是什么佃延? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮夷磕,結(jié)果婚禮上履肃,老公的妹妹穿的比我還像新娘。我一直安慰自己坐桩,他們只是感情好尺棋,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绵跷,像睡著了一般膘螟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碾局,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天荆残,我揣著相機(jī)與錄音,去河邊找鬼净当。 笑死内斯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的像啼。 我是一名探鬼主播俘闯,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼忽冻!你這毒婦竟也來了真朗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤甚颂,失蹤者是張志新(化名)和其女友劉穎蜜猾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體振诬,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年衍菱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赶么。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脊串,死狀恐怖辫呻,靈堂內(nèi)的尸體忽然破棺而出清钥,到底是詐尸還是另有隱情,我是刑警寧澤放闺,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布祟昭,位于F島的核電站,受9級特大地震影響怖侦,放射性物質(zhì)發(fā)生泄漏篡悟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一匾寝、第九天 我趴在偏房一處隱蔽的房頂上張望搬葬。 院中可真熱鬧,春花似錦艳悔、人聲如沸急凰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡锈。三九已至,卻和暖如春乔外,著一層夾襖步出監(jiān)牢的瞬間床三,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工袁稽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勿璃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓推汽,卻偏偏與公主長得像补疑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子歹撒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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