public class ClipBitmapMovie 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 ClipBitmapMovieView(this));
}
}
class ClipBitmapMovieView extends SurfaceView implements Callback,Runnable{
private SurfaceHolder mSurfaceHolder;
private Thread mThread;
private Canvas mCanvas;
private Paint mPaint;
private Bitmap mBitmap;
private int mCurrentFrame;
private boolean mFlag;
public ClipBitmapMovieView(Context context) {
super(context);
mSurfaceHolder=this.getHolder();
mSurfaceHolder.addCallback(this);
mPaint=new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mFlag=true;
mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.fish);
mThread=new Thread(this,"My Thread");
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 logic() {
mCurrentFrame++;
if(mCurrentFrame>=10){
mCurrentFrame=0;
}
}
private void myDraw() {
try {
mCanvas=mSurfaceHolder.lockCanvas();
if (mCanvas != null) {
mCanvas.drawColor(Color.WHITE);
mCanvas.clipRect(0, 0, mBitmap.getWidth()/10, mBitmap.getHeight());
mCanvas.drawBitmap(mBitmap, -mCurrentFrame*mBitmap.getWidth()/10, 0, mPaint);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (mCanvas != null) {
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
}
}
}
问题一:
mCanvas.drawBitmap(mBitmap, -mCurrentFrame*mBitmap.getWidth()/10, 0, mPaint);
刚开始对这个如何画出图片的参数不理解,通过跟踪调试发现当mCurrentFrame=1时,x和y位置参数是-1200/10,0,也就是说画图的坐标原点在x轴的负半轴上,而且mCurrentFrame越大离原点越远,画的时候是画的整幅图片但是因为clipPath()只截取了一帧的大小所以我们看到的只是一个。
所欲可以理解为从坐标原点开始不断将图片网x轴负半轴拉直到图片完全在x轴负半轴,然后重复这个操作。