java怎么做动态图片?怎么实现眨眼特效?

BSO 2020-08-31 11:43:52 java常见问答 6166

由于java编程语言内容的丰富性以及功能的强大性,我们经常将它应用于一些效果的实现。今天主要为大家介绍,怎么用java实现动态的图片效果,以及如何用java实现眨眼特效。

首先为大家介绍java实现gif动画效果示例(java显示动态图片),就是每隔一定的时间显示一张图片,全部图片文件位于“工作空间\项目名称\bin\动态图\花好月圆\”文件夹下。文件名类似:1001.jpg,1002.jpg,一直到1016.jpg。

然后为大家展示一个实例的代码:

/*
 * Donttai.java
 *
 * Created on __DATE__, __TIME__
 */
package 动态图;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 *
 * @author  __USER__
 */
public class Donttai extends javax.swing.JFrame implements Runnable
{
    /** Creates new form Donttai */
    public Donttai()
    {
        initComponents();
    }
    //String path = "E:\\Workspaces\\MyEclipse_9.0\\20120731\\bin\\动态图\\1\\10";
    //Java默认文件路径是项目的根目录,所以要手动加上bin及其以下的路径
    String path = "bin/动态图/花好月圆/10";
    int idx = 1;
    public void paint(Graphics g)
    {
        ImageObserver imageObserver = new ImageObserver()
        {
            @Override
            public boolean imageUpdate(Image img, int infoflags, int x, int y
                , int width, int height)
            {
                // TODO Auto-generated method stub
                return false;
            }
        };
        try
        {
            //g.drawImage(ImageIO.read(new File(Donttai.class.getResource("1.png").toString())), 20, 20, imageObserver);
            String temp = "";
            if (idx <= 9)
                temp = path + "0" + idx + ".jpg";
            else if (idx >= 10)
            {
                temp = path + idx + ".jpg";
            }
            g.drawImage(ImageIO.read(new File(temp)), 100, 50, 400, 300
                , imageObserver);
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    //GEN-BEGIN:initComponents
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents()
    {
        jButton1 = new javax.swing.JButton();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("jButton1");
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
            getContentPane());
        getContentPane()
            .setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(
                javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(
                javax.swing.GroupLayout.Alignment.TRAILING
                , layout.createSequentialGroup()
                .addContainerGap(483, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(35, 35, 35)));
        layout.setVerticalGroup(layout.createParallelGroup(
                javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(
                layout.createSequentialGroup()
                .addGap(37, 37, 37)
                .addComponent(jButton1)
                .addContainerGap(392, Short.MAX_VALUE)));
        pack();
    } // </editor-fold>
    //GEN-END:initComponents
    /**
     * @param args the command line arguments
     */
    public static void main(String args[])
    {
        //        java.awt.EventQueue.invokeLater(new Runnable()
        //        {
        //            public void run()
        //            {
        //                new Donttai().setVisible(true);
        //                
        //            }
        //        });
        Donttai donttai = new Donttai();
        donttai.setVisible(true);
        donttai.run();
    }
    //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    // End of variables declaration//GEN-END:variables
    @Override
    public void run()
    {
        // TODO Auto-generated method stub
        while (true)
        {
            repaint();
            if (idx < 16)
                idx++;
            else
                idx = 1;
            try
            {
                Thread.sleep(60);
            }
            catch (InterruptedException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

现在我们再来介绍一下如何用java实现眨眼特效。首先有几点注意事项:1.包名为:practice,文件名为:EyesJFrame;2.先看paint()方法第1条语句效果,把paint()方法中的其它语句注释掉;3. 再看paint()方法第1、2条语句效果,把paint()方法中的其它语句注释掉;4. 再看paint()方法第1、2、3条语句效果,把paint()方法中的其它语句注释掉;5.以上的方法类推,直到paint()方法中没有语句被注释。

接下来是实例代码展示:

/
package practice;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class EyesJFrame extends JFrame
{
    //设置角度值,同时也就眼睛的横坐标长度
    int angle = 300;
    //因为眨眼采用的sin()函数组成,所以其自然有幅值这一个属性。
    int amplitude = 30;
    //创建一个用于保存幅值的变化的变量,采用amplitude的缩写ampl,便于认识 ^_^
    int ampl = 0;
    //判断是否到了幅值的临界值,由线程维护
    boolean flag = true;
    //定义中心点坐标,个人喜好
    int centerX = 1024 / 2;
    int centerY = 768 / 2;
    //创建统一的颜色背景,如果你有兴趣调试的话,也许你就会知道为什么要这么做了。
    Color color = Color.red;
    //灰眼球的半径
    int blackBallSemi = 25;
    public EyesJFrame()
    {
        //这里面的内容在**的《动态中国太极图——Java原创》中有说明,不再做
        //详细介绍,当然您也可以参考一些书籍
        this.setTitle("Eyes");
        this.setSize(centerX * 2, centerY * 2);
        this.getContentPane()
            .setBackground(color);
        startRun();
        this.setVisible(true);
    }
    @Override
    public void paint(Graphics graphics)
    {
        super.paint(graphics);
        //以centerX,centerY为中心,在眼睛所在的地方绘制一个白色的背景底色,
        //长度为angle,宽为amplitude*2
        graphics.setColor(Color.white);
        graphics.fillRect(centerX - angle / 2, centerY - amplitude, angle, amplitude * 2);
        //以centerX,centerY为中心,绘制一个灰色的眼球
        //半径为blackBallSemi*2
        graphics.setColor(Color.darkGray);
        graphics.fillOval(centerX - blackBallSemi
            , centerY - blackBallSemi
            , blackBallSemi * 2
            , blackBallSemi * 2);
        //以centerX,centerY为中心,绘制一个白色的瞳孔
        //半径为blackBallSemi/2
        graphics.setColor(Color.white);
        graphics.fillOval(centerX - blackBallSemi / 2 / 2
            , centerY - blackBallSemi / 2 / 2
            , blackBallSemi / 2
            , blackBallSemi / 2);
        //使用和窗口一样的背景色将眼睛外框颜色去掉,这里使用sin()函数来完成,灵感来收音机自信号调制
        //在这里体现的方法其实就是画直线,把不需要的地方都画成与背景色相同的颜色,这里是中国红
        graphics.setColor(color);
        for (int i = 0; i < angle; i++)
        {
            graphics.drawLine(centerX - angle / 2 + i
                , centerY - 30
                , centerX - angle / 2 + i
                , centerY - (int)(Math.sin(Math.PI * i / angle) * ampl));
            graphics.drawLine(centerX - angle / 2 + i
                , centerY + 30
                , centerX - angle / 2 + i
                , centerY + (int)(Math.sin(Math.PI * i / angle) * ampl));
        }
    }
    /**
     * 用线程维护眼睛的眨眼效果,线程结构如下:
     *         1、该线程使用while(true)维护动态效果
     *         2、ampl用于表示当前的眨眼效果的幅值
     *         3、ampl的值限定在于0到amplitude之间,如果您对这个算法不理解,
     *             请像苍老师那样绘图模型图,但本人觉得您一定能秒杀这种算法  ^_^
     */
    public void startRun()
    {
        new Thread()
        {
            public void run()
            {
                while (true)
                {
                    if (flag)
                    {
                        ampl++;
                        if (ampl >= amplitude)
                        {
                            flag = false;
                        }
                    }
                    else
                    {
                        ampl--;
                        if (ampl <= 0)
                        {
                            flag = true;
                        }
                    }
                    try
                    {
                        Thread.sleep(40);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                    repaint();
                }
            };
        }.start();
    }
    public static void main(String[] args)
    {
        new EyesJFrame();
    }
}

上述内容就是有关如何用java做出动态图片和实现眨眼特效,想要了解更多java经典例子,敬请关注奇Q工具网。

推荐阅读:

java怎么做出简单的抽奖程序?实例代码展示

java移位运算符包括哪些?详细实例展示

java工厂模式例子,java实例代码