autojs通用拾色器

牙叔教程 簡單易懂

效果展示

01-整體效果.gif

拾色器采用的是HSL顏色模型, 可以控制顏色的亮度和飽和度


02-飽和度和亮度.gif

同時還可以控制顏色的透明度


03-透明度.gif

拾色器返回的數(shù)據(jù)如下


04-返回的數(shù)據(jù).jpg

環(huán)境

手機: Mi 11 Pro

Android版本: 12

Autojs版本: 9.1.6

踩坑

一開始我用的是dialog, 可是寬高修改不了, 所以后來改成了PopupWindow

目的

我要用顏色選擇器的時候, 沒找到輪子, 所以就寫了這個拾色器;

把它做成通用的模塊, 讓所有人都可以輕松的選擇顏色

接口

ui.showColorPicker.on("click", () => {
  colorPicker.show().then((color) => {
    let result = "您選擇的顏色是:\n" + color;
    log("result = " + result);
    ui.info.text(result);
  });
});

使用模塊的show方法, 就可以顯示拾色器, 點擊拾色器右下角的確定, 就會返回顏色數(shù)據(jù);

大家可以看到, 這里使用了then, 也就是說show方法返回的是一個promise;

為什么選擇promise

當拾色器顯示出來后, 你要花幾秒鐘選擇顏色, 然后點擊確定, 返回顏色;

不一定非要用promise, 但我覺得目前他是最合適的;

如果你用本地存儲, 廣播, 全局變量,都可以實現(xiàn), 但我覺得都會喪失這個拾色器模塊的獨立性

界面設(shè)計

我先畫了一個簡單的草稿


05-草稿.jpg

然后, 我要把它做成一個所有手機上, 視覺上都一樣的效果, 因此我使用了

layout_width="0dp" layout_weight="1"

寬高按照一定的比例來展示, 這樣所有手機看上去就都一樣了.

模塊設(shè)計

模塊有2個文件

colorPicker.js
CustomView.js

colorPicke負責展示一個自定義控件, 并且返回一個promise;

CustomView負責自定義控件的各種細節(jié).

依賴圖如下


06-依賴圖.jpg

可以看到還有一個縱向的滑塊VerticalSeekBar, 這是為了貼近HSL顏色模型;

所以把seekbar改成了縱向;

從HSL模型中, 可以看到, 飽和度是橫向的, 亮度就是縱向的:


06-hsl模型.png

界面細節(jié)

色輪

<View id="hueControlView"></View>

繪制View的前景或者背景, 都可以
setForeground
setBackgroundDrawable

  var drawable = new android.graphics.drawable.Drawable({
    draw: function (canvas) {
      drawCircleGrid(canvas);
      canvas.drawCircle(centerX, centerY, radius, colorWheelPaint);
      drawSmallCircle(canvas, centerX, centerY, roadLength, roadAngle, smallCirclePaint);
    },
  });
  // view.setBackgroundDrawable(drawable);
  view.setForeground(drawable);

同時還要繪制小圓, 以及灰白格子, 畫筆設(shè)置了一個SweepGradientShader

確定按鈕

他的主要功能是顯示當前手指觸摸的顏色, 同時兼職確定按鈕的功能, 返回顏色;

他要繪制三個東西: 灰白格子, 當前顏色, 確定兩個字

灰白格子

是為了顯示顏色的透明效果

顏色數(shù)據(jù)

所有的顏色數(shù)據(jù)都基于HSL, 包括rgb也是由HSL轉(zhuǎn)換的

colorPicker.getArgbColor = function () {
  let hsl = colorPicker.getHslColor();
  let color = ColorUtils.HSLToColor(hsl);
  let alpha = parseInt(colorPicker.hsla.alpha * 255);
  color = ColorUtils.setAlphaComponent(color, alpha);
  return color;
};

透明度是獨立的, 先得到顏色之后, 再添加顏色的透明度;

顏色范圍

hsla

h:0-360, s:0-1, l:0-1, a:0-1

argb

a:0-255, r:0-255, g:0-255,  b:0-255

觸摸事件

在觸摸事件中, 我們要修改小圓的位置, 以及右下角確定按鈕的顏色;

  hueControlView.setOnTouchListener(function (v, event) {
    let x = event.getX();
    let y = event.getY();
    let distance = Math.sqrt(Math.pow(x - centerX, 2) + Math.pow(y - centerY, 2));
    if (distance > radius - colorPicker.smallCircleRadius) {
      distance = radius - colorPicker.smallCircleRadius;
    }
    let angle = Math.atan2(centerY - y, x - centerX); // angle是弧度
    updateHslData(angle);
    colorPicker.roadAngle = angle;
    colorPicker.roadLength = distance;
    refreshAllData(view);
    return true;
  });

所有的代碼 都盡量封裝成函數(shù), 方便復用;

在修改小圓位置的時候, 我們會計算他和中心的距離, 不讓他超過色輪的半徑;

同時我們在觸摸事件中, 要修改hsl中的色相h的值

三個滑塊

分別控制顏色的飽和度, 亮度, 和透明度,

左下角數(shù)據(jù)展示區(qū)

依序展示當前顏色的hsla和argb的值

相關(guān)教程

autojs自定義控件色輪

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文檔, autojs文檔, 最后才是群里問問
--- 牙叔教程

聲明

部分內(nèi)容來自網(wǎng)絡(luò)
本教程僅用于學習, 禁止用于其他用途

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辈毯,一起剝皮案震驚了整個濱河市刽脖,隨后出現(xiàn)的幾起案子讥此,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡句旱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門晰奖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谈撒,“玉大人,你說我怎么就攤上這事匾南】心洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長溯乒。 經(jīng)常有香客問我夹厌,道長,這世上最難降的妖魔是什么裆悄? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任矛纹,我火速辦了婚禮,結(jié)果婚禮上光稼,老公的妹妹穿的比我還像新娘或南。我一直安慰自己,他們只是感情好钟哥,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布迎献。 她就那樣靜靜地躺著,像睡著了一般腻贰。 火紅的嫁衣襯著肌膚如雪吁恍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天播演,我揣著相機與錄音冀瓦,去河邊找鬼。 笑死写烤,一個胖子當著我的面吹牛翼闽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洲炊,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼感局,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暂衡?” 一聲冷哼從身側(cè)響起询微,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狂巢,沒想到半個月后撑毛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡唧领,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年藻雌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩个。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡胯杭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出受啥,到底是詐尸還是另有隱情歉摧,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布腔呜,位于F島的核電站叁温,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏核畴。R本人自食惡果不足惜膝但,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谤草。 院中可真熱鬧跟束,春花似錦、人聲如沸丑孩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽温学。三九已至略贮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仗岖,已是汗流浹背逃延。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轧拄,地道東北人揽祥。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像檩电,于是被迫代替她去往敵國和親拄丰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

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