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);
}

};

}
}

更多相关文章

  1. Android(安卓)应用程序窗体显示状态操作(requestWindowFeature()
  2. Android(安卓)TextView setText卡顿问题
  3. ubuntu下eclipse Android(安卓)ADT中SDK Manager中安装SDK失败的
  4. Android客户端性能优化
  5. android之创建和读取自定义资源文件
  6. Android(安卓)8.1 从零开始写 HAL -- (3) 实现 Bp、Bn 端
  7. Android(安卓)高仿微信头像截取 打造不一样的自定义控件
  8. 【OpenGL】Android(安卓)中的 skia 和 OpenGL ES
  9. Android(安卓)OpenGL ES

随机推荐

  1. 手把手搭建 android 开发环境||资源打包
  2. Android(安卓)Java层 Looper 机制
  3. 修改 Android(安卓)模拟器 density
  4. android学习小结2
  5. android硬件加速后webview闪烁问题
  6. iOS、Android、WebOS系统体系架构的比较
  7. Android(安卓)EditText控件使用
  8. Android全屏及屏幕切换
  9. Android笔记1
  10. android core dump测试