Android 图形用户界面 之 绘图(一)

来源:互联网 发布:淘宝儿童毛衣 编辑:程序博客网 时间:2024/05/20 01:36
  1.  
  2. import android.graphics.Bitmap;  
  3. import android.graphics.BitmapFactory;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Matrix;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Rect;  
  8. import android.util.Log;  
  9. import android.view.SurfaceHolder;  
  10. import android.view.SurfaceView;  
  11.     /** 
  12.      * http://wallage.blog.163.com/blog/static/173896242010101232220959/ 
  13.      * @author emmet1988.iteye.com 
  14.      * 
  15.      */  
  16. public class SurfaceViewDraw extends SurfaceView implements Runnable,SurfaceHolder.Callback {  
  17.       
  18.     private Bitmap backgroundBitmap;  
  19.     private Bitmap rotateBitmap;  
  20.     SurfaceHolder surfaceHolder;  
  21.       
  22.     public SurfaceViewDraw(Context context) {  
  23.         super(context);  
  24.         backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background_surfaceview);  
  25.         rotateBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rotate_surfaceview);  
  26.         surfaceHolder = this.getHolder();  
  27.         surfaceHolder.addCallback(this);      
  28.     }  
  29.   
  30.     public void surfaceCreated(SurfaceHolder holder) {  
  31.         new Thread(this).start();  
  32.         Log.d("surfaceview""surfaceCreated");  
  33.     }  
  34.   
  35.     public void surfaceChanged(SurfaceHolder holder, int format, int width,  
  36.             int height) {  
  37.         Log.d("surfaceview""surfaceChanged");  
  38.     }  
  39.   
  40.     public void surfaceDestroyed(SurfaceHolder holder) {  
  41.         Log.d("surfaceview""surfaceDestroyed");  
  42.     }  
  43.   
  44.     @Override  
  45.     public void run() {  
  46.         Log.d("surfaceview""run");  
  47.         Canvas canvas = null;  
  48.         int rotateValue = 0;//旋转角度  
  49.         int frameCount = 0;//帧计数器  
  50.         while (!Thread.currentThread().isInterrupted()) {  
  51.             try {      
  52. //              canvas = surfaceHolder.lockCanvas();//获取画布对象(获取整个屏幕的画布)  
  53.                 canvas = surfaceHolder.lockCanvas(new Rect(1010240250));//获取某个区域的画布  
  54.                 Paint paint = new Paint();  
  55.                 Log.d("surfaceview""rotateValue " +rotateValue+"|frameCount "+frameCount);  
  56.                 if (frameCount++ < 2) {//仅在第一次绘制时绘制背景  
  57.                     /*  
  58.                      * 这里为什么设置成<2,而不是1,是由于SurfaceView本身的双缓冲技术。 
  59.                         覆盖刷新其实就是将每次的新的图形绘制到上一帧去, 
  60.                         所以如果图像是半透明的,就要考虑重复叠加导致的问题了, 
  61.                         而如果是完全不透明的图形则不会有任何问题。 
  62.                         背景会在背景图和黑色背景之间来回闪。 
  63.                         这个问题其实是源于SurfaceView的双缓冲机制,我理解就是它会缓冲 
  64.                         前两帧的图像交替传递给后面的帧用作覆盖,这样由于我们仅在第一帧 
  65.                         绘制了背景,第二帧就是无背景状态了,且通过双缓冲机制一直保持下 
  66.                         来,解决办法就是改为在前两帧都进行背景绘制。 
  67.                      */  
  68.                     canvas.drawBitmap(backgroundBitmap, 00, paint);//绘制背景  
  69.                 }  
  70.                 //创建矩阵以控制图片的旋转和平移  
  71.                 Matrix matrix = new Matrix();  
  72.                 rotateValue += 40;  
  73.                 matrix.setRotate(rotateValue, rotateBitmap.getWidth()/2, rotateBitmap.getHeight()/2);  
  74. //              matrix.postRotate(rotateValue, rotateBitmap.getWidth()/2, rotateBitmap.getHeight()/2);  
  75. //              matrix.setTranslate(100, rotateValue);  
  76.                 if (rotateValue == 360) {  
  77.                     rotateValue = 0;    
  78.                 }  
  79.                 matrix.setTranslate(80,50);//设置左边距和上边距  
  80.                 //绘制问号  
  81.                 Log.d("surfaceview""canvas "+canvas);  
  82.                 Log.d("surfaceview""rotateBitmap "+rotateBitmap);  
  83.                 Log.d("surfaceview""matrix "+matrix);  
  84.                 Log.d("surfaceview""paint "+paint);  
  85.                 if (canvas != null) {  
  86.                     canvas.drawBitmap(rotateBitmap, matrix, paint);  
  87.                     //解锁画布,提交画好的图像  
  88.                     surfaceHolder.unlockCanvasAndPost(canvas);  
  89.                 }  
  90.                 Thread.sleep(30);  
  91.             } catch (InterruptedException e) {  
  92.                 Thread.currentThread().interrupt();  
  93.                 Log.d("surfaceview""InterruptedException");  
  94.             } finally {  
  95.                 Log.d("surfaceview""finally");  
  96.             }  
  97.         }  
  98.     }  
  99.   
  100. }  
0 0