package com.polyak.iconswitch;
import com.polyak.iconswitch.attrs.IswAttrSet;
import com.polyak.iconswitch.utils.AttrUtils;
import com.polyak.iconswitch.utils.DeviceUtils;
import ohos.agp.animation.Animator;
import ohos.agp.animation.AnimatorValue;
import ohos.agp.colors.RgbColor;
import ohos.agp.components.AttrSet;
import ohos.agp.components.Component;
import ohos.agp.components.ComponentContainer;
import ohos.agp.components.element.ShapeElement;
import ohos.agp.components.element.VectorElement;
import ohos.agp.render.Canvas;
import ohos.agp.render.Paint;
import ohos.agp.render.PixelMapHolder;
import ohos.agp.utils.Color;
import ohos.agp.utils.Point;
import ohos.agp.utils.RectFloat;
import ohos.app.Context;
import ohos.media.image.PixelMap;
import ohos.multimodalinput.event.TouchEvent;
import java.math.BigDecimal;
import java.util.Locale;
/**
* IconSwitch主要实现类
*/
public final class IconSwitch extends ComponentContainer implements
Component.DrawTask,
Component.EstimateSizeListener,
Component.TouchEventListener {
private static final int MIN_ICON_SIZE_VP = 12;
private static final int DEFAULT_IMAGE_SIZE_VP = 18;
private int switchWidth;
private int switchHeight;
private int iconSize;
private int iconTop;
private int iconBottom;
private int iconOffset;
private int thumbColorLeft;
private int thumbColorRight;
private int thumbDiameter;
private PixelMapHolder leftHolder;
private PixelMapHolder rightHolder;
private PixelMapHolder leftHolderInactive;
private PixelMapHolder rightHolderInactive;
private VectorElement leftVector;
private VectorElement rightVector;
private VectorElement leftVectorInactive;
private VectorElement rightVectorInactive;
private Paint bgPaint;
private RectFloat bgRF;
private float bgRadius;
private Paint thumbPaint;
private Point thumbPoint;
private float thumbRadius;
private Paint iconPaint;
private RectFloat iconLeftRF;
private RectFloat iconRightRF;
private boolean moving = false;
private float touchLastX;
private Checked currentChecked;
private CheckedChangeListener listener;
public IconSwitch(Context context) {
super(context);
init(null);
}
public IconSwitch(Context context, AttrSet attrSet) {
super(context, attrSet);
init(attrSet);
}
public IconSwitch(Context context, AttrSet attrSet, String styleName) {
super(context, attrSet, styleName);
init(attrSet);
}
/**
* 初始化操作
*
* @param attrs attrs
*/
private void init(AttrSet attrs) {
initSwitchView();
ShapeElement shape = new ShapeElement();
shape.setRgbColor(RgbColor.fromArgbInt(getContext().getColor(ResourceTable.Color_transparent)));
setBackground(shape);
iconSize = DeviceUtils.vpToPx(getContext(), DEFAULT_IMAGE_SIZE_VP);
initAttr(attrs);
if (leftVector != null) {
leftVector.setAntiAlias(true);
}
if (rightVector != null) {
rightVector.setAntiAlias(true);
}
if (leftVectorInactive != null) {
leftVectorInactive.setAntiAlias(true);
}
if (rightVectorInactive != null) {
rightVectorInactive.setAntiAlias(true);
}
thumbPaint.setColor(new Color(currentChecked == Checked.LEFT ? thumbColorLeft : thumbColorRight));
calculateSwitchDimensions();
addDrawTask(this);
setEstimateSizeListener(this);
setTouchEventListener(this);
}
private void initAttr(AttrSet attrs) {
int colorDefBackground = getContext().getColor(ResourceTable.Color_isw_defaultBg);
String checked = Checked.LEFT.name();
PixelMap leftMap = null;
PixelMap leftMapInactive = null;
PixelMap rightMap = null;
PixelMap rightMapInactive = null;
if (attrs != null) {
iconSize = AttrUtils.getInteger(attrs, IswAttrSet.ISW_ICON_SIZE, iconSize);
leftMap = AttrUtils.getPixelMap(attrs, IswAttrSet.ISW_ICON_LEFT);
rightMap = AttrUtils.getPixelMap(attrs, IswAttrSet.ISW_ICON_RIGHT);
leftMapInactive = AttrUtils.getPixelMap(attrs, IswAttrSet.ISW_ICON_LEFT_INACTIVE);
rightMapInactive = AttrUtils.getPixelMap(attrs, IswAttrSet.ISW_ICON_RIGHT_INACTIVE);
leftVector = AttrUtils.getVector(attrs, IswAttrSet.ISW_ICON_LEFT);
rightVector = AttrUtils.getVector(attrs, IswAttrSet.ISW_ICON_RIGHT);
leftVectorInactive = AttrUtils.getVector(attrs, IswAttrSet.ISW_ICON_LEFT_INACTIVE);
rightVectorInactive = AttrUtils.getVector(attrs, IswAttrSet.ISW_ICON_RIGHT_INACTIVE);
int colorDefThumb = getContext().getColor(ResourceTable.Color_colorAccent);
colorDefBackground = AttrUtils.getColor(attrs, IswAttrSet.ISW_BACKGROUND_COLOR, colorDefBackground);
thumbColorLeft = AttrUtils.getColor(attrs, IswAttrSet.ISW_THUMB_COLOR_LEFT, colorDefThumb);
thumbColorRight = AttrUtils.getColor(attrs, IswAttrSet.ISW_THUMB_COLOR_RIGHT, colorDefThumb);
checked = AttrUtils.getString(attrs, IswAttrSet.ISW_DEFAULT_SELECTION, checked);
}
if (leftMap != null) {
leftHolder = new PixelMapHolder(leftMap);
}
if (rightMap != null) {
rightHolder = new PixelMapHolder(rightMap);
}
if (leftMapInactive != null) {
leftHolderInactive = new PixelMapHolder(leftMapInactive);
}
if (rightMapInactive != null) {
rightHolderInactive = new PixelMapHolder(rightMapInactive);
}
bgPaint.setColor(new Color(colorDefBackground));
if (checked.toUpperCase(Locale.getDefault()).equals(Checked.RIGHT.name())) {
currentChecked = Checked.RIGHT;
} else {
currentChecked = Checked.LEFT;
}
}
private void initSwitchView() {
bgPaint = new Paint();
bgPaint.setAntiAlias(true);
bgRF = new RectFloat();
thumbPaint = new Paint();
thumbPaint.setAntiAlias(true);
thumbPoint = new Point();
iconPaint = new Paint();
iconPaint.setAntiAlias(true);
iconLeftRF = new RectFloat();
iconRightRF = new RectFloat();
}
private void calculateSwitchDimensions() {
iconSize = Math.max(iconSize, DeviceUtils.vpToPx(getContext(), MIN_ICON_SIZE_VP));
switchWidth = BigDecimal.valueOf(iconSize)
.multiply(BigDecimal.valueOf(4)).intValue();
switchHeight = Math.round(BigDecimal.valueOf(iconSize)
.multiply(BigDecimal.valueOf(2f)).floatValue());
iconOffset = Math.round(BigDecimal.valueOf(iconSize)
.multiply(BigDecimal.valueOf(0.8f)).floatValue());
iconTop = BigDecimal.valueOf(switchHeight)
.subtract(BigDecimal.valueOf(iconSize))
.divide(BigDecimal.valueOf(2), BigDecimal.ROUND_HALF_UP).intValue();
iconBottom = BigDecimal.valueOf(iconTop).add(BigDecimal.valueOf(iconSize)).intValue();
thumbDiameter = switchHeight;
}
@Override
public boolean onEstimateSize(int widthEstimateConfig, int heightEstimateConfig) {
int overshootPadding = Math.round(BigDecimal.valueOf(thumbDiameter)
.multiply(BigDecimal.valueOf(0.1f)).floatValue());
int defW = BigDecimal.valueOf(overshootPadding)
.multiply(BigDecimal.valueOf(2))
.add(BigDecimal.valueOf(switchWidth)).intValue();
int width = getSize(widthEstimateConfig, defW);
int height = getSize(heightEstimateConfig, switchHeight);
measureBgSize(iconSize, width, height);
measureIconSize(width, height);
setEstimatedSize(
EstimateSpec.getChildSizeWithMode(width, width, EstimateSpec.NOT_EXCEED),
EstimateSp
没有合适的资源?快使用搜索试试~ 我知道了~
自定义Switch小部件
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共46个文件
java:12个
xml:7个
json:6个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 5 0 下载量 169 浏览量
2024-05-01
10:04:12
上传
评论
收藏 107KB ZIP 举报
温馨提示
自定义Switch小部件
资源推荐
资源详情
资源评论
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/JAR.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PNG.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 46 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/de50ac10e30e41b89db28203f97239be_qq_41701956.jpg!1)
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6823
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)