我在private Circle circle;
// gradient with yellow in the center and black on the border
private final static RadialGradient GRADIENT = new RadialGradient(0, 0, 0.5, 0.5, 0.5, true, CycleMethod.NO_CYCLE, new Stop(0, Color.YELLOW), new Stop(1, Color.BLACK));
private void newCircle(Pane container) {
circle = new Circle(50, GRADIENT);
circle.setBlendMode(BlendMode.LIGHTEN);
circle.setManaged(false);
container.getChildren().add(circle);
}
private void setCirclePosition(MouseEvent event) {
circle.setCenterX(event.getX());
circle.setCenterY(event.getY());
}
@Override
public void start(Stage primaryStage) {
Image image = new Image(imageURL);
ImageView imageView = new ImageView(image);
Pane mask = new Pane();
mask.setBlendMode(BlendMode.MULTIPLY);
mask.setStyle("-fx-background-color: black;");
mask.setOnMouseMoved(this::setCirclePosition); // move cricle with mouse
newCircle(mask);
// create new circle on mouse click
mask.setOnMouseClicked(evt -> {
newCircle(mask);
setCirclePosition(evt);
});
StackPane root = new StackPane(imageView, mask);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
上遇到了麻烦。在我的应用中,我有深色模式(黑色背景,白色文本)和浅色模式(白色背景,黑色文本)。
Targeting API 21+,我使用的是由Android Studio生成的矢量资产图标,该图标为白色,默认情况下在xml文件中为imageView.setColorFilter()
和android:tint="#FFFFFF"
。
根据material design,图标具有适用于不同状态的特定字母。我正在使用状态android:fillColor="#FF000000"
,其中黑色图标= Active + Unfocused
和白色图标= #8A000000
。
在黑暗模式下,图标在黑色背景上将显示为灰色,这与应用Alpha时的情况完全相同。但是,在灯光模式下,无论上面的alpha值如何,图标都是100%黑色。我正在使用#B3FFFFFF
和默认的imageView.setColorFilter()
应用颜色。
这是怎么回事,我该如何解决?谢谢。
答案 0 :(得分:1)
在撰写此问题时,我尝试了一些事情,然后亲自解决了这个问题。
问题是,根据矢量xml,图标本身为黑色(PorterDuff.Mode.SRC_ATOP
)。 Android Studio仅用白色为其着色。
使用#FF000000
,因此源像素和目标像素(均为黑色)的混合不会导致可见变化。为了完全替换原始图标的颜色,我改用PorterDuff.Mode.SRC_ATOP
。在这种情况下,我可以在两种模式下使用相同的向量xml。
根据官方文档
PorterDuff.Mode.SRC_ATOP-保留源像素未覆盖的目标像素。丢弃源像素覆盖的目标像素。舍弃所有源像素。
PorterDuff.Mode.SRC_IN-保留覆盖目标像素的源像素,丢弃其余的源像素和目标像素。