autojs自定义控件色轮

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


效果展示


缘起


你想要比别人的界面更漂亮吗?


你想要做自己专用的色彩工具吗?


想要自己的专属功能, 深度定制,


自定义控件可以满足你的要求,


比被人的更好看, 功能更多,


想学习自定义控件的人, 不可错过本教程.


环境


手机: Mi 11 Pro


Android版本: 11


Autojs版本: 9.0.10


你将学到以下知识点


  • 定制自己的色轮
  • 控件的触摸监听
  • 控件触摸动画
  • 多控件联动
  • 色块的数量调整
  • 滑块的使用
  • 定义不可滚动的viewpager
  • RecyclerView的使用
  • 获取控件的bitmap
  • RGB与HSL互相转换
  • 设置控件背景的另类方法
  • 判断触摸区域是否处于某控件区域内
  • 字符串按数量分组
  • bitmap转img


思路


  1. 界面展现出来的时候, 要显示色轮, 还要显示色卡
  2. 色卡的颜色是手指触摸的坐标对应的颜色
  3. 获取颜色必须有图片, 也就是色轮控件对应的图片
  4. 色轮的颜色, 可以由滑块调整饱和度和亮度来决定
  5. 色轮颜色发生变化的时候, 要及时更新色轮对应的bitmap
  6. 手指移动后, 获取颜色, 然后同步更新到色卡上
  7. 图片更新后, 要及时回收旧图片


代码讲解


1. ui界面
ui.layout(
  <non-swipeable-view-pager id="viewpager">
    <vertical gravity="center">
      <text id="title2" textSize="33sp" marginBottom="6" textColor="#fbfbfe" bg="#00afff" w="*" gravity="center">
        牙叔教程
      </text>
      <color-wheel id="customView"></color-wheel>
      <frame w="100dp" h="100dp">
        <View id="colorShow" w="100dp" h="100dp" bg="#000000"></View>
        <text id="colorValue" textSize="16sp" textColor="#ffffff" w="*" gravity="center" padding="3"></text>
      </frame>
      ...
    </vertical>
    <vertical>
      <vertical gravity="center">
        <text textSize="33sp" marginBottom="6" textColor="#fbfbfe" bg="#00afff" w="*" gravity="center">
          牙叔教程
        </text>
        <color-wheel id="customView2" colorCount="6"></color-wheel>
        <androidx.recyclerview.widget.RecyclerView
          id="recyclerView"
          w="300dp"
          h="350dp"
        ></androidx.recyclerview.widget.RecyclerView>
        <horizontal w="*" margin="9">
          <text>饱和度: </text>
          <text id="saturationValue2"></text>
          <seekbar id="saturationSeekbar2" max="100" progress="100" w="*" margin="9"></seekbar>
        </horizontal>
    ...
      </vertical>
    </vertical>
  </non-swipeable-view-pager>
);


2. 设置viewpager展示页面
ui.viewpager.setCurrentItem(pagerNum);


3. 界面显示后, 更新色卡
ui.post(function () {
  let colorCount = ui.customView2.widget.getColorCount();
  colorValueList = ui.customView2.widget.getColorValueList();
  changeColorShowViews(colorCount, colorValueList);
}, 30);


4. 滑块修改饱和度
ui.saturationSeekbar2.setOnSeekBarChangeListener(
  new android.widget.SeekBar.OnSeekBarChangeListener({
    onProgressChanged: function (seekbar, i, b) {
      let value = +(ui.saturationSeekbar2.getProgress() / 100).toFixed(2);
      ui.saturationValue2.setText(String(value));
      ui.customView2.widget.setSaturation(value);
      ui.customView2.widget.updateBitmap();
      colorAction2();
    },
  })
);


5. 滑块修改亮度
ui.lightnessSeekbar2.setOnSeekBarChangeListener(
  new android.widget.SeekBar.OnSeekBarChangeListener({
    onProgressChanged: function (seekbar, i, b) {
      let value = +(ui.lightnessSeekbar2.getProgress() / 100).toFixed(2);
      ui.lightnessValue2.setText(String(value));
      ui.customView2.widget.setLightness(value);
      ui.customView2.widget.updateBitmap();
      colorAction2();
    },
  })
);


