妖豔的SwitchButton控制項,隔壁產品都饞哭了

2021-03-02 也路子

廢話不多說,來人,上圖

這Q彈的動畫,妖豔的色彩轉換,著實和市面上的普通Switch控制項不太一樣。下面對它逐一拆解,從0到1實現它。

一、設計思路

Android系統提供的SwitchButon很好地體現了metiarial design設計風格,但不夠妖豔。我希望用兩個比較衝突的對比色進行控制項的顏色設計,這樣擺在淺色背景頁面的時,控制項可以達到一種直刺眼睛的效果。抓人、妖豔、騷氣外放。只要整體頁面搭配得當,該控制項必定可以「外騷內純」。微微模糊的光暈可以使得本就亮麗的顏色變得更加妖豔。

為增加設計的可擴展性,可以改變顏色從而體現不同的風格。

二、實現方式

總體而言,雖然控制項的外表非常妖豔,但交互邏輯是比較簡單的。不考慮繼承自系統Switch,因為並不需要再去了解如何擴展Switch。因此直接繼承自View即可。整個邏輯控制在onTouchEvent中實現,聲明好各個可配置的屬性,如顏色、大小等等。

可以看到,圖形由兩大部分構成,一個是前面藍色的圓角矩形(指示器),一個是後面紅色的長條矩形(背景條),分別對這兩個圖形進行繪製即可。onDraw部分的代碼如下:其中bkgRect代表待繪製矩形區域範圍,height、width為控制項長寬,bkgBarW、bkgBarH為背景條長寬,由於是圓角矩形,調用canvas的drawRoundRect方法進行繪製,bkgBarPaint控制背景條顏色
RectF bkgRect = new RectF((width - bkgBarW) / 2f, height / 2 - (bkgBarH / 2), (width - bkgBarW) / 2f + bkgBarW, height / 2 + (bkgBarH / 2));canvas.drawRoundRect(bkgRect, bkgBarH / 4, bkgBarH / 4, bkgBarPaint);

同樣的,indicatorRect為待繪製圓角矩形的區域範圍,indicatorW、indicatorH為指示器寬高,indicatorX、indicatorY為指示器的中心坐標點,該坐標之後會結合animator進行動態計算,最後調用canvas的drawRoundRect進行繪製
RectF indicatorRect = new RectF(        indicatorX,        indicatorY,        indicatorW + indicatorX,        (height - indicatorH) / 2 + indicatorH);canvas.drawRoundRect(indicatorRect, indicatorH / 6, indicatorH / 6, indicatorPaint);

這部分計算好文字或圖標的坐標進行繪製即可,需要注意的是,如果要繪製文字,需要計算出文字的基線位置,方便與指示器在視覺上居中
int baseLineY = (int) (indicatorRect.centerY() - textTop / 2 - textBottom / 2);if (status == false) {    canvas.drawText("♂", indicatorRect.centerX(), baseLineY, textPaint);} else {    canvas.drawText("♀", indicatorRect.centerX(), baseLineY, textPaint);}

為方便控制,定義兩個AnimatorSet,分別為animOnSet、animOffSet,animOnSet代表開關選擇器打開時的動畫合集,animOffSet代表開關選擇器關閉時的動畫合集。設置為BounceInterpolator即可配置彈性效果。
animatorOn = ValueAnimator.ofFloat(indicatorStartX, indicatorEndX);animatorOn.setDuration(500);animatorOn.setInterpolator(new BounceInterpolator());animatorOn.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {        indicatorX = (float) animation.getAnimatedValue();        postInvalidate();    }});animOnSet = new AnimatorSet();animOnSet.playTogether(animatorOn, animatorColorOn);

animatorOff = ValueAnimator.ofFloat(indicatorEndX, indicatorStartX);animatorOff.setDuration(500);animatorOff.setInterpolator(new BounceInterpolator());animatorOff.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {        indicatorX = (float) animation.getAnimatedValue();        postInvalidate();    }});animOffSet = new AnimatorSet();animOffSet.playTogether(animatorColorOff, animatorOff);

