Android的自定义控件Canvas解析

自定义控件分为两种一种是自定义ViewGroup控件,一种是自定义View控件;跟踪View的步伐其实能跟到Java实现的最下面我们能发现的也就只有Canvas了,再下去就是C++或C实现了;所以本文主要是站在设计的的角度讲解一下Canvas跟View的关系,再简单分析一下Canvas用法;

View作为Android中一切显示视图的父类,我们可看到它的绘制方法draw(Canvas canvas)中,无非也是通过Canvas的绘制来达到各种View的显示,如此Android中各种控件如:ImageView,TextView,EditTextView等都是通过Canvas根据传递的各个参数绘制不同的视图,从而形成各种不同的视觉控件;当然我们也可以通过继承View的onDraw方法,用Canvas绘制一些自定义图像,这就是最简单的自定义控件了,当然如果需要各种事件响应,就需深刻了解View的事件处理逻辑。

这里做个简单的比喻:如果把一个Android界面比喻成窗户,那么每一个View就是一块玻璃,整个框架就是ViewGroup了,而每一块玻璃上的图案就是我们说的Canvas,如果没有Canvas我们是什么都看不到的(只有透明的玻璃),而接收各种事件处理还是由玻璃(View)接收处理,通知刷新图案就是(Canvas)了,这就是简单的View与Canvas的关系。很明显,它们分工很明确,View只需要负责处理事件交互,而Canvas只负责根据View提供的参数来显示与刷新图像。当然如果你要多个View同时显示那就需要VIewGroup参与了。下面学习一下Canvas的基本用法:

Canvas基本用法分为两种:

1、直接在View的onDraw方法里面直接绘制;(这是有载体View(上面例子的玻璃)的情况下直接绘制图案,比如我们可以复写系统控件,根据需要再添加或修改我们需要的元素)

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/

2、Canvas canvas = new Canvas(),这里仅仅是New的一个画布,我们是看不到的,它也无法处理任何事件,仅仅绘制修饰图像,至于显示与接收事件处理必须要有载体(View)才行;

Canvas有很多自己的绘制方法,但是最终都是调用底层代码实现:下面分类介绍一下Canvas常用方法:

1、save,saveLayer,restore方法保存与还原;

save(int saveFlags);可以指定还原哪些内容:

源码:

// the SAVE_FLAG constants must match their native equivalents

    /** restore the current matrix when restore() is called */
    public static final int MATRIX_SAVE_FLAG = 0x01;
    /** restore the current clip when restore() is called */
    public static final int CLIP_SAVE_FLAG = 0x02;
    /** the layer needs to per-pixel alpha */
    public static final int HAS_ALPHA_LAYER_SAVE_FLAG = 0x04;
    /** the layer needs to 8-bits per color component */
    public static final int FULL_COLOR_LAYER_SAVE_FLAG = 0x08;
    /** clip against the layer's bounds */
    public static final int CLIP_TO_LAYER_SAVE_FLAG = 0x10;
    /** restore everything when restore() is called */
    public static final int ALL_SAVE_FLAG = 0x1F;

saveLayer(RectF bounds, Paint paint, int saveFlags);Canvas利用此方法进行图层管理,可以根据区域保存当前图层,绘制完成之后利用restoreToCount将图层绑定;

2、draw方法;

drawColor,drawRGB,drawARGB,绘制颜色

drawPath,drawLines,drawOval等绘制几何图形;

drawBitmap,drawPictur绘制图片 ;

drawText绘制文字;

3、clipRegion,clipPath,clipRect裁剪,这里特别注意的有两种:

一是Region.Op中各种参数的含义;

二是Clip(剪切)的时机,是在canvas绘制之前完成对canvas的裁剪,而不是图像;

4、还有一些是与动画相关的Matrix操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种; 这里特意说明一下,这里Canvas进行matrix变化的时候相对坐标为(0,0);我们进行任何操作的时候,注意canvas.translate(scrollX, scrollY);canvas.translate(-scrollX, -scrollY);的意义。

