Android自定义View—API
Paint
-
reset()
重置Paint。 -
setFlags(int flags)
设置一些标志,比如抗锯齿,下划线等等。 -
setAntiAlias(boolean aa)
设置抗锯齿,如果不设置,加载位图的时候可能会出现锯齿状的边界,如果设置,边界就会变的稍微有点模糊,锯齿就看不到了 -
setDither(boolean dither)
设置是否抖动,如果不设置感觉就会有一些僵硬的线条,如果设置图像就会看的更柔和一些, -
setLinearText(boolean linearText)
这个是文本缓存,设置线性文本,如果设置为true就不需要缓存 -
setSubpixelText(boolean subpixelText)
设置亚像素,是对文本的一种优化设置,可以让文字看起来更加清晰明显,可以参考一下PC端的控制面板-外观和个性化-调整ClearType文本 -
setUnderlineText(boolean underlineText)
设置文本的下划线 -
setUnderlineText(boolean underlineText)
设置文本的下划线 -
setStrikeThruText(boolean strikeThruText)
设置文本的删除线 -
setFakeBoldText(boolean fakeBoldText)
设置文本粗体 -
setFilterBitmap(boolean filter)
对位图进行滤波处理,如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示 -
setColor(int color)
设置画笔颜色 -
setAlpha(int a)
设置画笔的透明度[0-255],0是完全透明,255是完全不透明 -
setARGB(int a, int r, int g, int b)
设置画笔颜色,argb形式alpha,red,green,blue每个范围都是[0-255], -
setStrokeWidth(float width)
画笔样式为空心时,设置空心画笔的宽度 -
setStrokeMiter(float miter)
当style为Stroke或StrokeAndFill时设置连接处的倾斜度,这个值必须大于0,看一下演示结果 -
setShader(Shader shader)
设置着色器,用来给图像着色的,绘制出各种渐变效果,有BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient几种 -
setColorFilter(ColorFilter filter)
设置画笔颜色过滤器,有ColorMatrixColorFilter,LightingColorFilter,PorterDuffColorFilter几种,这个以后再单独分析 -
setXfermode(Xfermode xfermode)
设置图形重叠时的显示方式 -
setPathEffect(PathEffect effect)
设置绘制路径的效果,有ComposePathEffect,CornerPathEffect,DashPathEffect,DiscretePathEffect,PathDashPathEffect,SumPathEffect几种,以后在单独分析 -
setMaskFilter(MaskFilter maskfilter)
对图像进行一定的处理,实现滤镜的效果,如滤化,立体等,有BlurMaskFilter,EmbossMaskFilter几种 -
setTypeface(Typeface typeface)
设置字体样式,可以是Typeface设置的样式,也可以通过Typeface的createFromAsset(AssetManager mgr, String path)方法加载样式 -
setShadowLayer(float radius, float dx, float dy, int shadowColor)
设置阴影效果,radius为阴影角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色。注:在用该方法之前需要调用setLayerType( LAYER_TYPE_SOFTWARE , null);关闭硬件加速 -
setTextLocale(Locale locale)
设置地理位置,比如显示中文,日文,韩文等,默认的显示Locale.getDefault()即可, -
setElegantTextHeight(boolean elegant)
设置优雅的文字高度,这个设置可能会对FontMetrics产生影响 -
setTextSize(float textSize)
设置字体大小 -
setTextScaleX(float scaleX)
设置字体的水平方向的缩放因子,默认值为1,大于1时会沿X轴水平放大,小于1时会沿X轴水平缩小 -
setTextSkewX(float skewX)
设置文本在水平方向上的倾斜,默认值为0,推荐的值为-0.25, -
setLetterSpacing(float letterSpacing)
设置行的间距,默认值是0,负值行间距会收缩 -
setFontFeatureSettings(String settings)
设置字体样式,可以设置CSS样式 -
measureText(char[] text, int index, int count),measureText(String text, int start, int end),measureText(String text),measureText(CharSequence text, int start, int end)
测量字体的长度 -
breakText(char[] text, int index, int count,float maxWidth, float[] measuredWidth),breakText(CharSequence text, int start, int end,boolean measureForwards, floatmaxWidth, float[] measuredWidth),breakText(String text, boolean measureForwards,float maxWidth, float[] measuredWidth)
剪切显示,就是大于maxWidth的时候只截取指定长度的显示 -
getTextWidths(char[] text, int index, int count,float[] widths),getTextWidths(CharSequence text, int start, int end, float[] widths),getTextWidths(String text, int start, int end, float[] widths),getTextWidths(String text, float[] widths)
提取指定范围内的字符串,保存到widths中 -
getTextPath(char[] text, int index, int count, float x, float y, Path path),getTextPath(String text, int start, int end, float x, float y, Path path)
获取文本绘制的路径,提取到Path中 -
getTextBounds(String text, int start, int end, Rect bounds) ,getTextBounds(char[] text, int index, int count, Rect bounds)
得到文本的边界,上下左右,提取到bounds中,可以通过这计算文本的宽和高
Canvas
-
translate(100, 50) 平移
参数1: 向X轴方向移动100距离
参数2: 向Y轴方向移动50距离 -
canvas.scale(2, 4) 缩放
在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍
参数1: X轴的放大倍数
参数2: Y轴的放大倍数
canvas.scale(2, 4,100,100)
在X轴方向放大为原来2倍,Y轴方向方大为原来的4倍
参数1: X轴的放大倍数
参数2: Y轴的放大倍数
参数3: 原点X坐标
参数4: 原点Y坐标 -
canvas.rotate(30) 旋转
原点为中心,旋转30度(顺时针方向为正方向 )
参数: 旋转角度
canvas.rotate(30,100,100)
以(100,100)为中心,旋转30度,顺时针方向为正方向
参数: 旋转角度 -
canvas.drawText(“开始写字了!”,50, 50, p) 画文字
参数2:文本的x轴的开始位置
参数2:文本Y轴的结束位置
参数3:画笔对象
canvas.drawText(“开始写字了!”,2,5, 50, 50, p)
参数2:要从第几个字开始绘制
参数3:要绘制到第几个文字
参数4:文本的x轴的开始位置
参数5:文本Y轴的结束位置
参数6:画笔对象
canvas.drawTextOnPath(“1234567890101123123”, path, 0, -50, p)
参数2:路径
参数3:距离路径开始位置的偏移量
参数4:距离路径上下的偏移量(可以为负数)
参数5:画笔对象 -
canvas.drawCircle(200, 200, 100, p) 画圆
参数1:圆心X
参数2:圆心Y
参数3:半径R
参数4:画笔对象 -
canvas.drawLine(100, 100, 300, 300, p) 画线
参数1:startX
参数2:startY
参数3:stopX
参数4:stopY
参数5:画笔对象
canvas.drawLines(new float[]{100,100,200,200,200,100,300,100}, p)
同时绘制多条线。
参数1:float数组:每四个一组为一条线。最后不足四个,就忽略那些值。
参数2:画笔对象 -
RectF oval = new RectF(150, 200, 500, 400); canvas.drawOval(oval, p) 画椭圆
参数1:float left
参数2:float top
参数3:float right
参数4:float bottom -
canvas.drawArc(oval, 20, 180, false, p) 画弧度
参数1:RectF对象。
参数2:开始的角度。(水平向右为0度顺时针反向为正方向)
参数3:扫过的角度
参数4:是否和中心连线
参数5:画笔对象 -
canvas.drawRect(100,100, 200, 200, p) 画矩形
参数1:float left
参数2:float top
参数3:float right
参数4:float bottom
canvas.drawRoundRect(oval3, 20, 5, p) 画圆角矩形
RectF oval3 = new RectF(80, 260, 200, 300);// 设置个新的长方形
canvas.drawRoundRect(oval3, 20, 5, p);//第二个参数是x半径,第三个参数是y半径 -
canvas.drawPath(path, p) 画多边形
Path类封装复合(多轮廓几何图形的路径 由直线段*、二次曲线,和三次方曲线,也可画以油画。drawPath(路径、油漆),要么已填充的或抚摸(基于油漆的风格),或者可以用于剪断或画画的文本在路径。
Path path = new Path(); 路径对象
path.moveTo(80, 200); 此点为多边形的起点
path.lineTo(120, 250);
path.lineTo(80, 250);
//…. 可以添加多个点。构成多边形
path.close(); // 使终点和起点链接,构成封闭图形
canvas.drawPath(path, p); -
canvas.drawPath(path2, p) 画贝塞尔曲线
p.setStyle(Style.STROKE);
Path path2=new Path();
path2.moveTo(100, 100);//设置Path的起点
path2.quadTo(300, 100, 400, 400); //设置贝塞尔曲线的控制点坐标和终点坐标。
参数1、2:x1,y1为控制点的坐标值,参数3、4:x2,y2为终点的坐标值
path2.quadTo(500, 700, 800, 800);
canvas.drawPath(path2, p);//画出贝塞尔曲线 -
canvas.drawPoint(60, 390, p) 画一个点
参数1、2:点的x、y坐标
canvas.drawPoints(new float[]{60,400,65,400,70,400}, p) 画多个点
参数1:多个点,每两个值为一个点。最后个数不够两个的值,忽略。 -
canvas.drawBitmap(bitmap, 200,300, p) 画图片
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
canvas.drawBitmap(bitmap, 200,300, p);
参数1:bitmap对象
参数2:图像左边坐标点
参数3:图像上边坐标点
Path
-
moveTo
moveTo表示将绘制点移动到某一个坐标处,该方法并不会进行绘制,主要是用来移动画笔。默认情况下起始坐标位于(0,0)点,我们可以手动调整默认位置。 -
lineTo
lineTo表示绘制一条直线,参数表示目标坐标如下:
Path path = new Path();
path.lineTo(getResources().getDimensionPixelSize(R.dimen.dot1x), getResources().getDimensionPixelSize(R.dimen.dot1x));
canvas.drawPath(path, paint); -
quadTo
quadTo可以用来绘制一个带控制点的曲线,说白了,其实就是贝塞尔曲线。如下:
Path path = new Path();
path.moveTo(0, 300);
path.quadTo(150, 0, 300, 300);
canvas.drawPath(path, paint); -
cubicTo
cubicTo可以用来绘制具有两个控制点的贝塞尔曲线,代码如下: Path path = new Path();
path.moveTo(300, 0);
path.cubicTo(0, 150, 300, 450, 0, 600);
canvas.drawPath(path, paint); -
arcTo
artTo用来绘制一段圆弧,实际上是截取圆或者椭圆的一部分,比如下面一段代码:
Path path = new Path();
RectF oval = new RectF(0, 0, 300, 300);
path.arcTo(oval, 0, 90);
canvas.drawPath(path, paint); -
addArc、addRoundRect、addOval、addRect、addCircle
addArc,添加一个圆弧到路径中,这个圆弧实为圆或者椭圆的一部分,如下一段代码:
Path path = new Path();
RectF oval = new RectF(0, 200, 300, 500);
path.addArc(oval, 0, 180);
canvas.drawPath(path, paint);
Path path = new Path();
RectF oval = new RectF(50, 50, 150, 150);
path.addRoundRect(oval,25,25, Path.Direction.CCW);
RectF oval2 = new RectF(50, 200, 250, 300);
path.addOval(oval2, Path.Direction.CCW);
RectF oval3 = new RectF(50, 350, 150, 450);
path.addRect(oval3, Path.Direction.CCW);
path.addCircle(100, 550, 50, Path.Direction.CCW);
canvas.drawPath(path, paint); -
Path.Op
Path.Op.DIFFERENCE表示从path中去除path2的部分,保留path的部分。如下案例:
Path path = new Path();
Path path2 = new Path();
path.addCircle(200, 200, 100, Path.Direction.CCW);
path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
path.op(path2, Path.Op.DIFFERENCE);
canvas.drawPath(path, paint); -
Path.Op.INTERSECT
Path.Op.INTERSECT表示取path和path2相交的部分显示出来,如下:
Path path = new Path();
Path path2 = new Path();
path.addCircle(200, 200, 100, Path.Direction.CCW);
path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
path.op(path2, Path.Op.INTERSECT);
canvas.drawPath(path, paint); -
Path.Op.REVERSE_DIFFERENCE
Path.Op.REVERSE_DIFFERENCE表示除去path的部分,只显示path2的部分,如下:
Path path = new Path();
Path path2 = new Path();
path.addCircle(200, 200, 100, Path.Direction.CCW);
path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
path.op(path2, Path.Op.REVERSE_DIFFERENCE);
canvas.drawPath(path, paint); -
Path.Op.UNION
Path.Op.UNION表示path和path2的部分都要显示出来,如下:
Path path = new Path();
Path path2 = new Path();
path.addCircle(200, 200, 100, Path.Direction.CCW);
path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
path.op(path2, Path.Op.UNION);
canvas.drawPath(path, paint); -
Path.Op.XOR
Path.Op.XOR表示显示path和path2但是不包含二者的交集。如下:
Path path = new Path();
Path path2 = new Path();
path.addCircle(200, 200, 100, Path.Direction.CCW);
path2.addRect(200, 200, 300, 300, Path.Direction.CCW);
path.op(path2, Path.Op.XOR);
canvas.drawPath(path, paint);
其它
-
最小滑动距离值,大于该值则认为是滑动 ViewConfiguration configuration = ViewConfiguration.get(context);
int touchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(configuration); -
requestDisallowInterceptTouchEvent 当用户按下的时候,我们告诉父组件,不要拦截我的事件(这个时候子组件是可以正常响应事件的),拿起之后就会告诉父组件可以阻止。