wangy 发表于 2021-7-1 08:37:32

【lua教程】HSV配色盘教程

import "android.text.method.DigitsKeyListener"
import "android.graphics.Color"
import "android.graphics.Shader$TileMode"
import "android.graphics.*"
import "android.graphics.drawable.shapes.*"
import "android.graphics.drawable.*"
import "android.graphics.Paint$Cap"

function rgb2hsv(color,hsv)
$hsv0=hsv
if not hsv
    hsv=float
end
if type(color)=="string"
    color=Color.parseColor(color)
end
Color.colorToHSV(color, hsv)
if hsv0
    return hsv
   else
    return luajava.astable(hsv)
end
end
function hsv2rgb(hsv1,hsv2)
local hsv,alpha
if hsv2
    alpha=hsv1
    hsv=hsv2
   else
    alpha=255
    hsv=hsv1
end
hsv=hsv%360
if type(hsv)=="table"
    hsv=float(hsv)
end
$color=Color.HSVToColor(alpha,hsv)
return color
end

function HSV配色盘(color0,fun)
if type(color0)=="number"
    color0=string.format("%0x",color0)
end
HSV_dialog=AlertDialog.Builder(this)
.setTitle("HSV配色盘")
if fun
    HSV_dialog.setPositiveButton("确定",{onClick=lambda s:fun("#"..HSV_input.text,s)})
   else
    HSV_dialog.setPositiveButton("复制",{onClick=function(v)
      activity.getSystemService(Context.CLIPBOARD_SERVICE).setText("#"..HSV_input.text)
      Toast.makeText(activity, "复制成功",Toast.LENGTH_SHORT).show()
      end})
end
HSV_dialog.setNegativeButton("取消",nil)
.setCancelable(false)
.setView(loadlayout{
    LinearLayout;
    padding="10dp";
    orientation="vertical";
    gravity="center";
    {
      CardView;
      CardElevation="5dp";
      layout_width="80dp";
      layout_height="80dp";
      backgroundColor=4294967295;
      layout_marginTop="8dp";
      radius="40dp";
      id="HSV_card";
    };
    {
      LinearLayout;
      gravity="center";
      layout_width="fill";
      padding="5dp";
      {
      TextView;
      textSize="18dp";
      text="#";
      backgroundColor=0;
      textColor=0xff000000;
      };
      {
      EditText;
      id="HSV_input";
      singleLine=true;
      padding=0;
      backgroundColor=0;
      hint="FFFFFF";
      textSize="18dp";
      keyListener=DigitsKeyListener.getInstance("1234567890abcdefABCDEF")
      };
    };
    {
      SeekBar;
      id="拖动H";
      layout_width="280dp";
      Max=360*2;
      layout_margin="5dp";
    };
    {
      SeekBar;
      id="拖动S";
      layout_width="280dp";
      layout_margin="5dp";
      Max=255;
    };
    {
      SeekBar;
      id="拖动V";
      layout_width="280dp";
      layout_margin="5dp";
      Max=255
    };
    {
      TextView;
      id="HSV_value";
      gravity="center";
      layout_width="fill";
      padding="5dp";
      text="H:360.0 S:255 V:255";
    };
}

)
.show()

local H,S,V=0,0,1
HSV_input.addTextChangedListener{
    onTextChanged=function(s)
      $s=tostring(s)
      if #s==6
      $n=tonumber("0xff"..s)
      if HSV_lock
          HSV_lock=nil
         else
          HSV_lock1=1
          $hsv=rgb2hsv(n)
          拖动H.Progress=tointeger(hsv*2)
          拖动S.Progress=tointeger(hsv*255)
          拖动V.Progress=tointeger(hsv*255)
          H,S,V= hsv,hsv,hsv
          刷新S()
          刷新V()
      end
      HSV_card.backgroundColor=n
      HSV_value.text="H:"..(tointeger(H*10)/10).." S:"..tointeger(S*255).." V:"..tointeger(V*255)
       elseif #s>6
      HSV_lock1=1
      HSV_lock=nil
      HSV_input.text=s:sub(-6,-1)
      end
    end
}
拖动H.post(function()
    local w,h,tab,hsv,hk,hkdx=拖动H.width,拖动H.height,{},{0,1,1},{},拖动H.Thumb
    for i=0,360*2
      hsv=i/2
      tab=hsv2rgb(hsv)
      hk=PorterDuffColorFilter(tab,PorterDuff.Mode.SRC_ATOP)
    end

    $draw=LuaDrawable(function(c,p,s)
      local w,h,pos=c.width,c.height,拖动H.Progress
      c.drawLine(0,h/2,w-(h*2)+(h/6),h/2,p)
      hkdx.setColorFilter(hk)
    end)
    拖动H.setProgressDrawable(draw);

    draw.paint
    .setDither(true)
    .setAntiAlias(true)
    .setStrokeCap(Cap.ROUND)
    .setStrokeWidth(拖动H.height/8)
    .setShadowLayer(8,0,0,0xff000000)
    .setShader(LinearGradient(0,h/2,w-(h*2)+(h/6),h/2,tab,nil,Shader.TileMode.MIRROR))

    拖动H.setOnSeekBarChangeListener{
      onProgressChanged=function()
      H=拖动H.Progress/2
      if HSV_lock1
          HSV_lock1=nil
         else
          HSV_lock=1
          HSV_input.text=string.format("%0x",hsv2rgb({H,S,V})):sub(-6,-1):upper()
      end
      end,
      onStopTrackingTouch=function()
      刷新S()
      刷新V()
      end,
    }
end)


