int w , h, frameInd=0,waveLen=2,freq=8,wavaSpace=2; int rgbData[],frame[][]; public MainCanvas(){ try{ img=Image.createImage("/pic/demo.png"); w = img.getWidth(); h = img.getHeight(); rgbData = new int[w * h]; frame=new int [4][320 / freq * waveLen * w]; img.getRGB(rgbData, 0, w, 0, 0, w, h); for(int i = 0; i < 320 / freq; i++){ System.arraycopy(rgbData, i * freq * w, frame[0], i * waveLen * w, waveLen * w); System.arraycopy(rgbData, (i * freq + wavaSpace) * w, frame[1],i * waveLen * w, waveLen * w); System.arraycopy(rgbData, (i * freq + wavaSpace*2) * w, frame[2],i * waveLen * w, waveLen * w); System.arraycopy(rgbData, (i * freq + wavaSpace*3) * w, frame[3],i * waveLen * w, waveLen * w); for(int j=0;j<waveLen*w;j++){ frame[0][j + i * waveLen * w] &= 0x90ffffff; frame[1][j + i * waveLen * w] &= 0x90ffffff; frame[2][j + i * waveLen * w] &= 0x90ffffff; frame[3][j + i * waveLen * w] &= 0x90ffffff; } } new Thread(this).start(); setFullScreenMode(true); }catch(Exception e){} } public void paint(Graphics g){ g.drawImage(img,0,0,20); for(int i=0;i<320/freq;i++) g.drawRGB(frame[frameInd], i*waveLen*w, w, 0, i*freq+(frameInd+1)*wavaSpace, w, waveLen, true); } public void run(){ long t1,t2; while(true){ t1=System.currentTimeMillis(); frameInd = (frameInd + 1) % 4; repaint(); t2=System.currentTimeMillis(); try{ if(t2-t1<350) Thread.sleep(350+t1-t2); }catch(Exception e){} } } 调整帧数,水波的宽度和间隔可以产生不同的效果。但一定要使移动的位置实现循环。