This class provides a splash-screen that you can show as your MATLAB application starts:
* Border-less window
* Ability to add text overlays
* Optional progress bar with configurable location
This is mainly useful when deploying applications using the MATLAB compiler and where your application takes a while to initialize.
Requires MATLAB R2010a or above.
Ben Tordoff (2021). SplashScreen (https://www.mathworks.com/matlabcentral/fileexchange/30508-splashscreen), MATLAB Central File Exchange. Retrieved .
Very nice tool. However, in a compiled executable, this splash opens up only in the last moments during the execution of startupFcn, long after hitting the Enter on the executable. To remedy this, I used the same image as a splash associated by the compiler (must be a splash.png in the same folder with executable), which gives me a primary splash right after starting the executable. Unfortunately, between these two splash screens, there is a sizeable time gap. Anybody having an idea how to cover the whole startup interval?
Sorry for request, how to insert in my original code? Thanks a lot.
Great submission. To follow up Guy's comment below regarding window stacking, you can set the splash window on top permanently by adding:
after the lines of code that Guy provided.
??? Error using ==> SplashScreen>SplashScreen.SplashScreen at 56
Syntax error. You must supply both a window title and imagename.
How can i fix it?
Perfect, but especially if used as a progress bar, the window might not appear on top of the other windows, to deal with that:
after line 250 add:
and after line 311 add:
At line 244, you can modify the code to accommodate the second monitor. Something like:
% Old code start here:
% Resize and reposition the window
obj.Frame.setSize( obj.Icon.getIconWidth(), obj.Icon.getIconHeight() );
% pos = get(0,'MonitorPositions');
% x0 = pos(1,1) + (pos(1,3)-obj.Icon.getIconWidth())/2
% y0 = pos(1,2) + (pos(1,4)-obj.Icon.getIconHeight())/2
% New Code starts here:
screensize = get(0,'ScreenSize');
w = obj.Frame.getWidth();
h = obj.Frame.getHeight();
x0 = ceil((screensize(3)-w)/2);
y0 = ceil((screensize(4)-h)/2);
obj.Frame.setLocation( x0, y0 );
perfect !!!!!!!! I love it !!!!
Right now there isn't a way to set the position programmatically. I guess I could make it settable. However, it should be picking the first monitor and centering the window there. Could you post the output of get(0,'MonitorPositions')?
Hi Ben, thanks a lot for this file.
I have a problem displaying the splashscreen, as I have two monitors set as "extended" display. Once the SplashScreen runs, the screen shows "in the middle" of the two monitors, i.e., half of the splashscreen is in Monitor A and another half in Monitor B.
Is there any setting to position the splashscreen on the monitor?
If I use GUIDE to generate the GUI, where should I call
s = SplashScreen(...);
and when should I call
OK, that's a little surprising. Maybe try putting a "drawnow" after opening it?
You are right that nothing will be shown until the MCR has been loaded/initialized. The only way around that is to write a wrapper around your executable that shows the splashscreen before launching the MATLAB deployed app. Obviously that would have to be written in something other than MATLAB (which requires the MCR!).
I am trying to use this for compiled programs and hope this will show up soon after the program icon is clicked. In general, it will take a while before anything can happen on the screen, probably because MCR has to be loaded. In my case, the program also goes to look for the paths of file I/O that are saved from the previous session. When I call this in the _OpeningFcn(), it did not show up until close to the end of waiting time. Wonder if there is a solution for it?
Hi Canoe Commuter (great name, by the way - beats using the car!), the simple way to make the splashscreen stay up for a second or two is to use "pause(1)" (for 1 second) or similar. However this will block, not allowing anything else to happen, which may get annoying.
A slightly more sophisticated approach is to ensure it stays up for N seconds. In psuedo-code this might look something like:
showSplashForSecs = 2;
timer = tic;
elapsedTime = toc(timer);
if elapsedTime < showSplashForSecs
pause(showSplashForSecs - elapsedTime);
This should ensure that the splashscreen is always on for at least two seconds even if your application initializes really quickly. It will still block interaction whilst paused though.
Great file! Thank you for sharing.
Problem: My application loads so fast there's no chance to read the splash screen. How can I make the screen stay up for a finite amount of time?
For others who are (like me) not experienced programmers: by trial-and-error I found that you insert the calling code into the GUI function called (your function's name)OpeningFcn.
Very nice. Quick question: If I use GUIDE to generate the GUI, where should I call
s = SplashScreen(...);
and when should I call
Hi Andre, you must call this with a name for the window (i.e. a title) and the name of the image file you want it to show. For example: "s = SplashScreen('My App','myAppImage.png')". Type "help SplashScreen" for more information. If that still doesn't help you, let me know.
I have an error:
"Syntax error. You must supply both a window title and imagename"
What should I do?
Nice addition, thank you!
I have a problem in my standalone application: the application hangs when executing the 'delete(s)' command (the splash screen disappears before crashing). Do you have an idea why?
My workaround is to hide the splash screen instead:
Only one remark about figure position.
On my computer, root 'MonitorPositions' return [left,bottom,right,up] for each monitor instead of [left,bottom, width, height] as described in the matlab documentation.
so, I had to replace line 247 & 248 by those:
x0 = pos(1,1) + (diff(pos(1,[1 3]))-obj.Icon.getIconWidth())/2
y0 = pos(1,2) + (diff(pos(1,[2 4]))-obj.Icon.getIconHeight())/2
Note that this is not an issue if you use only one monitor or if your primary monitor is on the left of the secondary.
Hi Dani, an update allowing the text shadows to be turned off is on its way. I don't think the Java tools I'm using allow animated GIFs to be viewed, so I don't think that can be supported in any easy way.
Really, really nice - I wish I had it earlier.
1. Why can I not load animated GIFs? This would allow for even more dynamic splash screens.
2. It would be nice if one could control (deactivate) the text shadow, i.e. lines 100-110.
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!