在 中以两种方式在两个Point对象之间绘制线条的最简单方法是什么?在两个Point对象之间创建动画
例如:
Point a = new Point(5,20);
Point b = new Point(15,20);
如何这些点与 “移动” 线连接?
换句话说,我想让用户感觉某种“动作”。有没有简单的方法来做到这一点?
在 中以两种方式在两个Point对象之间绘制线条的最简单方法是什么?在两个Point对象之间创建动画
例如:
Point a = new Point(5,20);
Point b = new Point(15,20);
如何这些点与 “移动” 线连接?
换句话说,我想让用户感觉某种“动作”。有没有简单的方法来做到这一点?
继Chinmay Kanchi的回答之后,你需要创造一种动画的感觉。正如上面在Uhlen的评论中提到的那样,在EDT上工作时应该使用Swing's Timer。给你如何使用Timer的例子。让我们假设我们有一个面板,我们希望它可以在例如点击按钮,因此我们需要通过增加其大小来使其滑动打开。下面是一个例子,显示你将如何使用Timer来执行操作。
this.extendingTimer = new Timer(0, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//assume sliding is vertical
int value = maximumHeight;
//make sure the size will not be bigger then allowed maximum
if(currentExtensionSize + extensionRate >= value)
{
currentExtensionSize = value;
stopExtending();
}
else
currentExtensionSize += extensionRate;
setSize(new Dimension(maximumWidth, currentExtensionSize));
}
});
extendingTimer.setInitialDelay(0);
extendingTimer.setDelay(100);
extendingTimer.setRepeats(true);
给定两点,您可以确定连接它们的线的方程式。线的方程形式为y = mx + c
,其中m是斜率,c是y截距。
所以,考虑到你的两点(5,20)和(15,20),我们首先确定m。
m = (y2-y1)/(x2-x1)
= (20-20)/(15-5)
= (0)/10
= 0
代入公式为一条直线,我们得到y = 0x + c
或y = c
。现在我们知道了这一点,我们只需要知道y = c和5 < = x < = 15的点。简单地以正常方式绘制每个点(在确切的方法中查看this),在绘制每个点之间调用Thread.sleep()
。在这种情况下,你只需要画出11个点,所以每100毫秒绘制1点就有意义。有关Thread.sleep()
的详细信息,请参阅here。
编辑:由于Thread.sleep()
无法在EDT上运行,请参阅javax.swing.Timer,正如Uhlen所建议的那样。
int lineCount = 0; //global
// timer calls the below
xLocation = (*a)[a->size()-1] * timeSoFar/duration ;
if(xLocation > (*a)[lineCount+1]){
lineCount++;
}
double m = ((*b)[lineCount+1] - (*b)[lineCount])/((*a)[lineCount+1]-(*a)[lineCount]);
double yIntercept = (*b)[lineCount]-m*(*a)[lineCount];
yLocation = m * xLocation + yIntercept;
xLocation = (yLocation - yIntercept)/m;
这是C++和使用的载体,但其我们想要的理论。这允许多行不只一行。
从90年代中期开始,人们将Java拼写为JAVA的另一个时间扭曲 – 2011-02-15 22:26:30