चिकनी स्क्रॉलिंग प्रभाव प्राप्त करने के लिए आप स्क्रॉल के दौरान javax.swing.Timer
का उपयोग कर सकते हैं। आप घटक बाहर से इस ट्रिगर कर रहे हैं, तो इस तरह somthing काम करेंगे (जहां component
JScrollPane
भीतर घटक है):
final int target = visible.y;
final Rectangle current = component.getVisibleRect();
final int start = current.y;
final int delta = target - start;
final int msBetweenIterations = 10;
Timer scrollTimer = new Timer(msBetweenIterations, new ActionListener() {
int currentIteration = 0;
final long animationTime = 150; // milliseconds
final long nsBetweenIterations = msBetweenIterations * 1000000; // nanoseconds
final long startTime = System.nanoTime() - nsBetweenIterations; // Make the animation move on the first iteration
final long targetCompletionTime = startTime + animationTime * 1000000;
final long targetElapsedTime = targetCompletionTime - startTime;
@Override
public void actionPerformed(ActionEvent e) {
long timeSinceStart = System.nanoTime() - startTime;
double percentComplete = Math.min(1.0, (double) timeSinceStart/targetElapsedTime);
double factor = getFactor(percentComplete);
current.y = (int) Math.round(start + delta * factor);
component.scrollRectToVisible(current);
if (timeSinceStart >= targetElapsedTime) {
((Timer) e.getSource()).stop();
}
}
});
scrollTimer.setInitialDelay(0);
scrollTimer.start();
getFactor
विधि एक सहजता कार्य करने के लिए रेखीय से एक रूपांतरण है और के रूप में लागू किया जाएगा इनमें से किसी एक आप इसे कैसे महसूस करना चाहते हैं पर निर्भर करता है:
private double snap(double percent) {
return 1;
}
private double linear(double percent) {
return percent;
}
private double easeInCubic(double percent) {
return Math.pow(percent, 3);
}
private double easeOutCubic(double percent) {
return 1 - easeInCubic(1 - percent);
}
private double easeInOutCubic(double percent) {
return percent < 0.5
? easeInCubic(percent * 2)/2
: easeInCubic(percent * -2 + 2)/-2 + 1;
}
यह शायद एक घटक के भीतर काम करने के लिए बहुत इसलिए जब उपयोगकर्ता स्क्रॉल यह इन पंक्तियों के साथ कुछ करता है अनुकूलित किया जा सकता।
या, यदि संभव हो, तो आप जावाएफएक्स का उपयोग कर सकते हैं जिसका स्विंग से एनीमेशन के लिए बेहतर समर्थन है।
स्रोत
2013-12-31 20:42:59