由于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工具网。
推荐阅读: