ImageView setColorFilter alpha丢失

时间:2018-07-18 17:48:48

标签: android colors imageview colorfilter

我在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()应用颜色。

这是怎么回事,我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:1)

在撰写此问题时,我尝试了一些事情,然后亲自解决了这个问题。

问题是,根据矢量xml,图标本身为黑色(PorterDuff.Mode.SRC_ATOP)。 Android Studio仅用白色为其着色。

使用#FF000000,因此源像素和目标像素(均为黑色)的混合不会导致可见变化。为了完全替换原始图标的颜色,我改用PorterDuff.Mode.SRC_ATOP。在这种情况下,我可以在两种模式下使用相同的向量xml。

根据官方文档

  

PorterDuff.Mode.SRC_ATOP-保留源像素未覆盖的目标像素。丢弃源像素覆盖的目标像素。舍弃所有源像素。

     

PorterDuff.Mode.SRC_IN-保留覆盖目标像素的源像素,丢弃其余的源像素和目标像素。