Android中自定义View的简单了解 以及绘制过程Paint、Canvas使用

View

  • View代表屏幕的一个矩形区域,负责绘制这个区域和这个区域的事件处理
  • View的坐标位置由6个方法来获取
	View左方的距离getLeft,View右方的距离getRight,View上方的距离getTop
	View下方的距离getBottom,宽度getWidth,高度getHeight

实例化

1.构造方法
1).View(context);在java代码中使用的构造器,没有设置任何值,只有默认值
必须通过set方法来一步一步完成构建

2).View(Context,AttributeSet): 在xml中设置,通过View.inflate方法使用的构造器。
xml由LayoutInflate加载成View对象,将属性传递到AttributeSet中,通过View的构造
方法来将所有android中View认识的属性全部设置。

3). View(Context,AttributeSet,int,[int]):和2相同,有一个默认的主题。
如果是通过xml的方式导入的布局,会调用View的 onFinishInflate 方法。
2.测量布局
onMeasure(MODE+width,MODE+height);
	1). 固定大小 :100dp match_parent EXACTLY
	2). 自动匹配 :warp_content AT_MOST
	3). 未指明的 每次使用都会报错。UNSPECIFIED
MeasureSpec 由最高2位模式和后30位大小组成。
获取高度模式 getSize getMode
创建一个MeasureSpec makeMeasureSpec
3.计算位置
onLayout(boolean,left,top,width,height);
自定义布局的时候,用于子控件排列方式的方法。
计算大小完毕时回调 onSizeChanged
4.绘制View
决定了View的显示方式
onDraw(Canvas画布)

BUG

  • 在ScrollView中嵌套ListView,GridView,RecyclerView,都只能显示一条数据。
  • 必须重写AdapterView,重写onMeasure方法。
int height=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, height);

绘制 onDraw

  • 所有的View视图处理都在onDraw,这个方法在View加载的时候,只会调用一次
  • 如果需要重绘:
invalidate(); 		主线程中调用,立马执行。子线程不允许修改UI,所以不能调用这个方法

postInvalidate(); 	子线程中调用,队列执行,子线程发送绘制消息到主线程,在调用Invalidate

Paint画笔

setDither 			防抖动 一般都选择true
setAntiAlias		防锯齿一般都选择true
setColor 			设置颜色------->rgb 0xffRRGGBB
setAlpha 			设置透明度---->alpha 0xaaRRGGBB
setStyle 			设置样式:FILL填充,FILL_AND_STORKE填充有边框	,STORKE只有边框
setStorkeWidth:		设置边框宽度
setTextSize:		设置字体大小
setTextAlign:		设置文本对齐方式,默认从左边开始到右边绘制

Canvas画布

Canvas就是向屏幕上绘制各种 几何图形,Path路径,图片,文字
圆: 圆心,半径,画笔
矩形:左上和右下 Rect(int left,top,right,bottom),RectF(float left,top,right,bottom);
点: 坐标x,y Point(int x,int y),PointF(float x,float y);
直线:两个点 startX,statY,endX,endY
弧线:RectF,startAngle,endAngle,useCenter
圆角矩形:RectF,水平和垂直圆角
绘制路径
1.	moveTo 将画笔移动到某点开始绘制
2.  lineTo 使用直线绘制
3.  quadTo 使用曲线绘制
4.  close  闭合:将画的线连在一起
6.  addCircle   绘圆
7.  addRect     绘矩形 等等..
Bitmap
  • 导入一张Bitmap的常用方法:BitmapFactory.decodeResource/File/Stream
  • 代表Android使用所有的图片
  • 在XML中写的src="@mipmap/***" 用代码描述是 BitmapDrawable --> Bitmap+贴图模式
  • 贴图模式:分三种效果(1.拉伸,2.平铺,3.镜像)
创建Bitmap的常用方法:
	Bitmap.create(Bitmap,source)//复制一张图片
	Bitmap.create(int width,int height,Config) //创建一个空白图片,用来绘制
	Bitmap.create(Bitmap source,int x,int y,int width,int height);//从source挖取其中一块)
	Bitmap.create(int colors[],int width,int height,config);//从一个颜色数组中产生一张图片

导入一张Bitmap的常用方法:

BitmapFactory.decodeResource/File/Stream图片可以保存起来。
Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream
(file)); //方法参数是1.保存的格式,2.保存Bitmap百分比,3.保存的地址
Bitmap强制回收,使用完毕的Bitmap可以通过这个方法来提前回收,不要等到GC来释放内存。
recycle()
一个App如果出现OOM(内存溢出),99%都是Bitmap惹的祸。
View中对Bitmap的绘制
//直接绘制图片在某个点
canvas.drawBitmap(android,300,300,null);
//从目标图片中取出一个矩形,绘制到屏幕的一个矩形上
canvas.drawBitmap(android,new Rect(0,0,android.getWidth/2,android.getHeight/2)
new Rect(200,200,300,300),null);
画笔渲染
1.使用渐变
2.使用图片,圆角图片

与君共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吕氏春秋i

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值