- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用我创建的此类从侧面滑入 JPanel:
public class AnimationClass {
private int i;
private int y;
private JPanel panel;
private int xTo;
private Timer timer;
private int xFrom;
synchronized void slidePanelInFromRight(JPanel panelInput, int xFromInput, int xToInput, int yInput, int width, int height) {
this.panel = panelInput;
this.xFrom = xFromInput;
this.xTo = xToInput;
this.y = yInput;
panel.setSize(width, height);
timer = new Timer(0, new ActionListener() {
public void actionPerformed(ActionEvent ae) {
for (int i = xFrom; i > xTo; i--) {
panel.setLocation(i, y);
panel.repaint();
i--;
timer.stop();
timer.setDelay(100);
if (i >= xTo) {
timer.stop();
}
}
timer.stop();
}
});
timer.start();
}
}
嗯,我不知道是什么问题。我已经尝试了很多不同的东西,但我似乎无法让它发挥作用。
最佳答案
计时器应该在每个滴答声上改变位置,直到它就位,相反,在每个滴答声上,您正在运行一个 for-next 循环,它会阻塞 EDT 直到循环完成,从而防止更新界面
用例子更新
例如……
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestAnimatedPane {
public static void main(String[] args) {
new TestAnimatedPane();
}
public TestAnimatedPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JPanel panel;
public TestPane() {
setLayout(null);
panel = new JPanel();
panel.setBackground(Color.RED);
add(panel);
Dimension size = getPreferredSize();
Rectangle from = new Rectangle(size.width, (size.height - 50) / 2, 50, 50);
Rectangle to = new Rectangle((size.width - 50) / 2, (size.height - 50) / 2, 50, 50);
Animate animate = new Animate(panel, from, to);
animate.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
public static class Animate {
public static final int RUN_TIME = 2000;
private JPanel panel;
private Rectangle from;
private Rectangle to;
private long startTime;
public Animate(JPanel panel, Rectangle from, Rectangle to) {
this.panel = panel;
this.from = from;
this.to = to;
}
public void start() {
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long duration = System.currentTimeMillis() - startTime;
double progress = (double)duration / (double)RUN_TIME;
if (progress > 1f) {
progress = 1f;
((Timer)e.getSource()).stop();
}
Rectangle target = calculateProgress(from, to, progress);
panel.setBounds(target);
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.setInitialDelay(0);
startTime = System.currentTimeMillis();
timer.start();
}
}
public static Rectangle calculateProgress(Rectangle startBounds, Rectangle targetBounds, double progress) {
Rectangle bounds = new Rectangle();
if (startBounds != null && targetBounds != null) {
bounds.setLocation(calculateProgress(startBounds.getLocation(), targetBounds.getLocation(), progress));
bounds.setSize(calculateProgress(startBounds.getSize(), targetBounds.getSize(), progress));
}
return bounds;
}
public static Point calculateProgress(Point startPoint, Point targetPoint, double progress) {
Point point = new Point();
if (startPoint != null && targetPoint != null) {
point.x = calculateProgress(startPoint.x, targetPoint.x, progress);
point.y = calculateProgress(startPoint.y, targetPoint.y, progress);
}
return point;
}
public static int calculateProgress(int startValue, int endValue, double fraction) {
int value = 0;
int distance = endValue - startValue;
value = (int)Math.round((double)distance * fraction);
value += startValue;
return value;
}
public static Dimension calculateProgress(Dimension startSize, Dimension targetSize, double progress) {
Dimension size = new Dimension();
if (startSize != null && targetSize != null) {
size.width = calculateProgress(startSize.width, targetSize.width, progress);
size.height = calculateProgress(startSize.height, targetSize.height, progress);
}
return size;
}
}
更新
我应该在昨晚添加这个(1 年不想 sleep ,2 位 parent 这样做了,不要再说了......)
动画是一个复杂的主题,尤其是当您开始研究变速时(示例是静态的)。
与其重新发明轮子,您应该认真考虑看看...
关于java - 使用计时器为 JPanel(滑入)设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16316132/
我复制了一个指令(并且正在工作),以便在单击时滑入滑出隐藏区域,类似于 jQuery 隐藏和显示。 然而,这只适用于元素在一起的情况,例如: Click to show.hide Stuff
我一直在研究这个菜单插件,它工作正常,但是我注意到一个问题,请看这个 JSFiddle Demo 当菜单打开时,我在菜单的右上角添加了一个关闭按钮(x),当我点击关闭时它向左滑动并隐藏但是当我再次点击
我正在尝试通过滑动或淡入淡出将我的图像加载到我的页面中。它是从数组中加载的,找不到任何相关文档。 JS: for(i =0; i 关于javascript - 从数组设置后如
我为我的网站创建了滑入/滑出侧边导航。它工作得很好,就像现在一样,但我希望让网站与侧边栏一起移动(类似于:http://demo.agnidesigns.com/fortune/demo15/)。目前
我正在开发一个 asp.net 网页,它使用 jquery slider 来滑入和滑出 div。 div 包括三个 asp 下拉列表,其值由服务器端 VB 中的页面加载例程初始化。在第一个下拉列表中,
我正在尝试更改 Ext.List 的内容。我正在尝试将内容更改为新面板,尽管我不需要更多列表元素。 这似乎替换了内容,但我如何动画更改? onItemDisclosure: function(reco
我在 UIViewController 中有一个 UIButton,我目前在应用程序打开时“淡入”以查看它。 不过,我想让 UIButton 从左向右滑入。 我不知道如何让它从左向右滑入,我的尝试都失
我目前有一个 javascript 生成多个 div(DOM 对象),如果单击第一个 div,子菜单 div 就会打开。这些子菜单使用 jQuery 幻灯片动画显示。 目前,当生成 div 时,它们会
目前我正尝试在我的应用程序中实现一些我真的不知道从哪里开始的东西。看看这张小图片: 您可以在此处的 Play 商店中找到该应用程序:https://play.google.com/store/apps
我有一个可以根据需要打开和关闭的内容 div,但我无法让内容 div 从底部滑入或滑出。我尝试使用 css 但我认为它的固定位置让我悲伤。默认情况下它应该是隐藏的,但默认情况下它会显示 $(".liv
我在谷歌上搜索了很多关于这个问题的信息。 我有一个包含 3 个 LinearLayout 的 LinearLayout。 第一个就像第二个的标题。最后一个只是一些其他内容。 我现在不想向上/向下滑动第
我正在使用 HTML 编写滑动表单。基本上我希望容器中只有两个 (f1|f2) 之一可见。但我不知道如何隐藏另一个 div,使其在页面上不可见。 https://jsfiddle.net/Lqu67y
我知道这是一些在互联网上的例子,也在 Stackoverflow 上我找到了很多例子,但不管你信不信,它们都不能满足我的需要。 Even I have asked a similar question
基本上我想要类似 this (at the 30 second mark) 的东西 我希望我的项目在 Activity 开始后按顺序滑入。 我试过谷歌搜索。我找不到任何我能理解的东西。我仍然在为 An
我正在尝试使用我创建的此类从侧面滑入 JPanel: public class AnimationClass { private int i; private int y; p
只是检查是否有人知道使用 CSS 或更有可能使用 jQuery.animate() 为 HTML 文本输入框中的文本滑出设置动画的厚颜无耻的方法。因为它们不是它们自己的元素,所以我不确定除了父输入框可
如果能提供解决此问题的帮助和见解,我将不胜感激。我正在开发一个初始可见高度为 180 像素的标题 div 的网站。标题 div 的总高度为 340px。当用户单击链接时,我需要标题 div 向下滑动以
我遇到了一个非常奇怪的问题,在这个问题上找不到任何帮助。 我的应用程序运行得很好,但有时用户界面有一个非常奇怪的行为:当我切换 View 时,下一个 View 总是从左上角滑入,这真的很难看。顺便说一
我无法让滑入/滑出和淡入/淡出工作。这就是我想要实现的目标...... 1) 对于 5K/10K 事件,当用户点击图片时使用show/hide 方法使事件列表显示和消失。 2) 对于半程马拉松比赛,当
我正在尝试创建这种效果,当点击屏幕时 AppBar 滑出,再次点击时滑入。 通过将 float 和对齐设置为 true,我能够在 SliverAppBar 中创建类似的东西。不同之处在于 appBar
我是一名优秀的程序员,十分优秀!