function 刷新S()
    拖动S.post(function()
      $hkdx=拖动S.Thumb
      local w,h,tab,hsv,hk=拖动S.width,拖动S.height,{},{H,1,1},{}

      for i=0,255
      hsv=i*(1/255)
      tab=hsv2rgb(hsv)
      hk=PorterDuffColorFilter(tab,PorterDuff.Mode.SRC_ATOP)
      end

      $draw=LuaDrawable(function(c,p,s)
      local w,h,pos=c.width,c.height,拖动S.Progress
      c.drawLine(0,h/2,w-(h*2)+(h/6),h/2,p)
      hkdx.setColorFilter(hk)
      end)
      拖动S.setProgressDrawable(draw);

      draw.paint
      .setDither(true)
      .setAntiAlias(true)
      .setStrokeCap(Cap.ROUND)
      .setStrokeWidth(拖动S.height/8)
      .setShadowLayer(8,0,0,0xff000000)
      .setShader(LinearGradient(0,h/2,w-(h*2)+(h/6),h/2,tab,nil,Shader.TileMode.MIRROR))

      拖动S.setOnSeekBarChangeListener{
      onProgressChanged=function()
          S=拖动S.Progress*(1/255)
          if HSV_lock1
            HSV_lock1=nil
         else
            HSV_lock=1
            HSV_input.text=string.format("%0x",hsv2rgb({H,S,V})):sub(-6,-1):upper()
          end
      end}
    end)
end
-- 刷新S()

function 刷新V()
    拖动V.post(function()
      $hkdx=拖动V.Thumb
      local w,h,tab,hsv,hk=拖动V.width,拖动V.height,{},{H,1,1},{}

      for i=0,255
      hsv=i*(1/255)
      tab=hsv2rgb(hsv)
      hk=PorterDuffColorFilter(tab,PorterDuff.Mode.SRC_ATOP)
      end

      $draw=LuaDrawable(function(c,p,s)
      local w,h,pos=c.width,c.height,拖动V.Progress
      c.drawLine(0,h/2,w-(h*2)+(h/6),h/2,p)
      hkdx.setColorFilter(hk)
      end)
      拖动V.setProgressDrawable(draw);

      draw.paint
      .setDither(true)
      .setAntiAlias(true)
      .setStrokeCap(Cap.ROUND)
      .setStrokeWidth(拖动V.height/8)
      .setShadowLayer(8,0,0,0xff000000)
      .setShader(LinearGradient(0,h/2,w-(h*2)+(h/6),h/2,tab,nil,Shader.TileMode.MIRROR))

      拖动V.setOnSeekBarChangeListener{
      onProgressChanged=function()
          V=拖动V.Progress*(1/255)
          if HSV_lock1
            HSV_lock1=nil
         else
            HSV_lock=1
            HSV_input.text=string.format("%0x",hsv2rgb({H,S,V})):sub(-6,-1):upper()
          end
      end}
    end)
end
--刷新V()

HSV_input.text=(color0 or "FFFFFF"):upper():sub(-6,-1)
end







activity.setTheme(android.R.style.Theme_Material_Light_DarkActionBar)

--HSV配色盘()--弹出配色盘,默认白色,点击复制
--HSV配色盘("#00ff00")--弹出对话框,颜色代码,默认点击复制
HSV配色盘(0xFFA774FF,function(颜色,对话框)--弹出对话框,颜色代码,设置点击事件
print("你选择了",颜色,"颜色")
end)
页: [1]
查看完整版本: 【lua教程】HSV配色盘教程