- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一些日历 View ,我想做的是为可点击的 LineairLayout 创建背景。
因此我创建了一个带有两张图片的 StateListDrawable:
到目前为止,这段代码有效:
NinePatchDrawable background = (NinePatchDrawable) context.getResources().getDrawable(R.drawable.calendar_item);
Drawable backgroundFocus = context.getResources().getDrawable(R.drawable.calendar_focus);
int stateFocused = android.R.attr.state_focused;
int statePressed = android.R.attr.state_pressed;
StateListDrawable sld = new StateListDrawable();
sld.addState(new int[]{ stateFocused, statePressed}, backgroundFocus);
sld.addState(new int[]{-stateFocused, statePressed}, backgroundFocus);
sld.addState(new int[]{-stateFocused}, background);
return sld;
但我想做一些额外的事情。我希望用户能够传递他想用来显示背景的颜色。所以背景 var 必须是可变的,但它必须基于 nine-patch drawable。
所以我想我可以做这样的事情:
background.setColorFilter(Color.RED, PorterDuff.Mode.DST_IN);
其中 Color.RED 必须替换为用户选择的颜色。
但这似乎不起作用。九色补丁创建完美,但没有应用颜色过滤器。
我还尝试了其他 PoterDuff.Mode 的:
如果您知道我做错了什么或者我还能做些什么来解决我的问题,请告诉我! :-)
氪
德克
最佳答案
我认为您不能为 StateListDrawable 中的每个 Drawable 分配 ColorFilters。原因:当 StateListDrawable 更改状态时,ColorFilter 将被删除/替换。要查看实际效果,请更改语句的顺序:
background.setColorFilter(Color.RED, PorterDuff.Mode.DST_IN);
在创建 StateListDrawable 之后出现。您会看到应用了 ColorFilter。但是,一旦状态发生变化(单击,然后释放),ColorFilter 就不再存在。
StateListDrawables 允许您设置 ColorFilter:StateListDrawable#setColorFilter(ColorFilter)
。这是提供的(或空的)ColorFilter 的使用方式:
StateListDrawable#onStateChange(int[]):
@Override
protected boolean onStateChange(int[] stateSet) {
....
if (selectDrawable(idx)) { // DrawableContainer#selectDrawable(int)
return true;
}
....
}
DrawableContainer#selectDrawable(int):
public boolean selectDrawable(int idx) {
....
if (idx >= 0 && idx < mDrawableContainerState.mNumChildren) {
Drawable d = mDrawableContainerState.mDrawables[idx];
mCurrDrawable = d;
mCurIndex = idx;
if (d != null) {
....
// So, at this stage, any ColorFilter you might have supplied
// to `d` will be replaced by the ColorFilter you
// supplied to the StateListDrawable, or `null`
// if you didn't supply any.
d.setColorFilter(mColorFilter);
....
}
} else {
....
}
}
解决方法:
如果可能的话,使用 ImageView(match_parent 用于尺寸)进行视觉交流。将您创建的 StateListDrawable 设置为 ImageView 的背景。为叠加层创建另一个 StateListDrawable:
StateListDrawable sldOverlay = new StateListDrawable();
// Match Colors with states (and ultimately, Drawables)
sldOverlay.addState(new int[] { statePressed },
new ColorDrawable(Color.TRANSPARENT));
sldOverlay.addState(new int[] { -statePressed },
new ColorDrawable(Color.parseColor("#50000000")));
// Drawable that you already have
iv1.setBackground(sld);
// Drawable that you just created
iv1.setImageDrawable(sldOverlay);
另一种可能性:使用 FrameLayout 代替 LinearLayout。 LinearLayouts 没有前景属性。
// StateListDrawable
frameLayout.setBackground(sld);
// For tint
frameLayout.setForeground(sldOverlay);
它确实涉及 overdraw ,使其成为次优解决方案/变通方法。也许你可以看看扩展 StateListDrawable 和 DrawableContainer。由于您没有为 StateListDrawable 使用 ColorFilter,您可以从覆盖的 DrawableContainer#selectDrawable(int)
中删除 d.setColorFilter(mColorFilter);
。
关于android - 带有 ColorFilter 的 Ninepatch Drawable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15359159/
我有一个业务需要在运行时创建 NinePatchDrawable 对象,也就是说,从服务器接收外部 .png 图像,它必须作为 9-patch 应用于按钮的背景(例如)。 我试图创建 NinePatc
我想在我的 Android 应用程序中添加嘈杂的背景。纹理非常完美,我可以创建一个 NinePatch 图像,但当我在应用程序中实际使用它时,它会拉伸(stretch)导致整个背景出现线条。知道实现这
我要实现这张图片 area textbox1 and textbox2 ninepatch able 我怎样才能 ninepatch 正是这个?? 最佳答案 android 9-patch 有一个限制
我正在阅读 https://github.com/libgdx/libgdx/wiki/Ninepatches 我的形象 toast_patch = new NinePatch(texture, 10
因此,我尝试使用图层列表将 map 图像与透明的 ninepatch Drawable 叠加。像这样: target http://f.cl.ly/items/2b1x3c3o0w3t1z0b2o2s
每当我尝试绘制一个 ninepatch 图像和一个舞台时,最后调用的东西正在绘制。我曾尝试使用正交相机但没有成功。我尝试过的: batch.setProjectionMatrix(camera.com
我的问题是: 我需要创建一个使用 NinePatch 创建的重新缩放的位图。 我当前的系统从 NinePatch 文件创建位图。然后将其送入 NinePatch(或 NinePatchDrawable
网络中是否有来自创建的 NinePatches 的任何中心点或集合? 我认为它们是真正花哨且有用的东西。即使你不是设计师,这也能给你带来很大的好处和外观。但我认为,如果互联网上有一些这方面的集合,那就
Android NinePatch图像似乎是带有额外信息的标准 .png 文件。是否有任何地方的格式规范,因为我希望能够在其他平台上实现它? 最佳答案 This是我在该主题上找到的最直接的链接。 关于
当我尝试以编程方式使用 9patch 背景时, 它仅在以下情况下有效:(场景 1)“拉伸(stretch)区域”(顶部/左侧)大于“内容填充区域”(底部/右侧) 但如果:(场景 2)填充比拉伸(str
网络中是否有来自创建的 NinePatches 的任何中心点或集合? 我认为它们是真正花哨且有用的东西。即使你不是设计师,这也能给你带来很大的好处和外观。但我认为,如果互联网上有一些这方面的集合,那就
我对我的 Android 应用程序有一个要求,即图形上的部分应该是可定制的,方法是从服务器端检索新的颜色和图像。其中一些图像是九 block 图像。 我找不到创建和显示这些 9-patch 图像(已通
我有一个 9 补丁可绘制的 XML 格式。当我尝试使用 BitmapFactory.decode 从中获取位图时,它返回 null 。无论如何可以从该资源获取位图吗? nine_patch.xml:
我正在使用 libgdx 制作一个简单的游戏。我有一个 TextureAtlas,它有我正在尝试使用的 ninepatch: 图片保存为menu.9.png 我正在使用以下代码: Image bg =
我正在测试使用 Stage 作为带有简单按钮的主菜单,使用 NinePatch 作为按钮背景。 设置此功能的代码如下所示: NinePatch 文本按钮设置 NinePatch btnNormal9
我需要为我的新 Android 应用程序绘制位图。由于我的内容 View 设置为我创建的 Game-Panel 类。我想通过位图显示图像。只是因为它比其他任何事情都更方便、更容易做。根据我从研究中收集
今天我试着让我的 ListView 更动态一点。所以我创建了一个白色的 ninepatch-image 并使用 .setColorFilter 方法添加了一个滤色器。那不是问题。但是在应用这个之后,每
有没有办法在 android 上以编程方式更改 9-patch 图像 (png) 的颜色?我知道如何使用位图执行此操作,但不知道如何使用 9-patch ... 感谢您帮助我。 问候吉姆 最佳答案 N
我正在创建一些日历 View ,我想做的是为可点击的 LineairLayout 创建背景。 因此我创建了一个带有两张图片的 StateListDrawable: 背景图片 按下项目时的图像 到目前为
我想从 SD 或 Assets 中读取几个 NinePatch 图像,因此没有编译,而且我找不到可以完成这项工作的构造函数/工厂。我也尝试过 NinePatch 工具源代码,但它使用图像的内部结构来完
我是一名优秀的程序员,十分优秀!