gpt4 book ai didi

android - 触摸时可绘制的色调/暗淡

转载 作者:IT老高 更新时间:2023-10-28 23:30:08 26 4
gpt4 key购买 nike

我目前正在开发的应用程序使用很多 ImageViews 作为按钮。这些按钮上的图形使用 Alpha channel 淡出按钮的边缘,使它们看起来不规则。目前,我们必须为每个按钮生成 2 个图形(1 个用于选中/聚焦/按下状态,另一个用于默认未选中状态)并为每个按钮使用 XML 文件中定义的 StateListDrawable。

虽然这工作得很好,但似乎非常浪费,因为所有选定的图形都是未选定按钮的简单着色版本。这些需要时间来生成(尽管很少)并在最终 APK 中占用空间。似乎应该有一种简单的自动方法。

看起来,完美的解决方案是为每个按钮使用 ImageViews,并在其 tint 属性中指定一个 ColorStateList。这种方法的优点是所有按钮(共享相同的色调)只需要一个 XML ColorStateList。但是它不起作用。如前所述here ,当提供给 tint 的值不是单一颜色时,ImageView 会抛出 NumberFormatException。

我的下一个尝试是对选定的可绘制对象使用 LayerDrawable。在图层列表中,我们将在堆栈底部的原始图像被一个半透明的矩形覆盖。这适用于按钮图形的实体部分。然而,本应完全透明的边缘现在与顶层颜色相同。

以前有没有人遇到过这个问题并找到了合理的解决方案?我想坚持使用 XML 方法,但可能会编写一个简单的 ImageView 子类,该子类将在代码中进行所需的着色。

最佳答案

对于那些遇到类似需求的人,用代码解决这个问题是相当干净的。这是一个示例:

public class TintableButton extends ImageView {

private boolean mIsSelected;

public TintableButton(Context context) {
super(context);
init();
}

public TintableButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}

public TintableButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}

private void init() {
mIsSelected = false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN && !mIsSelected) {
setColorFilter(0x99000000);
mIsSelected = true;
} else if (event.getAction() == MotionEvent.ACTION_UP && mIsSelected) {
setColorFilter(Color.TRANSPARENT);
mIsSelected = false;
}

return super.onTouchEvent(event);
}
}

它尚未完成,但作为概念证明效果很好。

关于android - 触摸时可绘制的色调/暗淡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8034494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com