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.使用图片,圆角图片
与君共勉
我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天