Bitmap位图渲染与操作

public class BitmapTest 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 BitmapView(this)); } } class BitmapView extends SurfaceView implements Callback,Runnable{ private Paint mPaint; private Thread mThread; private boolean mFlag; private SurfaceHolder mSurfaceHolder; private Canvas mCanvas; private Bitmap mBitmap; public BitmapView(Context context) { super(context); mSurfaceHolder=this.getHolder(); mSurfaceHolder.addCallback(this); mPaint=new Paint(); mPaint.setColor(Color.WHITE); mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon); 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) { mFlag=true; 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(); try { if((end-start)<50){ Thread.sleep(50-(end-start)); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private void logic() { // TODO Auto-generated method stub } private void myDraw() { mCanvas=mSurfaceHolder.lockCanvas(); try { if (mCanvas != null) { mCanvas.drawColor(Color.WHITE); //Drawing a bitmap //mCanvas.drawBitmap(mBitmap, 0, 0, mPaint); //Rotate bitmap method one /*mCanvas.save(); mCanvas.rotate(30, mBitmap.getWidth() / 2, mBitmap.getHeight() / 2); mCanvas.drawBitmap(mBitmap, 0, 0, mPaint); mCanvas.restore(); mCanvas.drawBitmap(mBitmap, 100,0, mPaint);*/ //Rotate bitmap method two /*Matrix matrix=new Matrix(); matrix.postRotate(30, mBitmap.getWidth()/2, mBitmap.getHeight()/2); mCanvas.drawBitmap(mBitmap, matrix, mPaint);*/ //Translate bitmap method one /*mCanvas.save(); mCanvas.translate( 10, 10); mCanvas.drawBitmap(mBitmap, 0, 0, mPaint); mCanvas.restore();*/ //Translate bitmap method two /*Matrix matrix2=new Matrix(); matrix2.postTranslate(10, 10); mCanvas.drawBitmap(mBitmap, matrix2, mPaint);*/ //Scale bitmap method one /*mCanvas.save(); mCanvas.scale(2.0f, 2.0f, 50+mBitmap.getWidth()/2, 50+mBitmap.getHeight()/2); // mCanvas.drawBitmap(mBitmap, 0, 0, mPaint);Only zoom to this point,rather than move to this point. mCanvas.drawBitmap(mBitmap, 50, 50, mPaint); mCanvas.restore(); mCanvas.drawBitmap(mBitmap, 50, 50, mPaint);*/ //Scale bitmap method two /*Matrix matrix3=new Matrix(); matrix3.postScale(2.0f, 2.0f, 50+mBitmap.getWidth()/2, 50+mBitmap.getHeight()/2); mCanvas.drawBitmap(mBitmap, matrix3, mPaint); mCanvas.drawBitmap(mBitmap, 50,50, mPaint);*/ //Reverse bitmap image method one //X reverse /*mCanvas.drawBitmap(mBitmap ,0,0, mPaint); mCanvas.save(); mCanvas.scale(-1, 1, 100+mBitmap.getWidth()/2, 100+mBitmap.getHeight()/2); mCanvas.drawBitmap(mBitmap, 100, 100, mPaint); mCanvas.restore();*/ //Y reverse /*mCanvas.drawBitmap(mBitmap ,0,0, mPaint); mCanvas.save(); mCanvas.scale(1, -1, 100+mBitmap.getWidth()/2, 100+mBitmap.getHeight()/2); mCanvas.drawBitmap(mBitmap, 100, 100, mPaint); mCanvas.restore();*/ //Reverse bitmap image methhod two //X reverse /*mCanvas.drawBitmap(mBitmap, 0,0, mPaint); Matrix matrix4=new Matrix(); matrix4.postTranslate(100, 100); matrix4.postScale(-1, 1, 100+mBitmap.getWidth()/2, 100+mBitmap.getHeight()/2); mCanvas.drawBitmap(mBitmap, matrix4, mPaint);*/ //Y reverse mCanvas.drawBitmap(mBitmap, 0,0, mPaint); Matrix matrix5=new Matrix(); matrix5.postTranslate(100, 100); matrix5.postScale(1, -1, 100+mBitmap.getWidth()/2, 100+mBitmap.getHeight()/2); mCanvas.drawBitmap(mBitmap, matrix5, mPaint); } } catch (Exception e) { // TODO: handle exception }finally{ if(mCanvas != null){ mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } }

Bitmap位图渲染与操作Bitmap位图渲染与操作

问题一

matrix5.postScale(1, -1, 100+mBitmap.getWidth()/2, 100+mBitmap.getHeight()/2);

postScale(theScaleFactorX,theScaleFactorY,myMidpointX,myMidpointY)

前面的两个参数分别表示x轴和y轴放锁定的比例,正负表示的是是否反转,后面两个参数表示的是以哪一点进行旋转和缩放

问题二
mCanvas.save(); mCanvas.scale(2.0f, 2.0f, 50+mBitmap.getWidth()/2, 50+mBitmap.getHeight()/2); // mCanvas.drawBitmap(mBitmap, 0, 0, mPaint);Only zoom to this point,rather than move to this point. mCanvas.drawBitmap(mBitmap, 50, 50, mPaint); mCanvas.restore();