仔細觀察可以注意到,指示器是帶有同顏色的陰影的,淡淡的陰影向四周暈開,如同光霧一般。這裡使用設計好的陰影背景圖切圖即可,但為了增加控制項通用性,採取了討巧的辦法。通過對Bitmap的處理從而在指示器顏色變化時,繪製的陰影顏色也隨之變化。代碼如下,bmShdow為待繪製的陰影圖片
bmShadow = BitmapFactory.decodeResource(getResources(), R.drawable.img_shadow_rect_blue);//sex_blue為配置的指示器為「開」狀態時的顏色,int值bmShadow = BitmapUtils.replacePixelColor(bmShadow, sex_blue);

再仔細觀察,會發現在指示器動畫執行的過程中,指示器顏色也完成了一個漸變過渡。這裡有個變換顏色動態計算的操作,依然採用animator進行計算,其中indicatorPaint控制指示器顏色
animatorColorOn = new ValueAnimator();animatorColorOn.setIntValues(sex_blue, sex_red);animatorColorOn.setEvaluator(new ArgbEvaluator());animatorColorOn.setDuration(500);animatorColorOn.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {        int color = (int) animation.getAnimatedValue();        indicatorPaint.setColor(color);    }});
animatorColorOff = new ValueAnimator();animatorColorOff.setIntValues(sex_red, sex_blue);animatorColorOff.setEvaluator(new ArgbEvaluator());animatorColorOff.setDuration(500);animatorColorOff.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {    @Override    public void onAnimationUpdate(ValueAnimator animation) {        int color = (int) animation.getAnimatedValue();        indicatorPaint.setColor(color);    }});


三、後記控制項設計或開發,無處不體現著「自頂向下」的思想。弄清需求,理清邏輯,打磨細節,做到這三點,絕大部分控制項設計或開發的難題一定可以迎刃而解。《隔壁產品都饞哭了》系列文章的初衷就是要設計出一些和市面上不太一樣的控制項,給人眼前一亮的感覺。不僅把它設計出來,還包括了控制項各個細節的實現,最後做到好看也好用。

