public class BitmapMovie extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new BitmapMovieView(this));
}
}
class BitmapMovieView extends SurfaceView implements Callback,Runnable{
private SurfaceHolder mSurfaceHolder;
private Paint mPaint;
private Canvas mCanvas;
private Thread mThread;
private Bitmap mBitmap;
private int mBmpX;
private int mBmpY;
private boolean mFlag;
public BitmapMovieView(Context context) {
super(context);
mSurfaceHolder=this.getHolder();
mSurfaceHolder.addCallback(this);
mPaint=new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
setFocusable(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.water);
mBmpX=-mBitmap.getWidth()+this.getWidth();
mBmpY=this.getHeight()-mBitmap.getHeight();
mFlag=true;
mThread=new Thread(this,"My Draw");
mThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mFlag=false;
}
@Override
public void run() {
while (mFlag) {
long start=System.currentTimeMillis();
myDraw();
logic();
long end=System.currentTimeMillis();
if ((end-start)<50) {
try {
Thread.sleep(50-(end-start));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private void myDraw() {
try {
mCanvas=mSurfaceHolder.lockCanvas();
if (mCanvas != null) {
mCanvas.drawColor(Color.WHITE);
mCanvas.drawBitmap(mBitmap, mBmpX, mBmpY, new Paint());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
private void logic() {
mBmpX+=5;
}
}
这会产生动态水波的效果,其实这种效果是在不断的将这个图片右移不同的重新画上去的,而不是真的水波效果。
mBmpX=-mBitmap.getWidth()+this.getWidth();
-1068=-1388+320;
算出来图片的x坐标是-1068,在画图的时候虽然不在屏幕上但是是可以的,相当于是在相对于屏幕左上角为圆点的坐标系中,这个的坐标是负的。