Title: Advanced User Interfaces with Java SD
1Advanced User Interfaces with JavaSD98 -
Session 3206
- Ted Faison
- ted.faison_at_computer.org
- Faison Computing Inc.
- www.faisoncomputing.com
2JDK 1.2 - A Better Graphics Framework
- JDK 1.1 had little or no support for complex
shapes, coordinate transformations or pixel
blending - The graphics extensions were added as new
packages under the AWT as the Java 2D API
3The Java 2D Packages
- java.awt.color Color control
- java.awt.font Fonts as complex shapes
- java.awt.geom Coordinate transformations and
shapes - java.awt.print Advanced printing support
- Books, Pages and Paper
4Java 2D API Features
- Support for separate user and device coordinate
spaces - Coordinates can be integers, floats or doubles
Device Space
User Space
5Java 2D API Features
- Support for coordinate transformations, for
translation, rotation, scaling and shearing
Device Space
User Space
6Java 2D API Features
- Support for complex shapes and hit-testing
- Support for complex clipping
- More precise color control
- Support for variable transparency, allowing color
blending
7Java 2D API Features
- Better image-processing support, with
convolution, color look-up, amplitude scaling. - Improved screen updating, with offscreen buffers
supporting BufferedImages and transparency
8Basic Drawing
- The old Graphics context is still there
- All 2D drawing done using Graphics2D
- Painting typecasting Graphics into Graphics2D
- public void paint(Graphics g)
- Graphics2D g2d (Graphics2D) g
- g2d.setColor(Color.red)
- //
-
9Coordinate Transformations
- Functions that map a point in one space to a
point in another space - Represented using a 3x3 matrix
- Transformations require multiplying each pixel by
a transformation matrix - Positive angles rotate the X axis towards the Y
axis - Can be used to invert axes, bend images, distort
space arbitrarily
10Coordinate Transformations
a11 a12 a13 a21 a22 a23 0 0 1
x y 1
a11x a12y a13 a21x a22y a23 0 0
1
x y 1
11Affine Transforms
- Maintain straightness and parallelism
- Translation
- setToTranslation(double dx, double, dy)
- used to support graphics scrolling
Device Space
User Space
12Affine Transforms
- Rotation
- Rotating about the origin
- setToRotation(double theta)
Device Space
User Space
13Affine Transforms
- Rotation about an arbitrary point
- SetToRotation(theta, x, y)
(x, y)
(x, y)
Device Space
User Space
14Affine Transforms
- Shearing
- setToShear(double sh, double sy)
Device Space
User Space
15Affine Transforms
- Scaling
- setToScale(double sx, double sy)
- anisotropic vs isotropic scaling
Device Space
User Space
16Using class AffineTransform
- Commands can be cumulative
- concatenating transformations
- Commands are not commutative
- Matrix multiplication is not commutative
- Dealing directly with the transformation matrix,
to effect combined transformations in one pass - g2D.setTransform(myAffineTransform)
17Affine Transforms
- Handling transformed images with offscreen
buffers - Examples
- ScalingImages.java
- RotatingImages.java
- ShearingImages.java
18Drawing with Paths
- All 2D shapes are drawn as paths, including lines
and rectangles - Class GeneralPath
- Used to define arbitrary paths
- The outline can be stroked
- Graphics2D uses a default stroke
- square pen
- width is 1 pixel
- continuous drawing - no dashes
19Bezier curves
- Used by the 2D API for cubic curves.
- Defined by simple control points
20Drawing a Straight Line
- public void paint(Graphics g)
- Graphics2D g2d (Graphics2D) g
- g2d.setColor(Color.red)
- GeneralPath path
- new GeneralPath(GeneralPath.EVEN_ODD)
- path.moveTo(50.0f, 50.0f)
- path.lineTo(200.0f, 200.0f)
- g2d.draw(path)
-
21Drawing a Straight Line
22Filling a shape
- public void paint(Graphics g)
- Graphics2D g2d (Graphics2D) g
- g2d.setColor(Color.blue)
- GeneralPath path
- new GeneralPath(GeneralPath.EVEN_ODD)
- path.moveTo(20.0f, 20.0f)
- path.lineTo(100.0f, 20.0f)
- path.lineTo(100.0f, 70.0f)
- path.lineTo(20.0f, 70.0f)
- path.closePath()
- g2d.fill(path)
23Filling a shape
24Filling a Shape with a Pattern
- BufferedImage image // create a buffered image
- Rectangle2D.Float rect new Rectangle2D.Float(0.0
f, 0.0f, 100.0f, 200.0f) - TexturePaint pattern
- new TexturePaint(image, rect,
- TexturePaint.NEAREST_NEIGHBOR)
- g2d.setPaint(pattern)
- g2d.drawString(styledString, 10, 10)
25Filling a Shape with a Pattern
26Filling a Shape with an Image
- Image image getToolkit().getImage(url)
- AffineTransform at new AffineTransform()
- at.setToTranslation(0, 200)
- g2d.transform(at)
- g2d.setClip(myShape)
- at.setToTranslation(0, -200)
- g2d.drawImage(image, at, this)
- at.setToTranslation(0, 200)
- g2d.setClip(null)
- g2d.draw(myShape)
27Filling a Shape with an Image
28Filling a Shape with a Gradient
- Font myFont new Font("Helvetica",
- Font.PLAIN, 200)
- StyledString styledString
- new StyledString("AB", myFont)
- Shape myShape styledString.getStringOutline()
- GradientPaint gradient
- new GradientPaint(0.0f, 0.0f, Color.red,
- 200.0f, 200.0f,
- Color.yellow)
- g2d.setPaint(gradient)
- g2d.drawString(styledString, 10, 200)
29Filling a Shape with a Gradient
30Custom Strokes
- Class BasicStroke
- simple to use
- define common stroke properties
- width
- end caps
- line joins
- dash attributes
31Defining a Custom Stroke
- g2d.setStroke(
- new BasicStroke(penWidth,
- BasicStroke.CAP_ROUND,
- BasicStroke.JOIN_MITER ) )
- path.moveTo(10.0f, 40.0f)
- path.lineTo(90.0f, 40.0f)
- g2d.draw(path)
32Defining a Custom Stroke
332D Drawing Shortcuts
- interface Rectangle2D
- Rectangle2D.Float
- Rectangle2D.Double
- RoundRectangle2D
- Arc2D
- Ellipse2D
34Clipping
- Graphics2D.setClip(Path)
- Clipping a circle with a rectangle
- Ellipse2D.Float circle new
- Ellipse2D.Float(10.0f, 10.0f, 100.0f,
100.0f) - Rectangle2D.Float rect new Rectangle2D.Float
(10.0f, 30.0f, 100.0f, 70.0f) - g2d.setClip(rect)
- g2d.setColor(Color.red)
- g2d.fill(circle)
- g2d.setClip(null)
- g2d.setColor(Color.black)
- g2d.draw(rect)
35Clipping a Circle with a Rectangle
36Clipping with Text
- Font myFont new Font("Helvetica",Font.PLAIN,200)
- StyledString styledString
- new StyledString("ABC", myFont)
- Shape myShape styledString.getStringOutline()
- AffineTransform at new AffineTransform()
- at.setToTranslation(0, 200)
- g2d.transform(at)
- Ellipse2D.Float circle
- new Ellipse2D.Float(10.0f,-150.0f,400.0f,150.0f)
- g2d.setClip(myShape)
- g2d.setColor(Color.red)
- g2d.fill(circle)
37Clipping with Text
38Blending objects
- Transparency
- The Alpha Channel
- Compositing Operations
- called Raster Operations (ROP) in Windows
- Class AlphaComposite
- Implements a subset of the Porter-Duff rules
- Cd CsFs CdFd
- Ad AsFs AdFd
- C Color d destination
- F Fraction s source
- A Alpha
39Compositing Operations
- Alpha1 indicated total opaqueness
- Setting the Operation
- AlphaComposite c AlphaComposite.getInstance(
- AlphaComposite.SRC_OVER,
- 0.5f)
- g2d.setComposite(c)
40Porter-Duff Operations Supported
- CLEAR destination cleared
- SRC source copied to destination
- SRC_OVER source is blended over dest
- SRC_IN part of source already in dest replaces
dest - SRC_OUT part of source not already in dest
replaces dest - DST_IN, DST_OUT, DEST_OVER
41Using the SRC Rule
42Using the SRC_OVER Rule
43Using the SRC_IN Rule
44Using the SRC_OUT Rule
45Conclusion
- The Java 2D API extends the AWT with
- advanced geometric shapes
- coordinate transformations
- shapes of arbitrary complexity
- text as a shape
- arbitrary clipping regions
- image blending through compositing
- image processing capabilities
- precise color control