android绘图小结

1、Simple Graphics in View
就是直接使用Android已经实现的一些画图操作,比如说images,shapes,colors,pre-defined animation等等,这些简单的画图操作实际上是由skia来提供的2D图形操作。使用这些预定义好的操作,我们可以实现诸如贴一张背景图啊,画出简单地形状阿,实现一些简单的动画之类的操作。这里的简单可以这么理解,就是我们在这里没有一笔一画地构造出一个图形出来,我们只是把我们的Graphic 资源放入View体系中,由系统 来将这些Graphic画出来。
2、Canvas
首先我们要明白这个Canvas是一个2D的概念,是在Skia中定义的。也就是说在这个方式下还是说的画2D图形。我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。
下面是这两种方式的典型sequence :
2.1、View canvas
(1)  定义一个自己的View :class your_view extends View{}  ;
(2)  重载View的onDraw方法:protected void onDraw(Canvas canvas){} ;
(3)  在onDraw方法中定义你自己的画图操作 ;
     上面这个绘画方式,是根据系统请求或用户的请求,进行整个View hierarchy 回调各个View 的onDraw方法,因此效果比较慢!
2.2、Surface View Canvas
(1)  定义一个自己的SurfaceView : class your_surfaceview extends SurfaceView  implements SurfaceHolder.Callback() {}  ;
(2)实现SurfaceHolder.Callback的3个方法surfaceCreated() ,surfaceChanged() ,surfaceDestroyed() ;
(3)  定义自己的专注于画图的线程  : class your_thread extends Thread() {} ;
(4)  重载线程的run()函数  [一般在run中定义画图操作,在surfaceCreated中启动这个线程]
(5)  画图的过程一般是这样的:
SurfaceHolder surfaceHolder = getHolder() ; //取得holder,这个holder主要是对surface操作的适配,用户不具备对surface操作的权限
surfaceHolder.addCallback(this) ;                          //注册实现好的callback
Canvas canvas = surfaceHolder.lockCanvas() ;      //取得画图的Canvas
/*---------------------------------画图
 **-------------------------------- 画图结束*/
surfaceHolder.unlockCanvasAndPost() ;                //提交并显示

2D画图用到的包 :
android.view                   //画图是在View中进行的
android.view.animation //定义了一些简单的动画效果Tween Animation 和 Frame.   
Animation
android.graphics      //定义了画图比较通用的API,比如canvas,paint,bitmap等
android.graphics.drawable //定义了相应的Drawable(可画的东西),比如说BitmapDrawable,
PictureDrawable等
android.graphics.drawable.shapes         //定义了一些shape
3、openGL ES
3D画图SDK上讲得很简单,只是提了一个通用的方式,就是继承一个View,然后在这个View里面获得 Opengl的句柄进行画图,道理应该来说是和2D一样的,差别就是一个是使用2D的API画图,一个是使用3D的。不过因为3D openGL ES具有一套本身的运行机制,比如渲染的过程控制等,因此Android为我们提供了一个专门的用在3D画图上的 GLSurfaceView。这个类被放在一个单独的包android.opengl里面。

Android.opengl     //主要定义了GLSurfaceView
javax.microedition.khronos.egl   //java层的egl接口
javax.microedition.khronos.opengles  //opengl API


public class ActA extends Activity {
     /** Called when the activity is first created. */
     private Paint mBackgroudPaint;
     private int backgroundColor=0xff00ff00;// 背景颜色
     private int mN=0;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         LinearLayout Mainlayout = new LinearLayout(this);
         Mainlayout.setOrientation(LinearLayout.VERTICAL);
         Button button=new Button(this);
         button.setText("button");
         Mainlayout.addView(button);
         Mainlayout.addView(new MyView(this));
         setContentView(Mainlayout);
         int [][] array=new int[2][];
         Log.d("liuwei", "array.length == "+array.length);
         array[0]=new int[0];
         for(int i=0;i<array.length;i++){
             Log.d("liuwei", "array["+i+"] == "+array[0].length);
         }
     }

     class MyView extends SurfaceView implements SurfaceHolder.Callback{

        private SurfaceHolder mHolder;
        private Canvas canvas;
         public MyView(Context context) {
             super(context);
           mHolder = getHolder();
           mHolder.addCallback(this);
           mBackgroudPaint=new Paint();
           mBackgroudPaint.setColor(backgroundColor);
        }
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                 int height) {
            Log.d("liuwei", "surfaceChanged == ");
         }
         public void surfaceCreated(SurfaceHolder holder) {
           mN++;
           Log.d("liuwei", "mN == "+mN);
           RectF rect=new RectF(0,0,this.getRight()-this.getLeft(),this.getBottom()-this.getTop());
           if(mN>3){
               backgroundColor=0xff00ffff;
           }
           Rect dirty=new Rect(40,100,100,200);
           canvas = mHolder.lockCanvas(dirty);
           canvas.drawRoundRect(rect, 40.0f, 40.0f, mBackgroudPaint);
           Paint mPaint = new Paint();
           mPaint.setColor(Color.BLUE);
           canvas.drawRect(100, 200, 200, 300, mPaint);

           canvas.save();
           canvas.rotate(45);
           mPaint.setColor(Color.RED);
           canvas.drawRect(150, 10, 200, 60, mPaint);
           canvas.restore();
           canvas.clipRect(new RectF(20,20,100,100));
           mPaint.setColor(Color.BLUE);
           canvas.drawRect(200, 400, 300, 500, mPaint);

           mHolder.unlockCanvasAndPost(canvas);
           new Thread(run).start();
         }
        public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
        }
        private Runnable run=new Runnable(){

            public void run() {
                // TODO Auto-generated method stub
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Log.d("liuwei", " in run ");
                Rect dirty=new Rect(40,100,100,200);
                mHolder.lockCanvas(dirty);
//                dirty.set(40,100,100,200);
                RectF rect=new RectF(0,0,MyView.this.getRight()-MyView.this.getLeft(),MyView.this.getBottom()-MyView.this.getTop());
                mBackgroudPaint.setColor(0xff00ffff);
                canvas.clipRect(dirty);
//                canvas.save();
//                canvas.clipRect(new Rect(20,20,100,100));
                canvas.drawRoundRect(rect, 40.0f, 40.0f, mBackgroudPaint);
//                canvas.restore();
                mHolder.unlockCanvasAndPost(canvas);
            }

        };

     }
}

你可能感兴趣的:(thread,游戏,android)