6. 滑块修改颜色数量
ui.colorCountSeekbar.setOnSeekBarChangeListener(
  new android.widget.SeekBar.OnSeekBarChangeListener({
    onStopTrackingTouch: function (seekbar) {
      let value = +(ui.colorCountSeekbar.getProgress() / 10).toFixed(0);
      ui.colorCountValue.setText(String(value));
      ui.customView2.widget.setColorCount(value);
      ui.post(function () {
        colorValueList = ui.customView2.widget.getColorValueList();
        changeColorShowViews(value, colorValueList);
      });
    },
  })
);


7. 色块的adapter
function createBoxAdapter(boxList) {
  return RecyclerView.Adapter({
    onCreateViewHolder: function (parent, viewType) {
      // 视图创建
      let view;
      let holder;
      view = ui.inflate(boxXml, parent, false);
      holder = JavaAdapter(RecyclerView.ViewHolder, {}, view);
      view.bgColor.click(function () {
        toastLog(view.colorValue.getText().toString().replace(/\n/g, ""));
      });
      return holder;
    },
    onBindViewHolder: function (holder, position) {
      // 数据绑定
      let value = boxList[position];
      holder.itemView.bgColor.setBackgroundColor(value);
      value = colors.toString(value);
      value = group(value.slice(1), 2).join("\n");
      holder.itemView.colorValue.setText("#\n" + value);
    },
    getItemCount: function () {
      return boxList.length;
    },
  });
}


8. 色块的xml
let boxXml = (
  <card cardCornerRadius="6dp" margin="3">
    <frame layout_width="wrap_content" layout_height="wrap_content" gravity="center">
      <View id="bgColor" w="60dp" bg="#000000"></View>
      <text
        id="colorValue"
        layout_height="wrap_content"
        layout_width="wrap_content"
        text="#000000"
        textSize="16sp"
        textColor="#ffffff"
        padding="3"
      ></text>
    </frame>
  </card>
);


名人名言


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


声明


部分内容来自网络
本教程仅用于学习, 禁止用于其他用途



相关文章
|
Android开发
autojs下拉刷新
牙叔教程 简单易懂
985 0
|
Android开发
autojs单选按钮
牙叔教程 简单易懂
452 0
|
Android开发
侧滑菜单的简单使用
本节给大家带来基础UI控件部分的最后一个控件:DrawerLayout,官方给我们提供的一个侧滑菜单控件,和上一节的ViewPager一样,3.0以后引入,低版本使用它,需要v4兼容包,说到侧滑,相信很多人都用过github上的SlidingMenu,不过好像有两个版本,一个是单独的,另一个需要依赖另一个开源项目:ActionBarSherlock;既然Google为我们提供了这个控件,为何不用咧,而且在Material Design设计规范中,随处可见的很多侧滑菜单的动画效果,大都可以通过Toolbar +DrawerLayout来实现。
|
iOS开发
IOS的UITableView控件简单使用
IOS的UITableView控件简单使用
165 0
|
XML Java Android开发
autojs自定义控件-导航栏
目前自定义控件可以控制的属性: ● 颜色 ● 宽度 ● 图片宽高 ● 绑定viewpager recyclerview的高度是由 文字 + 图片 控制的, 所以就不用设置recyclerview的高度
720 0
|
前端开发
autojs优秀UI-自定义控件
牙叔教程 简单易懂
919 0
|
算法 Android开发 Kotlin
Android自定义控件 | 源码里有宝藏之自动换行控件
回想一下在作文本上写作的场景,当从左到右写满一行后,会切换到下一行的开头继续写。如果把“作文本”比作容器控件,把“字”比作子控件。Android 原生控件中没有能“自动换行”的容器控件。
383 0
|
前端开发 Android开发
autojs自定义控件-移动背景
我们把背景看成一个小球, 小球可以在某个空间内自由移动, 他需要一个目标的坐标信息, 然后需要一个从当前的起点, 到目标点的移动规则, 小球也可以在移动的时候变换形态, 比如圆形, 椭圆, 圆角矩形等
14542 0
|
Android开发
autojs一键换肤
牙叔教程 简单易懂
159 0
|
Android开发
autojs进度条
牙叔教程 简单易懂
585 0