Canvas具体用法这里不再阐述了,网上资料多多。。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android canvas
, view
, 控件
, android自定义view
, canvas
, 方法
, 事件
, 自定义view
, restore
, android 自定义控件
, android图片裁剪
, 自定义控件android界面
, 自定义控件旋转android
view自定义
android 自定义控件、android的自定义控件、android 自定义控件库、android自定义控件xml、android中自定义控件,以便于您获取更多的相关知识。

时间: 2024-10-28 22:29:26

Android的自定义控件Canvas解析的相关文章

Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了.因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画

《Android 源码设计模式解析与实战》——第2章,第2.8节无名英雄——深入理解LayoutInflater

2.8 无名英雄--深入理解LayoutInflater LayoutInflater在我们的开发中扮演着重要的角色,但很多时候我们都不知道它的重要性,因为它的重要性被隐藏在了Activity.Fragment等组件的光环之下. LayoutInflater是一个抽象类,具体代码如下: public abstract class LayoutInflater { // 代码省略 } 既然是抽象不是具体的,那我们必须把这个深藏功与名的"家伙"找出来!需要先从layoutInflater的

android:自定义控件时,需要的那个ondraw()方法具体是怎么绘制的?

问题描述 android:自定义控件时,需要的那个ondraw()方法具体是怎么绘制的? android:自定义控件时,需要的那个ondraw()方法具体是怎么绘制的? 因为不了解现在自定义控件的知识,所以请教大神... 解决方案 你好好读读<Android群英传>或者<Android开发艺术探究>吧!这个三言两语讲不清楚 解决方案二: 来我给你两个网址:http://blog.csdn.net/guolin_blog/article/details/17357967http://

Android中自定义控件之液位指示器_Android

由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,只是做一个控件,液位指示,其实就是继承自progressbar,然后重新写一测量与绘制,算是对自定义控件进行一下复习. 我们要做的最终就是下面这个效果: 在这里,我们要做到对这个指示器的以下属性可设置: 容器壁的厚度.容器壁的颜色.容器中液体的宽度.液体总高度.液体当前高度的颜色显示.液体未达到颜色显示.当前高度的文字指示.指

Android中自定义控件之液位指示器

由于安卓应用很广泛,在工业中也常有一些应用,比如可以用安卓来去工业中的一些数据进行实现的监测,显示,同时可以做一些自动化控制,当然在这里,我不是做这些自动化控制方面的研究,只是做一个控件,液位指示,其实就是继承自progressbar,然后重新写一测量与绘制,算是对自定义控件进行一下复习. 我们要做的最终就是下面这个效果: 在这里,我们要做到对这个指示器的以下属性可设置: 容器壁的厚度.容器壁的颜色.容器中液体的宽度.液体总高度.液体当前高度的颜色显示.液体未达到颜色显示.当前高度的文字指示.指

android 环信json解析是怎么解析的

问题描述 android 环信json解析是怎么解析的 [msg{from:sb111111, to:sb222222 body:txt:"a"]这种的json是怎么写的,我用的是fastjson,所以我想看一下实体类的代码,求求!!! 解决方案 本文采用三种方法,解析Json文件,具体在代码那个都有解析 不多说,贴代码: ? ?// SampleActivity.java package com.yline.jsonparse; import android.app.Activity

解析json数据-android 开发中 json解析问题出错啊

问题描述 android 开发中 json解析问题出错啊 {"msg":1,"msgbox":"返回歌手分类!","data":"[ { "rownum":"11","id":"1047","userName":"敖日格勒","picurl":"mobile1_1047

Android开发之xml解析技术

 在Android中,常见的XML解析器分别为DOM解析器.SAX解析器和PULL解析器,下面,我将一一向大家详细介绍.   第一种方式:DOM解析器: DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML树.检索所需数据.分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息.Android完全支持DOM 解析.利用DOM中的对象,可以对XML文档进行读取.搜索.修改.添加和删除等操作. DOM的工作原理:使用DOM对XML文件进行操作时,

Android网络之数据解析----使用Google Gson解析Json数据

[正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                                                                                 Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式,这使得Jso