转载请注明出处王亟亟的大牛之路

之前也有一个相似于画板的操作,可是不够具体,这边先补上链接。有兴趣的小伙伴能够看看http://blog.csdn.net/ddwhan0123/article/details/48804761

还是老规矩,将内容之前说下我们的一些知识点。今天的第一个知识点有点高DA上的名词“硬件加速”。

硬件加速:

问题1:这玩意有什么用?

在绘制View的时候支持硬件加速。充分利用GPU的特性,使得绘制更加平滑。

问题2:怎么用?

在AndroidManifest的Application 或者Activity节点<application android:hardwareAccelerated="true/false">就能够进行开关。

或者用Java代码:getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

假设这些你都不喜欢。你仅仅要那个类其中的某个View是对这部分功能有需求的。那么这样:view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 可是要记住Window仅仅能打开。View仅仅能关闭所以还是在Activity和Application层面操作吧。

问题3:非用不可吗?

假设你的View的绘制内容比較复杂,比較对多,还是建议开着,诸如画密度非常细的那种虚线或者颜色区域超级复杂的一些试图的画还是开着吧,不然说不定你再挂个什么网络的操作万一客户机烂一点一个未响应提示就来了。

Paint:

这部分的内容就不提了。网上多如牛毛。贴一个写的比較简单易通的http://www.cnblogs.com/tianzhijiexian/p/4297170.html?

utm_source=tuicool&utm_medium=referral

http://www.kancloud.cn/kancloud/android-tutorial/87246

Canvas:

如上,还是附上可參考的链接:http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html

http://www.kancloud.cn/kancloud/android-tutorial/87261

性能优化(跟自己定义画图相关的):

1.设置缓存:View 中设置缓存属性.setDrawingCache为true

2.优化布局:tools文件夹下的layoutopt 命令

3.将Acitivity 中的Window 的背景图设置为空(默认不为空)。getWindow().setBackgroundDrawable(null);

4.採用SurfaceView在子线程刷新UI,:避免手势的处理和绘制在同一UI线程(普通View都这样做)。

5:採用JNI:将耗时间的处理放到c/c++层来处理。


主要来说下自己定义控件重要的三个方法“onMeasure()”。“onDraw()”,“onLayout()”:

1.onMeasure()方法就是用于測量视图的大小的,不然你的空间永远都仅仅是白屏,不是没画上去,而是没有尺寸。

measure()方法接收两个參数。widthMeasureSpec和heightMeasureSpec也就是宽度和长度。

MeasureSpec的值由specSize和specMode共同组成的,specSize是大小,specMode是规格。

有三种规格:1. EXACTLY,AT_MOST,UNSPECIFIED。这三种规格细说太复杂了,我整合给大家听下

(1):子视图的大小应该是由specSize的值来决定,用户也可自行定义

(2):子视图最多仅仅能是specSize中指定的大小。仅仅能更小不能更大了

(3):能够将视图依照自己的意愿设置成随意的大小,没有不论什么限制

当rootDimension參数等于MATCH_PARENT的时候,MeasureSpec的specMode就等于EXACTLY。当rootDimension等于WRAP_CONTENT的时候,MeasureSpec的specMode就等于AT_MOST。而且MATCH_PARENT和WRAP_CONTENT时的specSize都是等于windowSize的。也就意味着根视图总是会充满全屏的。

这里的rootDimension是根布局的尺寸

总结:视图大小的控制是由父视图、布局文件、以及视图本身共同完毕的,父视图会提供给子视图參考的大小。而开发者能够在XML文件里指定视图的大小,然后视图本身会对终于的大小进行拍板。

不然就会出现onCreate时发现控件宽高都是0。之前有提到。看这里http://blog.csdn.net/ddwhan0123/article/details/50386685

2.onLayout()用于给视图进行布局的,也就是确定视图的位置。会在onMeasure方法之后运行。

layout()方法接收四个參数,分别代表着左、上、右、下的坐标。当然这个坐标是相对于当前视图的父视图而言的。

像这样layout(0, 0, host.mMeasuredWidth, host.mMeasuredHeight);

可是画图的位置操作我们能够在onDraw里运行,所以假设你不想了解这部分,这方法你不調用都行,可是要记得在画的时候重现位置特性。不然就是“一坨屎在一起了”

3.onDraw(),measure和layout的过程都结束后。接下来就进入到这种方法了。我们全部的作画的事,都在这干!

ViewRoot中的代码会继续运行并创建出一个Canvas对象,然后调用View的draw()方法来运行具体的绘制工作

我们的绘画都是在这个Canvas对象的支持下实现的,简单写个样例。

public class TestView extends View {
Paint paint;
Context context; public TestView(Context context) {
super(context);
this.context = context;
} public TestView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
} public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
} @TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TestView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
} private void init(Context context, AttributeSet attrs) {
paint = new Paint();
// paint.setColor(getResources().getColor(R.color.SlateBlue));
paint.setColor(getResources().getColor(R.color.Gold));
paint.setStrokeWidth(3);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.d("--->onDraw", "onDraw()");
// canvas.drawCircle(0, 0, 90, paint);
canvas.drawCircle(100, 100, 90, paint);
} @Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
Log.d("--->onLayout", "changed = " + changed + " left = " + left + " top = " + top + " right = " + right + " bottom " + bottom);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
Log.d("--->onMeasure", " widthMeasureSpec =" + widthMeasureSpec + " heightMeasureSpec = " + heightMeasureSpec);
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
}
}