相關焦點

  • 妖媚的刻度尺控制項,隔壁產品都饞哭了
    值得注意的是,控制項支持漸變背景色!下面對這個控制項進行逐一拆解/   設計思路   /《隔壁產品都饞哭了》系列文章的初衷就是要設計出一些和市面上不太一樣的控制項,給人一種耳目一新的感覺。不僅要把它設計出來,還要包括控制項各個細節的實現,最後做到好看也好用。縱觀市面上一些類似的刻度尺控制項,配色都比較單調,如果配色不當,刻度的直角就會顯得比較割眼。
  • 花裡胡哨的3D翻頁卡片,隔壁產品都饞哭了
    2.1 3D縱深效果實現方案參考為了在Android上實現3D縱深效果,可以考慮使用OpenGL進行,這樣實現的效果是細節最豐富、最擬物的,但成本也巨大,為了一個控制項使用封裝得同樣十分完善,使用者無需再用屁股思考控制項坐標計算過程,直接調用,同時搭配好對應的matrix。需要注意的是,Camera中攝像頭的位置是對準畫布左上角的。坐標系如下,是左手坐標系:
  • 饞哭隔壁小孩的彩色甜甜圈,由昆明的儲老闆拍攝
    現在甜甜圈在美國還是最為受歡迎,任何一個糕點店鋪或快餐店都有出售。從5歲兒童到75歲老人都對它有著一致的熱愛。在亞洲,甜甜圈主要是被當成點心類的食物,但在美國則有許多人以甜甜圈作為早餐的主食,甚至還設立了甜甜圈日。瑞爾可滋口味的甜甜圈是最受小孩子歡迎的。
  • Android自定義控制項 溫度旋轉按鈕
    .思路初始化一些參數繪製刻度盤繪製刻度盤下的圓弧繪製標題與溫度標識繪製旋轉按鈕繪製溫度處理滑動事件提供一些接口方法3.實現初始化一些參數public class TempControlView extends View { // 控制項寬
  • 奶香麵包新做法,不用烤箱,蓬鬆暄軟醇醇奶香,隔壁小孩都饞哭了
    奶香麵包新做法,不用烤箱,蓬鬆暄軟醇醇奶香,隔壁小孩都饞哭了我們最常見的經典小麵包,這種小麵包最受歡迎,簡單口感好,帶有濃濃的奶香味,口味是色香味俱全的一款小麵包,下午茶、早餐還是小點心都是最佳的選擇,特別是給小朋友蛋早餐搭配一杯牛奶,非常健康又營養,所以小編打算教大家自製這種小麵包,只要一個電飯鍋,準備點材料,製作起來還是非常簡單的,當然第一次可能做的不是很好
  • ASP.NET的checkbox控制項學習
    checkbox控制項是類 即classcontrol是控制項類class其中control類包含checkbox類,同樣也包含button類。總結:只要是控制項,control都包含。這中情況用foreach循環遍歷最好,首先把這幾個checkbox控制項放到一個div裡面,同時把button和textbox控制項也放在這個div裡面,設置div的id屬性是div1,runat屬性是server,這樣就是這樣的:
  • 中國科學家在南極種菜,新鮮果蔬饞哭隔壁俄羅斯站,發揮特長了!
    中國科學家在南極種菜,新鮮果蔬饞哭隔壁俄羅斯站,發揮特長了!南極是世界上最寒冷的地方,當地的環境惡劣,溫度最低可達零下89度,而在如此惡劣的極寒天氣中,中國科學家竟然種起了蔬菜,新鮮果蔬饞哭隔壁俄羅斯站,到底是怎麼回事呢?
  • 快看看這個方法,隔壁孩子都饞哭了
    快看看這個方法,隔壁孩子都饞哭了胃和心,總要有一個是滿的。所以,全世界的迷茫和憂傷都可以用美食去抵擋!更多家常美食做法,請關注有夢想的小蛋卷。喜歡我的家常美食分享就請點讚、收藏、評論、再順手轉發一下吧!當然如果您有更好的做法,歡迎留言跟大家一起分享。
  • 教你醃黃瓜妙招,清脆爽口,開胃下飯,隔壁家孩子都饞哭了
    教你醃黃瓜妙招,清脆爽口,開胃下飯,隔壁家孩子都饞哭了哈嘍大家好,生活艱辛,唯有美食不可辜負。今天分享一道簡單的美食,這種食材隨處可見,價格也比較實惠,希望大家喜歡。選這種細的比較小的黃瓜做瓜皮,不要選又粗又大的水分不容易出來,現在把它晾乾水分,放一層黃瓜,撒一層鹽均勻地擺好,放一個平底的玻璃盤壓著,這個是微波爐用的玻璃盤,上邊我換了一塊大石頭,這個石頭比一盆水中看看下邊下邊已經出水了,現在已經壓了兩個小時了,黃瓜的水分都被壓出來了。
  • 鮮嫩雞腿肉裹上麵包糠,外酥裡嫩的香辣炸雞腿隔壁小孩都饞哭了
    外皮金黃、鮮嫩多汁,饞哭隔壁小孩系列之香辣炸雞腿伴隨著我們的童年。還記得小時候一哭二鬧三上吊的非要吃肯德基、麥當勞嗎?
  • 冰冰涼涼的火龍果果凍,彈性十足,隔壁家小孩子饞哭了
    火龍果這樣做,切開後孩子饞哭了。冰冰涼涼的火龍果果凍,彈性十足,隔壁家小孩子饞哭了。好啦,美味的菜餚就可以上桌了,這道美食是不是很簡單呢,相信對於聰明的你來說一定倍輕鬆,今晚就給家人做一道,讓他們品嘗一下自己的手藝吧。
  • 自己炸薯條,做好這幾步,薯條香酥美味,隔壁家的孩子饞哭了
    自己炸薯條,做好這幾步,薯條香酥美味,隔壁家的孩子饞哭了冬天真的來了,外面寒風呼呼,只想待在溫暖的被窩不出門,此時唯一能誘惑到我們的只有美食了
  • 青菜豬肝湯,鮮嫩多汁,健康美味,隔壁家孩子都饞哭了
    青菜豬肝湯,鮮嫩多汁,健康美味,隔壁家孩子都饞哭了歡迎來到這裡,這裡是吃貨聚集的小世界。今天分享給大家的這道菜,既簡單又方便,又能很好地補充營養,在日常生活中也很常見,老人小孩皆宜,愛吃的你趕緊學起來吧。
  • 雞肉怎麼做才好吃,和咖喱一起做,隔壁老王都饞哭了
    在這個炎熱的夏季,人們因為天氣炎熱的原因食量都有所下降,那麼如何做好一道好菜來使客人們的胃口大開呢?我們知道,蓋飯作為一種常見的烹飪菜種就是將菜淋到米飯上,好多人都喜歡吃雞肉,雞肉怎麼做才好吃呢,答:和咖喱一起。咖喱的香氣搭配著雞肉的鮮香,伴著香甜可口的米飯,無疑是夏天最受歡迎的美食之一。
  • 教大家做一款超級簡單的水果糖葫蘆,聽說隔壁的小孩子都饞哭了
    近期小夥伴們是不是都憋壞了,宅家不出門為國家做貢獻、快遞停發只能刷圖片過癮,甚至外賣都不敢隨心所欲點點點,此時此刻小編的心情跟大家是一樣的,悶得久了除了家裡的飯,什麼都想吃!今天給大家帶點福利,教你如何利用家裡的水果做出好吃的冰糖葫蘆,大人小孩都喜歡吃。首先,我們可以選取的食材如下:橘子、葡萄、聖女果、草莓、獼猴桃、櫻桃…接下來我們開始製作:第一步,把選好的水果洗好串在竹籤上。
  • 大廚教你油炸小饅頭的做法,做法簡單易學,隔壁的小孩都饞哭了
    大廚教你油炸小饅頭的做法,做法簡單易學,隔壁的小孩都饞哭了。首先玻璃碗中加入400克左右的麵粉,20克白糖,4克酵母粉,3克泡打粉,打入三個母雞蛋,倒入適量的溫開水,揉成光滑不粘手的麵團,蓋上保鮮膜醒發至兩倍大。
  • 隔壁小孩都饞哭了
    隔壁小孩都饞哭了 魚是我們家餐桌上不可缺少的一種食材,我們家人都挺愛吃魚的。但說到喜歡魚,最要說的就是我爸了,我爸不僅愛吃魚,還特別喜歡釣魚!因為我爸特別喜歡釣魚,每次一去釣魚,就能釣好多的魚回家,所以我家的魚基本上是「供大於求」的。在他釣的這些魚中,我最喜歡吃的就是草魚和鯉魚,尤其是鯉魚,我最喜歡我媽用鯉魚做的蒜香魚,那味道真的是絕了!
  • 王者榮耀漫畫:百裡守約:明世隱放油鍋裡炸,隔壁小孩都饞哭了!
    #王者榮耀#相信各位小夥伴都玩過王者榮耀這個遊戲吧王者榮耀漫畫百裡玄策表示要辦了明世隱,沒想到百裡守約更殘忍,居然要將明世隱蘸上雞蛋液,故事麵包糠,放油鍋裡炸制金黃,隔壁小孩都饞哭了!王者榮耀漫畫結語哈哈哈,不愧是王者榮耀中的頂級大廚,折磨人的方式都是按做飯的方法一樣。
  • 蓮藕又出新做法,加個紫甘藍,不蒸不炸,隔壁的小孩都饞哭了
    蓮藕又出新做法,加個紫甘藍,不蒸不炸,隔壁的小孩都饞哭了。今天分享胭脂藕的做法,選擇兩頭有節的,這樣中間比較乾淨,先給他刮去外皮,改到切成薄片,開水中加入鹽,將切好的藕片放到水中,焯水兩分鐘,超熟的藕片把它撈出來,放到涼水中過一遍涼。
  • 帶娃下館子,爸爸忙著點餐,娃卻被隔壁雞腿「饞哭」,嚇壞一桌人
    網絡上有一句特別流行的話,叫做「隔壁小孩都饞哭了。」相信對於大部分小孩子來說,美食就是他們的一切。只要一見到美味的食物,他們就會連路都走不動。鄰居家的孩子白白胖胖的,整個小區都知道這家的小孩特別貪吃,寶寶經常纏著爸爸媽媽給他買吃的。