現在のところ、私のコードは、リストから最初のサイズから最終サイズにイメージをアニメーション化し、次のイメージですべてのイメージのアニメーションが完了し、すべてが最終サイズになるまで続きます。グループ別に画像リストをアニメーション化するJava Swing
package ui;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.Timer;
import utils.SudokuGen;
// TODO: Auto-generated Javadoc
/**
* The Class ButtonPanel.
*/
public class ButtonPanel extends JPanel implements ActionListener{
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The buttons. */
private JButton[] buttons;
private int[] imgsize;
private int index,count;
private Timer timer;
private ImageButton images;
private static final int COUNT = 10;
private static final int INITSIZE = 32;
private static final int COLUMNS = 1;
private static final int ROWS = 9;
/**
* Instantiates a new button panel.
*
* @param puzzle The Sudoku matrix object
* @param images The images object
* @param sPanel The Sudoku JPanel
*/
public ButtonPanel(SudokuGen puzzle, ImageButton images, SudokuPanel sPanel){
//Create an array of JButton with 9 elements
this.buttons = new JButton[puzzle.getMyboard().getNewnumbers().size()];
this.images = images;
this.imgsize = new int[COUNT];
for (int i=0;i<COUNT;i++){
imgsize[i] = INITSIZE;
}
//Sets the layout to a 9*1 GridLayout with padding 5
this.setLayout(new GridLayout(ROWS,COLUMNS,5,5));
//Load an image, create the MouseListener and add it at index i
for (int i=1;i<this.images.getImagelist().size();i++){
ImageIcon image = new ImageIcon(this.images.getImagelist()
.get(i).getImage().getScaledInstance(32, 32, Image.SCALE_SMOOTH));
buttons[i] = createMouseListener(image, i, puzzle, sPanel);
buttons[i].setPreferredSize(new Dimension(100, 100));
this.add(buttons[i]);
}
index = 1; //first button
count = 0; //times to resize the button
timer = new Timer(5,this);
timer.start();
}
public void set(int X){
this.imgsize[index] = X;
}
/**
* Creates the mouse listener.
*
* @param image The image at index i
* @param i The index for the button i
* @param puzzle The Sudoku matrix object
* @param sPanel The Sudoku JPanel
* @return the JButton to add at index i
*/
private JButton createMouseListener(ImageIcon image, int i, SudokuGen puzzle, SudokuPanel sPanel){
JButton button = new JButton();
button.setIcon(image);
button.setActionCommand(Integer.toString(puzzle.getMyboard().getNewnumbers().get(i)));
button.addActionListener(sPanel.new ButtonActionListener());
return button;
}
@Override
public void actionPerformed(ActionEvent e) {
count++;
set(this.imgsize[index]+1); //increase the size of the image
if (this.imgsize[index] < 64){
ImageIcon image = new ImageIcon(this.images.getImagelist()
.get(index).getImage().getScaledInstance(this.imgsize[index], this.imgsize[index], Image.SCALE_SMOOTH));
buttons[index].setIcon(image);
if (count > 24){ //reached final size
count = 0; //start counting again
index++; //move to the next image
}
};
if (index == 10) timer.stop();
repaint();
}
}
私はそれを動作させるために必要なリソースのSSCCE与えられた量はそれほどそのために謝罪を提供することはできませんよ。
私の目標は、最初のアニメーションがそのプロセスの半分を終了したときに次のイメージのアニメーションを開始することです。したがって、2番目のイメージが半分のアニメーションに達すると、最初のイメージは完全なアニメーションを完了します。波の効果の種類。
改善できる点が他にもある場合は、提案を聞いてうれしいです。
更新:効果を達成するために使用される更新方法:
public void actionPerformed(ActionEvent e) {
count++;
this.imgsize[index]++;
ImageIcon image = new ImageIcon(this.images.getImagelist()
.get(index).getImage().getScaledInstance(this.imgsize[index], this.imgsize[index], Image.SCALE_SMOOTH));
buttons[index].setIcon(image);
if (count > 24){
count = 0;
index++;
}
if (count > 12 && index < 9)
{
this.imgsize[index+1]++;
image = new ImageIcon(this.images.getImagelist()
.get(index+1).getImage().getScaledInstance(this.imgsize[index+1], this.imgsize[index+1], Image.SCALE_SMOOTH));
buttons[index+1].setIcon(image);
}
if (index == 10) timer.stop();
repaint();
}
経験的アプローチとして考えるのではなく、その多くはタイムラインのようです。各画像はタイムラインに沿って開始点と終了点を持ち、タイムラインは可変長の時間を持つことができます。たとえば、2つの画像がある場合、最初の画像は0%から始まり75%で終了し、2番目の画像は50%から100%で終了します。その考え方は、各要素の進行をローカライズし、タイムラインを通る進行に基づいて、それ自身の局所的な時間枠に沿って進行の量を計算することです...単純な、ああ;) – MadProgrammer
私のカウント変数タイムラインの進歩として? 0から始まり、25に達したら次のアニメーションを開始します.50が最初のアニメーションを完成すると、カウントが25ステップに達するたびに、次の要素のペアに移動できますか? –
タイムラインは時間(0-1)の正規化されたコンセプトであり、画像はこのタイムラインに沿って異なる間隔(最初の画像では0 .0.75、2番目の画像では0.5-1.0)で動作を行います、あなたが2つの画像を持っているとき) – MadProgrammer