美文网首页
Canvas and Drawable官网翻译

Canvas and Drawable官网翻译

作者: 好奇的小刺猬 | 来源:发表于2017-12-22 20:46 被阅读14次

    Canvas and Drawable

    翻译一下官网:画布和可绘制对象。有很多是百度翻译的,水平有限,一些不太规范的说法在所难免。

    Android框架提供了一组二维绘图API,允许您将自己的自定义图形呈现到画布上,或者修改现有视图以定制它们的外观和感觉。您通常用以下方式之一绘制二维图形:

    • a) 绘制到View:在布局中的视图对象上绘制图形或动画。通过使用此选项,系统的着色管道或处理您的图形,您需要在视图内定义图形。
    • b) 绘制到Canvas:在画布对象中绘制图形。使用这个选项,你将你的画布canvas传递到相应的类中的onDraw(Canvas)方法中,您还可以使用画布中的绘图方法,这种方式也能让你控制任何动画。

    当你想绘制不需要动态改变的简单图形,并且它也不是一个性能密集型app的一部分,比如游戏app这样注重性能的游戏时,绘制到View是一个不错的选择。例如,当在静态应用程序中显示静态图形或预定义动画时,应该将图形绘制到视图中。欲了解更多信息,阅读下面Drawables的介绍。

    如果你的app需要规律性的重绘,绘制大Canvas是更好的选择。这类app,比如视频游戏,应该自己绘制到Canvas上。当然,有多种方法可以实现这一点:

    • a) 在应用程序的主线程,你在你的布局里创建了一个自定义View自定义视图,调用invalidate(),然后OnDraw(Canvas)j就会自动回调。
    • b) 在一个管理SurfaceView的子线程,使用画布的绘制方法时,不需要调用invalidate()。

    利用canvas绘制

    您可以满足一个应用程序的需求,该应用程序需要通过绘制到画布上来实现图形动画的特殊绘图和/或控制。一个画布作为一个pretense(这个怎么翻译合适?借口,伪装),或接口,到你实际的图形绘制的表面上,您可以执行您的绘图操作到画布上。通过画布,你的应用程序可以绘制出底层的Bitmap对象,放置在窗口中。

    如果你是利用OnDraw(Canval)回调,那么Canvas已经在这个方法参数里提供给你了,你只需要在此基础上实行你的绘制。如果你使用SurfaceView对象,你可以从lockcanvas()获得一个Canvas。这两个场景都在下面的章节中有讨论。

    如果需要创建一个新的Canvas对象,那么您必须定义绘制到窗口中所需的底层Bitmap对象。下面的代码示例演示如何从Bitmap创建一个Canvas:

    Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    

    可以利用drawBitmap()方法在不同的canvas中使用同一个Bitmap。然而,我们建议您使用OnDraw(Canvas)回调或lockCanvas()方法提供的Canvas。更多信息,参看Drawing on a View和Drawing on a SurfaceView。

    Canvas偶自己的绘制方法集合,包括drawBitmap(), drawRect(), drawText(),以及其他很多方法。你可能用到的其他类也会有draw()方法。比如,你可能有一些Drawable对象想绘制在Canvas上,Drawable类有它自己的draw(Canvas)方法,可以接收你的Canvas作为绘制参数。

    Drawing on a view

    如果你的应用程序不需要大量处理或高帧率要求(例如棋牌游戏,贪吃蛇游戏,或其他慢动画app)你应该考虑创建一个自定义的视图,在视图中利用View.onDraw(Canvas)提供的canvas绘制。最方便的是使用Android框架提供的一个预定义的canvas,可以执行绘图操作。

    首先,创建视图的子类,实现OnDraw(Canvas)回调,Android框架会调用这个方法进行视图绘制,然后通过框架提供的Canvas对象执行绘制操作。

    Android框架只或在必要时调用OnDraw(Canvas)。当到了你app重绘的时间,你必须调用invalidate()重绘view。调用invalidate()表明你想要view重绘,Android随后就会调用OnDraw(Canvas)方法,不过这个调用不能保证是立即执行的。

    在你的View的OnDraw(Canvas)方法中,调用canvas的或其他类的绘制方法,canvas作为绘制参数。一旦你的onDraw()完成,Android框架将使用你的canvas去绘制一个由系统处理过的位图。

    注意:如果是主线程以外的子线程让view重绘,必须调用postInvalidate()代替invalidate()。

    有关自定义View的说明,请参考Creating a view class

    Drawing on a SurfaceView

    SurfaceView是View的一个特殊子类,提供了一个在视图层次结构中一种专用的绘图表面。目的是向工作子线程提供这个绘图表面。这样,应用程序不需要等到系统的视图层次结构准备好了才能绘制。相反,一个持有SurfaceView对象的工作者线程,可以按自己的节奏在自己的画布上绘制。

    首先,你需要创建一个新的类继承SurfaceView,这个子类需要实现SurfaceHolder.Callback接口,这个回调接口提供了相应Surface对象发生的事件,如当它的创建,更改,或销毁的时候。这些事件让您知道何时可以开始绘图,是否需要根据新的surface属性进行参数调整,何时停止绘图和潜在地终止某些任务。子类SurfaceView也是定义子线程的合适场所,子线程会在你的cavas上调用所有的画图程序。

    相对于直接操作Surface对象,你应该通过一个SurfaceHolder来控制它。在你的SurfaceView对象初始化后,你可以通过调用getholder()得到SurfaceHolder对象,你需要通过调用addCallback()注册你的SurfaceView对象来接收SurfaceHolder的通知,然后在SurfaceView子类中实现每个SurfaceHolder.Callback抽象方法。

    你可以从一个持有SurfaceHolder对象的子线程访问surface的canvas,当app需要重绘surface时,从子线程执行以下步骤:

    1. 使用lockCanvas()获取Canvas。

    2. 在Canvas上执行绘图操作。

    3.通过调用unLockcanvasAndPost(Canvas)传递你要执行绘制操作的Cavas对象。

    Surface绘制Canvas,将涉及到您在上面执行的所有绘图操作。

    注意:每次从SurfaceHolder获取的Canvas时,Canvas的前一状态都会保持。为了让绘制的图形能正确地动画,你必须重画整个surface。例如,你可以用drawcolor()方法填充Canvas为一个颜色或使用drawbitmap()方法设置Canvas背景否则,这样,您的画布可以显示以前的绘制历史。

    相关文章

      网友评论

          本文标题:Canvas and Drawable官网翻译

          本文链接:https://www.haomeiwen.com/subject/kjwxgxtx.html