AndroidMirroring/DeviceFrame/GetPreferredSize * screen size: 1855, 1056 * canvas size: 1080, 1920 * frame size: 1121, 1938 * canvas size ´Â screenshot ¿¡ ÀÇÇÑ image ÀÇ size ÀÓ * frame.height > screen.height: frame.height = (int) (0.9 * screen.height); 950.4 * frame.width > screen.width: frame.width 1121 * frame.width > 1080 + inset + toolbar + scrollbar * frame.height > 1920 + inset + infopane + scrollbar 950.4 * ´Ù¸¥ ÇÁ·Î±×·¥À» ÂüÁ¶ÇÒ °Í * screen size, canvas size µÑ ´Ù º¯¼öÀ̹ǷÎ, Àß »ý°¢ÇØ¾ß ÇÒ µíÇÔ. * public class DeviceFrame extends JFrame * public DeviceFrame(Application app, final AndroidDevice device) * pack(); ¿¡ ÀÇÇØ getPreferredSize method °¡ call µÈ´Ù. {{{ public Dimension getPreferredSize() {^M Dimension frame = super.getPreferredSize();^M Insets fb = super.getInsets();^M Dimension screen = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getSize();^M Dimension canvasSize = canvas.getPreferredSize();^M Dimension infoPaneSize = infoPane.getSize();^M Dimension toolBarSize = toolBar.getSize();^M ^M log.debug(String.format("getPreferredSize: screen=%s, canvas=%s, frame=%s",^M screen, canvasSize, frame^M ));^M ^M if (frame.height > screen.height) {^M frame.height = (int) (0.9 * screen.height);^M }^M if (frame.width > screen.width) {^M frame.width = (int) (0.9*screen.width);^M }^M ^M JScrollBar vsb = canvasScrollable.getVerticalScrollBar();^M int vsbW = vsb.getWidth(); //vsb.isShowing() ? vsb.getWidth() : 0;^M JScrollBar hsb = canvasScrollable.getHorizontalScrollBar();^M int hsbH = hsb.getHeight(); //hsb.isShowing() ? hsb.getHeight() : 0;^M ^M int W = fb.left + toolBarSize.width + canvasSize.width + vsbW + fb.right;^M int H = fb.top + infoPaneSize.height + canvasSize.height + hsbH + fb.bottom;^M if (frame.width > W) {^M frame.width = W;^M }^M if (frame.height > H) {^M frame.height = H;^M }^M log.debug(String.format("getPreferredSize: frame2=%s", frame));^M ^M return frame;^M }^M }}} * ImageCanvas {{{ public Dimension getPreferredSize() {^M if (image == null) {^M return new Dimension(200, 300);^M }^M if (landscapeMode) {^M if (skinBackgroundImage != null) {^M return new Dimension(scale(skinBackgroundImage.getHeight(null)), scale(skinBackgroundImage.getWidth(null)));^M }^M return new Dimension(scale(image.getHeight()), scale(image.getWidth()));^M }^M if (skinBackgroundImage != null) {^M return new Dimension(scale(skinBackgroundImage.getWidth(null)), scale(skinBackgroundImage.getHeight(null)));^M }^M return new Dimension(scale(image.getWidth()), scale(image.getHeight()));^M }^M }}} * /my-app/src/main/resources/skins * galaxy nexus, gt-i9505, htc one v, nexus s * frame.cfg, frame.png * 855 X 1672, 1340 X 2438, 655 X 1221, 749 X 1308 * frame.cfg: 67 X 213, 120 X 265, 86 X 146, 134 X 248 === ÇØ»óµµ¿Í ppi === * https://namu.wiki/w/pixels%20per%20inch * https://en.wikipedia.org/wiki/Comparison_of_high-definition_smartphone_displays * 720 X 1280 300 ppi * 1080 X 1920 400 ppi * 2560 X 1440 500 ppi * 3840 X 2160 800 ppi * monitor * 1920 X 1080, 24inch: 92ppi * 2560 X 1440, 27inch: 109 ppi * smartphone * 1080 X 1920, 5inch: 441ppi === call === * Dimension frame = super.getPreferredSize(); * canvas, img ´Â ImageCanvas ÀÇ ¿ÀºêÁ§Æ®ÀÓ. * Dimension canvasSize = canvas.getPreferredSize(); * image °¡ null À̸é Dimension(200, 300) ¸®ÅÏ * skinBackgroundImage °¡ ÀÖÀ¸¸é * Dimension(scale(skinBackgroundImage.getWidth(null)), scale(skinBackgroundImage.getHeight(null))) * Dimension(scale(image.getWidth()), scale(image.getHeight())) * Dimension sz = img.getPreferredSize(); {{{ private int scale(int value) {^M double factor = getScaleFactor();^M if (factor != 1) {^M scalePercentage = (int) (factor * 100);^M }^M if (scalePercentage == 100) {^M return value;^M }^M return (int) Math.round(value * scalePercentage / 100.0);^M }^M }}} {{{ private double getScaleFactor() {^M final Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();^M final double screenHeight = screen.getHeight();^M final double screenWidth = screen.getWidth();^M double factor = 1;^M if (screenHeight <= getHeight()) {^M factor = screenHeight / getHeight();^M if (factor > 0.75) {^M factor = 0.25;^M } else if (factor > 0.50) {^M factor = 0.25;^M } else if (factor > 0.25) {^M factor = 0.25;^M }^M }^M return factor;^M }^M }}} === canvas === * class ImageCanvas extends JComponent * public void setScreenshot(ScreenImage image) * repaint(); * protected void paintComponent(Graphics g) * public Dimension getPreferredSize() * return new Dimension(scale(image.getWidth()), scale(image.getHeight())); === Settings === * private final Preferences applicationPreferences; * set * askBeforeQuit, imageFormat, askBeforeScreenshot, scale, hideEmulators, * upsideDown, landscape, autoShow * private void set(String name, String value) * private void set(String name, int value) * private void set(String name, boolean value) {{{ public int getPreferredScale() {^M return applicationPreferences.getInt("scale", 100);^M }^M ^M public void setPreferredScale(int value) {^M set("scale", value);^M }^M }}} === integer division === {{{ int x = ...; int y = ...; double value = ((double) x) / y; }}}