mainActiviry如下:
package com.cn; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { private DrawBitmapView mDrawBitmapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDrawBitmapView=new DrawBitmapView(MainActivity.this, null); setContentView(mDrawBitmapView); } }
DrawBitmapView如下:
package com.cn; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; //问题0: //Matrix m1=new Matrix(); //注意这个类的包的引入,android.graphics.Matrix //问题1: //post和set以及pre的使用 //这三种都可以改变Matrix但是用法不太一样 //1.1若连续多次使用set那么只有最后一个set起到作用 //1.2常用的是第一次时用set,在随后都采用post的方式 // 表示追加. //1.3pre表示最先发生.即会在post和set前发生 //问题2: //Rotate默认是以(0,0)为参照点 //所以常要设置参考旋转点 //m1.postRotate(30,70,100); //问题3: //设置Alpha的时候 //mPaint.setAlpha(30); //取值范围为[0..255] //备注: //最好将以下测试方法,分开进行 public class DrawBitmapView extends View { Bitmap mBitmap; Paint mPaint; public DrawBitmapView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public void initView(){ mPaint=new Paint(); mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // // ----->测试1: // //先绘制一个图形 // //然后绘制经过位移,旋转,缩放后的图形(方法1) // //第一次绘制 // mPaint.setAntiAlias(true); // canvas.drawBitmap(mBitmap, 50, 50, mPaint); // canvas.save(); // //第二次绘制 // Matrix m1 = new Matrix(); // m1.setTranslate(70, 100); // m1.postScale(1.5f, 1.5f); // m1.postRotate(30, 70, 100); // canvas.drawBitmap(mBitmap, m1, mPaint); // // ----->测试2: // // 先绘制一个图形 // // 然后绘制经过位移,旋转,缩放后的图形(方法2) // // 第一次绘制 // mPaint.setAntiAlias(true); // canvas.drawBitmap(mBitmap, 50, 50, mPaint); // canvas.save(); // // 第二次绘制 // Matrix m2 = new Matrix(); // m2.setTranslate(70, 100); // m2.postScale(1.5f, 1.5f); // Matrix m3=new Matrix(); // mPaint.setAlpha(50); // m3.setRotate(30, 70, 100); // //利用setConcat衔接两个变换 // Matrix m4=new Matrix(); // m4.setConcat(m2, m3); // canvas.drawBitmap(mBitmap, m4, mPaint); // canvas.restore(); // canvas.save(); // ----->测试3:preXXX()方法和xxxSkew()方法 //该类方法会在当前矩阵的最前面发生 //比如在该例子中,会先旋转后位移 // 第一次绘制 mPaint.setAntiAlias(true); canvas.drawBitmap(mBitmap, 50, 50, mPaint); canvas.save(); // 第二次绘制 Matrix m5=new Matrix(); m5.setTranslate(100, 200); m5.preRotate(30, 50, 50); //skew表示倾斜 m5.postSkew(0.2f, 0.2f, 50, 50); canvas.drawBitmap(mBitmap, m5, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } }