avatar
问JavaFX的一个问题# Java - 爪哇娇娃
b*i
1
我有两个Canvas,重叠显示。上面的透明部分可以让下面的透出来。
我现在要动态修改上方的,让原来不透明的一些点或者线变透明,怎么办?我知道如何
画有颜色的线,如下。但是画无色的线没有成功过。能否指点一二?
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.strokeLine(x0, y0, x1, y1);// randome numbers
avatar
b*i
3
说个具体的吧。两个Canvas,上面的全黑,所以下面的不可见。现在需要在Canvas中间
打开一个扇形区域,让其透明,其实角度0,终止在60度,半径100个点。咋做?
你给的链接应该是填充一个矩形区域,我的目标是不规则区域,其实就是任意点,线,
和图形。

【在 z****e 的大作中提到】
: http://docs.oracle.com/javafx/2/api/javafx/scene/paint/LinearGr
avatar
z*e
4
填充跟图形本身无关
你可以用来填充线或者圆形或者你想要什么图形都可以
问题在于,你如何画出这个图形来
如果是不规则的多边形
用polygon应该就可以了
以下是shape的实现类列表,找你喜欢的
Arc, Circle, CubicCurve, Ellipse, Line, Path, Polygon, Polyline, QuadCurve,
Rectangle, SVGPath, Text
avatar
z*e
5
public abstract class Shape
extends Node
The Shape class provides definitions of common properties for objects that
represent some form of geometric shape. These properties include:
The Paint to be applied to the fillable interior of the shape (see setFill).
The Paint to be applied to stroke the outline of the shape (see setStroke).
The decorative properties of the stroke, including:
The width of the border stroke.
Whether the border is drawn as an exterior padding to the edges of the shape
, as an interior edging that follows the inside of the border, or as a wide
path that follows along the border straddling it equally both inside and
outside (see StrokeType).
Decoration styles for the joins between path segments and the unclosed ends
of paths.
Dashing attributes.
avatar
b*i
6
如何把填充变成透明的?
如下代码在 new KeyFrame(Config.ANIMATION_TIME, new EventHandler
() {
public void handle(ActionEvent event) {
...
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.strokeLine(x0, y0, x1, y1);
gc.setStroke(Color.rgb(255,255,255,0));
gc.strokeLine(x0+1, y0, x1+1, y1);
目的很简单,我画5点粗的线,然后设定为透明,重画一遍,但是移动一下,要替代掉
原来线段的大部分。可是结果是没有抹掉,线条还是原来那么粗。

,

【在 z****e 的大作中提到】
: 填充跟图形本身无关
: 你可以用来填充线或者圆形或者你想要什么图形都可以
: 问题在于,你如何画出这个图形来
: 如果是不规则的多边形
: 用polygon应该就可以了
: 以下是shape的实现类列表,找你喜欢的
: Arc, Circle, CubicCurve, Ellipse, Line, Path, Polygon, Polyline, QuadCurve,
: Rectangle, SVGPath, Text

avatar
z*e
7
试试setFill
透明色直接用Color.TRANSPARENT
http://docs.oracle.com/javafx/2/api/javafx/scene/paint/Color.ht
我不是很看得明白你的代码,gc是什么?
能不能把代码贴全一点?

ActionEvent>

【在 b***i 的大作中提到】
: 如何把填充变成透明的?
: 如下代码在 new KeyFrame(Config.ANIMATION_TIME, new EventHandler
: () {
: public void handle(ActionEvent event) {
: ...
: gc.setStroke(Color.BLUE);
: gc.setLineWidth(5);
: gc.strokeLine(x0, y0, x1, y1);
: gc.setStroke(Color.rgb(255,255,255,0));
: gc.strokeLine(x0+1, y0, x1+1, y1);

avatar
b*i
8
GraphicsContext gc = canvas.getGraphicsContext2D();
以Brick为模板,在initTimeline()里面
KeyFrame kf = new KeyFrame(Config.ANIMATION_TIME, new EventHandler<
ActionEvent>() {
public void handle(ActionEvent event) {
加入
GraphicsContext gc = canvas.getGraphicsContext2D();
int x0=random.nextInt(Config.SCREEN_WIDTH);
int y0=random.nextInt(Config.SCREEN_HEIGHT);
int x1=random.nextInt(Config.SCREEN_WIDTH);
int y1=random.nextInt(Config.SCREEN_HEIGHT);
gc.setStroke(Color.BLUE);
gc.setLineWidth(5);
gc.setFill(Color.BLUE);
gc.fillRect(x0, y0, 40, 40);
gc.setStroke(Color.TRANSPARENT);
gc.setFill(Color.TRANSPARENT);
gc.fillRect(x0+20, y0+20, 20, 20);
无法实现抠去一角的正方形
目的是
XXXXXXX
XXXXXXX
XXXX
XXXX

【在 z****e 的大作中提到】
: 试试setFill
: 透明色直接用Color.TRANSPARENT
: http://docs.oracle.com/javafx/2/api/javafx/scene/paint/Color.ht
: 我不是很看得明白你的代码,gc是什么?
: 能不能把代码贴全一点?
:
: ActionEvent>

avatar
z*e
9
canvas啊
canvas你要自己处理脏数据
可能需要你介入repaint等方法去重新刷新整个页面
这个我没有怎么用过
以前javafx是不支持canvas的
后来新增的
我建议你这样
直接用shape下面的实现类
line或者polygone这些
然后直接setfill或者setstroke就好了

【在 b***i 的大作中提到】
: GraphicsContext gc = canvas.getGraphicsContext2D();
: 以Brick为模板,在initTimeline()里面
: KeyFrame kf = new KeyFrame(Config.ANIMATION_TIME, new EventHandler<
: ActionEvent>() {
: public void handle(ActionEvent event) {
: 加入
: GraphicsContext gc = canvas.getGraphicsContext2D();
: int x0=random.nextInt(Config.SCREEN_WIDTH);
: int y0=random.nextInt(Config.SCREEN_HEIGHT);
: int x1=random.nextInt(Config.SCREEN_WIDTH);

avatar
b*i
10
不用repaint的。因为可以继续画上有颜色的方块,就是无法把任何地方变成透明的。

【在 z****e 的大作中提到】
: canvas啊
: canvas你要自己处理脏数据
: 可能需要你介入repaint等方法去重新刷新整个页面
: 这个我没有怎么用过
: 以前javafx是不支持canvas的
: 后来新增的
: 我建议你这样
: 直接用shape下面的实现类
: line或者polygone这些
: 然后直接setfill或者setstroke就好了

avatar
z*e
11
对阿,这就是你需要处理的脏数据
canvas我真心不熟,思维方式跟直接画shape不一样
建议你上shape,这样变化什么都更直观一点

【在 b***i 的大作中提到】
: 不用repaint的。因为可以继续画上有颜色的方块,就是无法把任何地方变成透明的。
avatar
b*i
12
这么说吧,我写一个解释程序,里面有两个Canvas重叠,上面的如果有颜色可以遮住下
面的,让用户定义颜色,画直线,矩形,扇形,画文字都可以直接用JavaFX的api实现。
现在,用户定义透明色,结果画的矩形并没有把那个区域变成透明。得直接clearRect
。但是这样就不方便了,不能直接画透明的扇形,只能画矩形。Swing时代使用
AlphaComposite.SRC来实现画透明的形状,任何api都适用,drawLine, FillArc,
drawString。现在我要把上面Canvas上写的字变透明的,从而让下面的那个Canvas的背
景漏出来,总不能自己去重新发明轮子,一个点一个点画吧?

【在 z****e 的大作中提到】
: 对阿,这就是你需要处理的脏数据
: canvas我真心不熟,思维方式跟直接画shape不一样
: 建议你上shape,这样变化什么都更直观一点

avatar
z*e
13
但是透明色怎么遮住下面的颜色呢?

现。
clearRect

【在 b***i 的大作中提到】
: 这么说吧,我写一个解释程序,里面有两个Canvas重叠,上面的如果有颜色可以遮住下
: 面的,让用户定义颜色,画直线,矩形,扇形,画文字都可以直接用JavaFX的api实现。
: 现在,用户定义透明色,结果画的矩形并没有把那个区域变成透明。得直接clearRect
: 。但是这样就不方便了,不能直接画透明的扇形,只能画矩形。Swing时代使用
: AlphaComposite.SRC来实现画透明的形状,任何api都适用,drawLine, FillArc,
: drawString。现在我要把上面Canvas上写的字变透明的,从而让下面的那个Canvas的背
: 景漏出来,总不能自己去重新发明轮子,一个点一个点画吧?

avatar
a*w
14
用透明色就是要把下面的颜色露出来。

【在 z****e 的大作中提到】
: 但是透明色怎么遮住下面的颜色呢?
:
: 现。
: clearRect

avatar
z*e
15
我知道楼主的意思
但是不能用透明色遮住下面的颜色
要挖空某一个部分才对

【在 a*w 的大作中提到】
: 用透明色就是要把下面的颜色露出来。
avatar
b*i
16
Swing 的 JLayeredPane里面如果上面是JTextPane,下面是一个别的东西,JTextPane的
底色如果是透明的,就可以看到底下的。
透明其实就是挖空的,因为Color(0,0,0,0)本来就是Canvas的默认的填充颜色。不信你
可以生成一个Canvas,然后读出里面的点的颜色。只是Oracle似乎忘记了需要实现这些。

【在 z****e 的大作中提到】
: 我知道楼主的意思
: 但是不能用透明色遮住下面的颜色
: 要挖空某一个部分才对

avatar
z*e
17
我知道你的意思阿
但是我觉得不应该挖空才对
你看阿
底色是白色
盖了一层蓝色
然后再盖了一层透明色
问:最后答案应该是什么颜色?
我觉得蓝色比较make sense

些。

【在 b***i 的大作中提到】
: Swing 的 JLayeredPane里面如果上面是JTextPane,下面是一个别的东西,JTextPane的
: 底色如果是透明的,就可以看到底下的。
: 透明其实就是挖空的,因为Color(0,0,0,0)本来就是Canvas的默认的填充颜色。不信你
: 可以生成一个Canvas,然后读出里面的点的颜色。只是Oracle似乎忘记了需要实现这些。

avatar
b*i
18
盖透明色的时候,和盖其他颜色一样,要替代原来的点的颜色。这在Swing时代的
BufferedImage用
int compositeRule = AlphaComposite.SRC;//DST_OUT;
AlphaComposite composite =AlphaComposite.getInstance(compositeRule,
alphaValue);
而不是在原来点上根据新的点的alpha来决定是否画。不同Canvas叠在一起则上面的点
如果透明则漏出下面的点,这个时候,原则就是SRC_OVER。

【在 z****e 的大作中提到】
: 我知道你的意思阿
: 但是我觉得不应该挖空才对
: 你看阿
: 底色是白色
: 盖了一层蓝色
: 然后再盖了一层透明色
: 问:最后答案应该是什么颜色?
: 我觉得蓝色比较make sense
:
: 些。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。