凝视部分运行效果:

现有代码效果:

打印的顺序

请细致看onLayout()的那些坐标,他任然保持着父布局的一系列属性參数:

  android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"

相关资源收集:http://blog.csdn.net/michaelcao1980/article/details/43233909

自己定义View时,用到Paint Canvas的一些温故,讲讲平时一些效果是怎么画的(基础篇 一)的更多相关文章

  1. 自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,&quot;掏粪男孩Gif&quot;顺便再提提onWindowFocusChanged)

    转载请注明出处:王亟亟的大牛之路 之前在绘画的过程中提到了静态的旋转啊,缩放啊,平移等一些效果.那么自己定义的View当然也有动态的效果也就是我们的Animation.经常使用的有三种 View An ...

  2. 自己定义 View 基础和原理

    课程背景: 在 Android 提供的系统控件不能满足需求的情况下,往往须要自己开发自己定义 View 来满足需求,可是该怎样下手呢.本课程将带你进入自己定义 View 的开发过程,来了解它的一些原理 ...

  3. 【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现

    利用一个简单的绘图app来说明安卓的图形处理类与自己定义View的应用. 例如以下图,有一个供用户自己随意绘图.涂鸦的app. 这里不做那么花俏了,仅提供黑白两色.但能够改变笔尖的粗细. 实质上这里的 ...

  4. 安卓自己定义View进阶-Canvas之绘制基本形状

    Canvas之绘制基本形状 作者微博: @GcsSloop [本系列相关文章] 在上一篇自己定义View分类与流程中我们了解自己定义View相关的基本知识,只是,这些东西依然还是理论,并不能拿来(zh ...

  5. 转载爱哥自定义View系列--Paint详解

    上图是paint中的各种set方法 这些属性大多我们都可以见名知意,很好理解,即便如此,哥还是带大家过一遍逐个剖析其用法,其中会不定穿插各种绘图类比如Canvas.Xfermode.ColorFilt ...

  6. Android 它们的定义View (一)

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/24252901 非常Android入门程序员AndroidView.可能都是比較恐 ...

  7. Android自定义View研究--View中的原点坐标和XML中布局自定义View时View触摸原点问题

    这里只做个汇总~.~独一无二 文章出处:http://blog.csdn.net/djy1992/article/details/9715047 Android自定义View研究--View中的原点坐 ...

  8. Android 它们的定义View它BounceProgressBar

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/41246247 [Rocko's blog] 之前几天下载了非常久没用了的桌面版酷狗来用用的时候 ...

  9. 图文剖析自己定义View的绘制(以自己定义滑动button为例)

    自己定义View一直是横在Android开发人员面前的一道坎. 一.View和ViewGroup的关系 从View和ViewGroup的关系来看.ViewGroup继承View. View的子类.多是 ...

随机推荐

  1. POJ 2886.Who Gets the Most Candies? -线段树(单点更新、类约瑟夫问题)

    线段树可真有意思呢续集2... 区间成段的替换和增减,以及区间求和等,其中夹杂着一些神奇的操作,数据离散化,简单hash,区间异或,还需要带着脑子来写题. 有的题目对数据的操作并不是直接按照题面意思进 ...

  2. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- Red Rover

    链接:https://www.nowcoder.com/acm/contest/116/A来源:牛客网 输入描述: Input consists of a single line containing ...

  3. poj2728(最小比率生成树)

    poj2728 题意 给出 n 个点的坐标和它的高度,求一颗生成树使得树上所连边的两点高度差之和除以距离之和最小. 分析 01分数规划+最小生成树. 对于所有的边,在求最小生成树过程中有选或不选的问题 ...

  4. 替换Ubuntu默认的登录背景

    Ubuntu默认的登录背景看起来还是比较高贵的,但是作为一个爱折腾的人,当然要换成自己喜欢的背景图了.一开始跟着百度走,进了不少坑,最后还是自己走出来的.先上一个成品照 百度得到的答案几乎都是安装ub ...

  5. 实现微信朋友圈点击评论按钮时cell上移

    实现场景:微信朋友圈TableView(BigTableView)的每一行cell都包含一个SmallTableView(显示所有点赞及评论) 实现思路: //BigTableView的content ...

  6. linux-配置字符串-grep

    grep -rn "hello,world!" * * : 表示当前目录所有文件,也可以是某个文件名 -r 是递归查找 -n 是显示行号 -R 查找所有文件包含子目录 -i 忽略大 ...

  7. flex skin

    原文地址:http://blog.163.com/to_yht/blog/static/1227257742009741359326/当程序做完后,你是否还在为老套的flex组件默认效果发愁?是否还在 ...

  8. MTD

    内存技术设备(英语:Memory Technology Device,缩写为 MTD),是Linux系统中设备文件系统的一个类别,主要用于快闪存储器的应用,是一种快闪存储器转换层(Flash Tran ...

  9. EasyMvc入门教程

    EasyMvc 希望实现的目标:模块化,快速简单化,满足80%的常见需求.基于.Net Core 2.0.5开发.开发环境:VS2017,运行环境支持Window/Linux. 相关链接: 演示地址: ...

  10. squid 访问日志记录

    squid日志记录在squid.conf 也可记录.并且squid日志可以不记录静态项 在squid.conf 加入 (1)access_log /var/log/squid/access.log  ...