diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java
index d15b1615e..678ee5032 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/setting/Config.java
@@ -55,6 +55,8 @@ public final class Config implements Cloneable {
private boolean enableShadow;
@SerializedName("enableBlur")
private boolean enableBlur;
+ @SerializedName("enableAnimation")
+ private boolean enableAnimation;
@SerializedName("decorated")
private boolean decorated;
@SerializedName("theme")
@@ -110,6 +112,15 @@ public final class Config implements Cloneable {
Settings.save();
}
+ public boolean isEnableAnimation() {
+ return enableAnimation;
+ }
+
+ public void setEnableAnimation(boolean enableAnimation) {
+ this.enableAnimation = enableAnimation;
+ Settings.save();
+ }
+
public boolean isEnableBlur() {
return enableBlur;
}
@@ -194,7 +205,7 @@ public final class Config implements Cloneable {
public Config() {
clientToken = UUID.randomUUID().toString();
logintype = downloadtype = 0;
- enableBlur = enableShadow = true;
+ enableAnimation = enableBlur = enableShadow = true;
theme = 4;
decorated = OS.os() == OS.LINUX;
auth = new HashMap<>();
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java
index bc35942bb..c4c26e78c 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/GameSettingsPanel.java
@@ -93,8 +93,6 @@ public final class GameSettingsPanel extends RepaintPage implements DropTargetLi
initComponents();
dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this);
- setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F"));
- setOpaque(true);
for (int i = 0; i < InstallerType.values().length; i++)
installerPanels[i] = new InstallerPanel(this, InstallerType.values()[i]);
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form
index fa1a07eaf..e1602a0ae 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.form
@@ -71,6 +71,8 @@
+
+
@@ -121,6 +123,7 @@
+
@@ -354,5 +357,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java
index b2f6fa751..8620a75ad 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/LauncherSettingsPanel.java
@@ -27,7 +27,6 @@ import org.jackhuang.hellominecraft.launcher.core.download.DownloadType;
import org.jackhuang.hellominecraft.util.sys.IOUtils;
import org.jackhuang.hellominecraft.util.MessageBox;
import org.jackhuang.hellominecraft.util.lang.SupportedLocales;
-import org.jackhuang.hellominecraft.util.ui.GraphicsUtils;
import org.jackhuang.hellominecraft.util.ui.JSystemFileChooser;
import org.jackhuang.hellominecraft.util.ui.SwingUtils;
@@ -46,8 +45,6 @@ public class LauncherSettingsPanel extends RepaintPage {
void initGui() {
initComponents();
- setBackground(GraphicsUtils.getWebColorWithAlpha("FFFFFF7F"));
- setOpaque(true);
DefaultComboBoxModel d = new DefaultComboBoxModel<>();
for (DownloadType type : DownloadType.values())
@@ -73,6 +70,7 @@ public class LauncherSettingsPanel extends RepaintPage {
cboTheme.setSelectedIndex(Settings.getInstance().getTheme().ordinal());
chkEnableShadow.setSelected(Settings.getInstance().isEnableShadow());
chkEnableBlur.setSelected(Settings.getInstance().isEnableBlur());
+ chkEnableAnimation.setSelected(Settings.getInstance().isEnableAnimation());
chkDecorated.setSelected(Settings.getInstance().isDecorated());
}
@@ -117,6 +115,7 @@ public class LauncherSettingsPanel extends RepaintPage {
lblRestart = new javax.swing.JLabel();
btnMCBBS = new javax.swing.JButton();
chkEnableBlur = new javax.swing.JCheckBox();
+ chkEnableAnimation = new javax.swing.JCheckBox();
cboDownloadSource.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
@@ -244,6 +243,13 @@ public class LauncherSettingsPanel extends RepaintPage {
}
});
+ chkEnableAnimation.setText(C.i18n("launcher.enable_animation")); // NOI18N
+ chkEnableAnimation.addItemListener(new java.awt.event.ItemListener() {
+ public void itemStateChanged(java.awt.event.ItemEvent evt) {
+ chkEnableAnimationItemStateChanged(evt);
+ }
+ });
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
@@ -290,13 +296,15 @@ public class LauncherSettingsPanel extends RepaintPage {
.addComponent(btnCheckUpdate)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnMCBBS))
- .addComponent(lblAbout)
- .addComponent(lblModpack)
+ .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(lblRestart)
.addGroup(layout.createSequentialGroup()
.addComponent(chkEnableShadow)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(chkEnableBlur))
+ .addComponent(chkEnableBlur)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(chkEnableAnimation))
.addComponent(chkDecorated))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
@@ -335,7 +343,8 @@ public class LauncherSettingsPanel extends RepaintPage {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(chkEnableShadow)
- .addComponent(chkEnableBlur))
+ .addComponent(chkEnableBlur)
+ .addComponent(chkEnableAnimation))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(chkDecorated)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 6, Short.MAX_VALUE)
@@ -345,9 +354,9 @@ public class LauncherSettingsPanel extends RepaintPage {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(lblRestart)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(lblModpack)
+ .addComponent(lblModpack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(lblAbout)
+ .addComponent(lblAbout, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
}// //GEN-END:initComponents
@@ -432,6 +441,10 @@ public class LauncherSettingsPanel extends RepaintPage {
Settings.getInstance().setEnableBlur(chkEnableBlur.isSelected());
}//GEN-LAST:event_chkEnableBlurItemStateChanged
+ private void chkEnableAnimationItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_chkEnableAnimationItemStateChanged
+ Settings.getInstance().setEnableAnimation(chkEnableAnimation.isSelected());
+ }//GEN-LAST:event_chkEnableAnimationItemStateChanged
+
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnCheckUpdate;
private javax.swing.JButton btnMCBBS;
@@ -440,6 +453,7 @@ public class LauncherSettingsPanel extends RepaintPage {
private javax.swing.JComboBox cboLang;
private javax.swing.JComboBox cboTheme;
private javax.swing.JCheckBox chkDecorated;
+ private javax.swing.JCheckBox chkEnableAnimation;
private javax.swing.JCheckBox chkEnableBlur;
private javax.swing.JCheckBox chkEnableShadow;
private javax.swing.JLabel lblAbout;
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java
index caed3133e..766a4fe9d 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainFrame.java
@@ -330,6 +330,7 @@ public final class MainFrame extends DraggableFrame implements IRepaint {
if (background != null) {
if (backgroundLabel == null) {
backgroundLabel = new GaussionPanel();
+ backgroundLabel.setDrawBackgroundLayer(true);
backgroundLabel.addAeroObject(backgroundLabel);
backgroundLabel.setBounds(0, 0, 800, 480);
centralPanel.add(backgroundLabel, -1);
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form
index 8b2c13b60..4913c4d4d 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.form
@@ -301,4 +301,4 @@
-
\ No newline at end of file
+
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java
index 374d3c668..c4573f34c 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/MainPagePanel.java
@@ -60,6 +60,8 @@ public class MainPagePanel extends Page {
void initGui() {
initComponents();
+
+ animationEnabled = false;
pnlButtons = new javax.swing.JPanel();
pnlButtons.setLayout(null);
diff --git a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java
index 23d5d2ddd..3faefaf07 100755
--- a/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java
+++ b/HMCL/src/main/java/org/jackhuang/hellominecraft/launcher/ui/Page.java
@@ -17,7 +17,13 @@
*/
package org.jackhuang.hellominecraft.launcher.ui;
+import java.awt.AlphaComposite;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+import org.jackhuang.hellominecraft.launcher.setting.Settings;
/**
*
@@ -34,6 +40,8 @@ public class Page extends JPanel implements Selectable {
@Override
public void onSelect() {
+ if (!selected)
+ animate();
selected = true;
}
@@ -53,4 +61,60 @@ public class Page extends JPanel implements Selectable {
public boolean isCreated() {
return created;
}
+
+ // -------------------
+ // Animation
+ // -------------------
+ private static final int ANIMATION_LENGTH = 10;
+
+ public Page() {
+ timer = new Timer(1, (e) -> {
+ SwingUtilities.invokeLater(() -> {
+ Page.this.repaint();
+ offsetX += 0.15;
+ if (offsetX >= ANIMATION_LENGTH) {
+ timer.stop();
+ Page.this.repaint();
+ }
+ });
+ });
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ if (!(g instanceof Graphics2D)) {
+ super.paint(g);
+ return;
+ }
+ double pgs = 1 - Math.sin(Math.PI / 2 / ANIMATION_LENGTH * offsetX);
+ if (Math.abs(ANIMATION_LENGTH - offsetX) < 0.1) {
+ super.paint(g);
+ return;
+ }
+ if (pgs > 1)
+ pgs = 1;
+ if (pgs < 0)
+ pgs = 0;
+ Graphics2D g2 = (Graphics2D) g;
+ if (isOpaque()) {
+ g.setColor(getBackground());
+ g.fillRect(0, 0, getWidth(), getHeight());
+ } else
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, (float) (1 - pgs)));
+ g.translate((int) (pgs * 50), 0);
+ super.paint(g);
+ }
+
+ double offsetX = ANIMATION_LENGTH;
+
+ Timer timer;
+
+ boolean animationEnabled = true;
+
+ public void animate() {
+ if (Settings.getInstance().isEnableAnimation() && animationEnabled) {
+ offsetX = 0;
+ timer.start();
+ }
+ }
}
diff --git a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GaussionPanel.java b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GaussionPanel.java
index 563c4905a..40c9f28b7 100644
--- a/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GaussionPanel.java
+++ b/HMCUtils/src/main/java/org/jackhuang/hellominecraft/util/ui/GaussionPanel.java
@@ -18,6 +18,7 @@
package org.jackhuang.hellominecraft.util.ui;
import java.awt.AlphaComposite;
+import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
@@ -40,6 +41,15 @@ public class GaussionPanel extends JPanel {
private static final int RADIUS = 10;
private transient final StackBlurFilter stackBlurFilter = new StackBlurFilter(RADIUS);
private transient BufferedImage cache = null;
+ private boolean drawBackgroundLayer = false;
+
+ public boolean isDrawBackgroundLayer() {
+ return drawBackgroundLayer;
+ }
+
+ public void setDrawBackgroundLayer(boolean drawBackgroundLayer) {
+ this.drawBackgroundLayer = drawBackgroundLayer;
+ }
public void setBackgroundImage(Image backgroundImage) {
this.backgroundImage = backgroundImage;
@@ -81,10 +91,16 @@ public class GaussionPanel extends JPanel {
aeroGraphics.drawImage(backgroundImage, 0, 0, aeroBuffer.getWidth(), aeroBuffer.getHeight(), aeroRect.x, aeroRect.y, aeroRect.x + aeroRect.width, aeroRect.y + aeroRect.height, null);
aeroBuffer = stackBlurFilter.filter(aeroBuffer, null);
g2.drawImage(aeroBuffer, aeroRect.x, aeroRect.y, aeroRect.x + aeroRect.width, aeroRect.y + aeroRect.height, RADIUS / 2, RADIUS / 2, RADIUS / 2 + aeroRect.width, RADIUS / 2 + aeroRect.height, null);
+
+ if (drawBackgroundLayer) {
+ g2.setColor(Color.white);
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
+ g2.fillRect(0, 0, getWidth(), getHeight());
+ }
}
g2.dispose();
}
g.drawImage(cache, 0, 0, getWidth(), getHeight(), null);
}
-}
+}
\ No newline at end of file