Android2D绘图一

View

只是把Graphic 资源(images,shapes,colors,pre-defined animation等等这些Android已经实现的一些画图操作)放入View体系,由系统 来将这些Graphic画出来。


View canvas — 使用普通 View 的 Canvas 画图

(1)定义一个自己的View :class your_view extends View{} ;
(2)重载View的onDraw方法:protected void onDraw(Canvas canvas){} ;
(3)在onDraw方法中定义你自己的画图操作 ;
除此之外:可以定义自己的Btimap:
// 当自己新建 Canvas 时,需要自己创建一个 bitmap 来存储和显示绘图结果
Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);// 必须将这个Bitmap放入View的canvas中,画的 图才能显示出来

Surface View Canvas — 使用专门的 SurfaceView 的 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 中启动这个线程


2D 绘图相关 API

要掌握Android 2D Graphics必须要熟悉这三个包的各种API。

  • 绘图基本要素:
    Canvas
    Paint
    Bitmap,BitmapFactory,BitmapRegionDecoder,ImageFormat,Movie,NinePatch,YuvImage

  • 过渡模式:
    Xfermode,AvoidXfermode,PixelXorXfermode,PorterDuffXfermode
    PorterDuff

  • 过滤:
    1、rgb过滤 ColorFilter ,ColorMatrixFilter,PorterDuffColorFilter,LightingColorFilter,PorterDuffColorFilter
    2、alpha过滤 MaskFilter,BlurMaskFilter,EmbossMaskFilter
    3、DrawFilter,PaintFlagsDrawFilter
    变换:
    Matrix,Camera,ColorMatrix

  • 颜色:
    Color

  • 渐变:
    Shader
    BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient

  • 路径
    Path:
    PathEffect,ComposePathEffect,CornerPathEffect,DashPathEffect,DiscretePathEffect,PathDashPathEffect,PathMeasure,SumPathEffect

  • Rasterizer,LayerRasterizer

  • Interpolator,

  • Picture

  • PixelFormat

  • Point,PointF,Rect,RectF

  • SurfaceTexture

  • Typeface

  • Region,RegionIterator

  • Drawable系列

  • Shape系列
总结 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

二、3D画图

针对 3D 画图 SDK 上讲得很简单,就是继承一个 View,然后在这个 View 里面获得 Opengl 的句柄进行画图,道理和 2D 一样的,差别就是一个是使用 2D 的 API 画图,一个是使用 3D 的。
因为 3D openGl ES 具有一套本身的运行机制,比如渲染的过程控制等,因此 Android 提供了一个专门的画图类 GLSurfaceView。这个类被放在一个单独的包 android.opengl 里面,其实现了其他 View 所不具备的操作:
(1) 画图是在一个专门的 Surface 上进行, 这个 Surface 可以最后被组合到 android 的 View 体系中;
(2) Opengl 的运行周期可以与 Activity 的生命周期协调
(3) 具有 OpenGL ES 调用过程中的错误跟踪,检查工具,方便了 Opengl 编程过程的 debug
(4) 可以根据 EGL 的配置来选择自己的 buffer 类型,比如 RGB565,depth=16
(5) 通过 render 来画图,而且 render 对 Opengl 的调用是在一个单独的线程中
GLSurfaceView 是 Android 提供的一个非常值得学习的类,它实际上是一个如何在 View 中添加画图线程的例子,如何在 Java 中使用线程的例子,如何添加事件队列的例子。具体的源码在:/framworks/base/opengl/java/android/opengl/GLSurfaceView.java
GLSurface 画 3D 图形的步骤:
(1)选择画图需要的buffer类型即:EGL配置 setEGLConfigChooser();
(2)选择是否需要Debug信息
setDebugFlags(int)
setGLWrapper(GLSurfaceView.GLWrapper)
(3)为 GLSurfaceView 注册一个画图的 renderer
setRenderer(GLSurfaceView.Renderer)
(4) 设置 render mode:持续渲染或根据命令渲染, setRenderMode(int)
(5) Opengl 的运行和 Activity 的生命周期绑定在一起, 也就是说 Activity pause 的时候,opengl 的渲染也必须 pause。除此之外,GLSurfaceView 提供了线程间交互的函数 queueEvent(Runnable),可以用在主线程和 render 线程之间的交互

class MyGLSurfaceView extends GLSurfaceView {
    private MyRenderer mMyRenderer;
    public void start() {
        mMyRenderer = ...;
        setRenderer(mMyRenderer);
    }
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
            queueEvent(new Runnable() {
                 // This method will be called on the rendering
                 // thread:
                public void run() {
                    mMyRenderer.handleDpadCenter();
                }});
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值