All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.guigarage.flatterfx.skin.FlatterAvatarViewSkin Maven / Gradle / Ivy

The newest version!
package com.guigarage.flatterfx.skin;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.SkinBase;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;

import com.guigarage.flatterfx.controls.AvatarView;

public class FlatterAvatarViewSkin extends SkinBase{

	private Circle circleClip;

	private Circle overlayCircle;

	private Circle backgroundCircle;
	
	private ImageView imageView;
	
	public FlatterAvatarViewSkin(AvatarView control) {
		super(control);
		
		imageView = new ImageView();
		circleClip = new Circle();
		backgroundCircle = new Circle();
		overlayCircle = new Circle();
		
		overlayCircle.setFill(Color.TRANSPARENT);
		overlayCircle.setStrokeWidth(6.0);
		overlayCircle.setStroke(Color.RED.deriveColor(0.5, 0.5, 1.0, 1.0));
		backgroundCircle.setFill(Color.RED);
	
		imageView.clipProperty().set(circleClip);
		
		getChildren().add(backgroundCircle);
		getChildren().add(imageView);
		getChildren().add(overlayCircle);
		
		getSkinnable().imageProperty().addListener(new ChangeListener() {

			@Override
			public void changed(
					ObservableValue observable,
					Image oldValue, Image newValue) {
				imageView.setImage(newValue);
				getSkinnable().requestLayout();
			}
		});
		imageView.setImage(getSkinnable().imageProperty().get());
	}
		
	protected double computeSize() {
		Image image = getSkinnable().imageProperty().get();
		if(image == null) {
			return getSkinnable().defaultSizeProperty().doubleValue() + getSkinnable().gapProperty().doubleValue() * 2;
		}
		return Math.min(image.getHeight(), image.getWidth()) + getSkinnable().gapProperty().doubleValue() * 2;
	}
	
	@Override
	protected double computePrefHeight(double width, double topInset,
			double rightInset, double bottomInset, double leftInset) {
		return computeSize();
	}
	
	@Override
	protected double computePrefWidth(double height, double topInset,
			double rightInset, double bottomInset, double leftInset) {
		return computeSize();
	}
	
	@Override
	protected void layoutChildren(double contentX, double contentY,
			double contentWidth, double contentHeight) {
		
		double size = getSkinnable().defaultSizeProperty().doubleValue();
		
		Image image = imageView.getImage();
		if(image != null) {
			double w = image.getWidth();
			double h = image.getHeight();
			size = Math.min(w, h);
		}
		circleClip.radiusProperty().set(size / 2);

		double posX = (getSkinnable().getWidth() - size) / 2;
		double posY = (getSkinnable().getHeight() - size) / 2;
		
		if(image != null) {
			posX = (getSkinnable().getWidth() - image.getWidth()) / 2;
			posY = (getSkinnable().getHeight() - image.getHeight()) / 2;
			imageView.resize(image.getWidth(), image.getHeight());
		} else {
			imageView.resize(size, size);
		}
		imageView.relocate(posX, posY);

		
		circleClip.centerXProperty().set(imageView.getLayoutBounds().getWidth() / 2);
		circleClip.centerYProperty().set(imageView.getLayoutBounds().getHeight() / 2);

		backgroundCircle.centerXProperty().set(getSkinnable().getWidth() / 2);
		backgroundCircle.centerYProperty().set(getSkinnable().getHeight() / 2);
		backgroundCircle.radiusProperty().set(size / 2 + getSkinnable().gapProperty().get());

		overlayCircle.centerXProperty().set(getSkinnable().getWidth() / 2);
		overlayCircle.centerYProperty().set(getSkinnable().getHeight() / 2);
		overlayCircle.radiusProperty().set(size / 2);
		
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy