Android Paint API总结和使用方法

Android Paint API总结和使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//Paint 操作函数 2015年5月15日 Android 4.4

void reset();
void set(Paint src);
void setCompatibilityScaling( float factor);
void setBidiFlags( int flags);
void setFlags( int flags);
void setHinting( int mode);
//是否抗锯齿
void setAntiAlias( boolean aa);
//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰  
void setDither( boolean dither);
//设置线性文本
void setLinearText( boolean linearText);
//设置该项为true,将有助于文本在LCD屏幕上的显示效果  
void setSubpixelText( boolean subpixelText);
//设置下划线
void setUnderlineText( boolean underlineText);
//设置带有删除线的效果 
void setStrikeThruText( boolean strikeThruText);
//设置伪粗体文本,设置在小字体上效果会非常差  
void setFakeBoldText( boolean fakeBoldText);
//如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作
//加快显示速度,本设置项依赖于dither和xfermode的设置  
void setFilterBitmap( boolean filter);
//设置画笔风格,空心或者实心 FILL,FILL_OR_STROKE,或STROKE
//Paint.Style.STROKE 表示当前只绘制图形的轮廓,而Paint.Style.FILL表示填充图形。  
void setStyle(Style style);
  //设置颜色值
void setColor( int color);
//设置透明图0~255,要在setColor后面设置才生效
void setAlpha( int a);   
//设置RGB及透明度
void setARGB( int a,  int r,  int g,  int b);  
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度  
void setStrokeWidth( float width);
void setStrokeMiter( float miter);
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷末端的图形样式
//如圆形样式Cap.ROUND,或方形样式Cap.SQUARE  
void setStrokeCap(Cap cap);
//设置绘制时各图形的结合方式,如平滑效果等  
void setStrokeJoin(Join join);
//设置图像效果,使用Shader可以绘制出各种渐变效果  
Shader setShader(Shader shader);
//设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 
ColorFilter setColorFilter(ColorFilter filter);
//设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 
Xfermode setXfermode(Xfermode xfermode);
//设置绘制路径的效果,如点画线等 
PathEffect setPathEffect(PathEffect effect);
//设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等  
MaskFilter setMaskFilter(MaskFilter maskfilter);
//设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等  
Typeface setTypeface(Typeface typeface);
//设置光栅化
Rasterizer setRasterizer(Rasterizer rasterizer);
//在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
//注意:在Android4.0以上默认开启硬件加速,有些图形的阴影无法显示。关闭View的硬件加速 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
void setShadowLayer( float radius,  float dx,  float dy,  int color);
//设置文本对齐
void setTextAlign(Align align);
//设置字体大小
void setTextSize( float textSize);
//设置文本缩放倍数,1.0f为原始
void setTextScaleX( float scaleX);
//设置斜体文字,skewX为倾斜弧度  
void setTextSkewX( float skewX);

图像阴影效果setShadowLayer使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Paint paint =  new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
//设置透明度,要在setColor后面设置才生效
paint.setAlpha( 80);

//如果不关闭硬件加速,setShadowLayer无效
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
//(阴影的半径,X轴方向上相对主体的位移,Y轴相对位移)
paint.setShadowLayer( 101010, Color.BLACK);
paint.setTextSize( 30);
canvas.drawText( "画一个很大的圆"8050, paint);

//cx和cy为圆点的坐标
int radius =  80;
int offest =  40;
int startX = radius + offest;
int startY = radius + offest +  40;

canvas.drawCircle(startX, startY, radius, paint);

paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth( 5);
paint.setShadowLayer( 20, - 2010, Color.BLACK);
canvas.drawCircle(startX + radius *  2 + offest, startY, radius, paint);




setXfermode使用方法
Xfer词意为传送,在里可以解释为:第二次的图像是通过何种模式传送到第前一次图像里的,说白了,就是两个图像如何叠加。
Paint的 Xfermode有3种,都是继承 Xfermode:
1)AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
2)PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。
3)PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则
在Android SDK自带的ApiDemo里没有前两者的案例。可能是因为 PorterDuffXfermode太强大了,这里也就只介绍 PorterDuffXfermode了。

所有的 PorterDuffXfermode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     private  static  final Xfermode[] sModes = {
         new PorterDuffXfermode(PorterDuff.Mode.CLEAR),       //清空所有,要闭硬件加速,否则无效
         new PorterDuffXfermode(PorterDuff.Mode.SRC),         //显示前都图像,不显示后者
         new PorterDuffXfermode(PorterDuff.Mode.DST),         //显示后者图像,不显示前者
         new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),    //后者叠于前者
         new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),    //前者叠于后者
         new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),      //显示相交的区域,但图像为后者
         new PorterDuffXfermode(PorterDuff.Mode.DST_IN),      //显示相交的区域,但图像为前者
         new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),     //显示后者不重叠的图像
         new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),    / /显示前者不重叠的图像
         new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),    //显示前者图像,与后者重合的图像
         new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),    //显示后者图像,与前者重合的图像
         new PorterDuffXfermode(PorterDuff.Mode.XOR),         //显示持有不重合的图像
         new PorterDuffXfermode(PorterDuff.Mode.DARKEN),      //后者叠于前者上,后者与前者重叠的部份透明。要闭硬件加速,否则无效
         new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),     //前者叠于前者,前者与后者重叠部份透明。要闭硬件加速,否则无效
         new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),    //显示重合的图像,且颜色会合拼
         new PorterDuffXfermode(PorterDuff.Mode.SCREEN) };    //显示持有图像,重合的会变白



如果把第二层透明度设为160后效果如下




Paint类setMaskFilter函数的使用
setMaskFilter的参数 MaskFilter 有两个子类: EmbossMaskFilter和 BlurMaskFilter
BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘。
EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。
1
2
3
4
5
6
7
8
9
10
11
// 设置光源的方向
float[] direction =  new  float[] {  111 };
//设置环境光亮度
float light =  0.4f;
// 选择要应用的反射等级
float specular =  6;
// 向mask应用一定级别的模糊
float blur =  3.5f;
EmbossMaskFilter emboss =  new EmbossMaskFilter(direction, light, specular, blur);
// 应用mask
myPaint.setMaskFilter(emboss);

1
2
mBlur =  new BlurMaskFilter( 10, BlurMaskFilter.Blur.SOLID);
mPaint.setMaskFilter(mBlur);

                 

颜色渐变setShader的使用
LinearGradient设置颜色没变的属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 
* LinearGradient shader = new LinearGradient(0, 0, endX, endY, new 
* int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, 
* 1.0f}, TileMode.MIRROR); 
* 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点 
* 其中参数new int[]{startColor, midleColor,endColor}是参与渐变效果的颜色集合,  
* 其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布 
*/
  
Shader mShader =  new LinearGradient( 00100100new  int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT);  
paint.setShadowLayer( 20, - 2010, Color.BLACK);   //设置阴影

// Shader.TileMode三种模式  
// REPEAT:沿着渐变方向循环重复  
// CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色  
// MIRROR:与REPEAT一样都是循环重复,但这个会对称重复  
paint.setShader(mShader); // 用Shader中定义定义的颜色来话  


PathEffect 类的使用:


1
2
3
4
5
6
7
8
9
e[ 0] = null;      // no effect
// CornerPathEffect(角度)
e[ 1] =  new CornerPathEffect( 10);   //线带角度的地方会变成弧形
//( {线长度,间隔大小}, 与上一次的偏移量)
e[ 2] =  new DashPathEffect( new  float[] { 10555}, phase);
e[ 3] =  new PathDashPathEffect(makePathDash(),  12, phase, PathDashPathEffect.Style.ROTATE);
//两种效果全拼,先使用第一种,再使用第二种
e[ 4] =  new ComposePathEffect(e[ 2], e[ 1]);
e[ 5] =  new ComposePathEffect(e[ 3], e[ 1]);


参考文章: http://wpf814533631.iteye.com/blog/1847661
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//Paint 操作函数 2015年5月15日 Android 4.4

void reset();
void set(Paint src);
void setCompatibilityScaling( float factor);
void setBidiFlags( int flags);
void setFlags( int flags);
void setHinting( int mode);
//是否抗锯齿
void setAntiAlias( boolean aa);
//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰  
void setDither( boolean dither);
//设置线性文本
void setLinearText( boolean linearText);
//设置该项为true,将有助于文本在LCD屏幕上的显示效果  
void setSubpixelText( boolean subpixelText);
//设置下划线
void setUnderlineText( boolean underlineText);
//设置带有删除线的效果 
void setStrikeThruText( boolean strikeThruText);
//设置伪粗体文本,设置在小字体上效果会非常差  
void setFakeBoldText( boolean fakeBoldText);
//如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作
//加快显示速度,本设置项依赖于dither和xfermode的设置  
void setFilterBitmap( boolean filter);
//设置画笔风格,空心或者实心 FILL,FILL_OR_STROKE,或STROKE
//Paint.Style.STROKE 表示当前只绘制图形的轮廓,而Paint.Style.FILL表示填充图形。  
void setStyle(Style style);
  //设置颜色值
void setColor( int color);
//设置透明图0~255,要在setColor后面设置才生效
void setAlpha( int a);   
//设置RGB及透明度
void setARGB( int a,  int r,  int g,  int b);  
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度  
void setStrokeWidth( float width);
void setStrokeMiter( float miter);
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷末端的图形样式
//如圆形样式Cap.ROUND,或方形样式Cap.SQUARE  
void setStrokeCap(Cap cap);
//设置绘制时各图形的结合方式,如平滑效果等  
void setStrokeJoin(Join join);
//设置图像效果,使用Shader可以绘制出各种渐变效果  
Shader setShader(Shader shader);
//设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果 
ColorFilter setColorFilter(ColorFilter filter);
//设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果 
Xfermode setXfermode(Xfermode xfermode);
//设置绘制路径的效果,如点画线等 
PathEffect setPathEffect(PathEffect effect);
//设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等  
MaskFilter setMaskFilter(MaskFilter maskfilter);
//设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等  
Typeface setTypeface(Typeface typeface);
//设置光栅化
Rasterizer setRasterizer(Rasterizer rasterizer);
//在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色
//注意:在Android4.0以上默认开启硬件加速,有些图形的阴影无法显示。关闭View的硬件加速 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
void setShadowLayer( float radius,  float dx,  float dy,  int color);
//设置文本对齐
void setTextAlign(Align align);
//设置字体大小
void setTextSize( float textSize);
//设置文本缩放倍数,1.0f为原始
void setTextScaleX( float scaleX);
//设置斜体文字,skewX为倾斜弧度  
void setTextSkewX( float skewX);

图像阴影效果setShadowLayer使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Paint paint =  new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
//设置透明度,要在setColor后面设置才生效
paint.setAlpha( 80);

//如果不关闭硬件加速,setShadowLayer无效
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
//(阴影的半径,X轴方向上相对主体的位移,Y轴相对位移)
paint.setShadowLayer( 101010, Color.BLACK);
paint.setTextSize( 30);
canvas.drawText( "画一个很大的圆"8050, paint);

//cx和cy为圆点的坐标
int radius =  80;
int offest =  40;
int startX = radius + offest;
int startY = radius + offest +  40;

canvas.drawCircle(startX, startY, radius, paint);

paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth( 5);
paint.setShadowLayer( 20, - 2010, Color.BLACK);
canvas.drawCircle(startX + radius *  2 + offest, startY, radius, paint);



setXfermode使用方法
Xfer词意为传送,在里可以解释为:第二次的图像是通过何种模式传送到第前一次图像里的,说白了,就是两个图像如何叠加。
Paint的 Xfermode有3种,都是继承 Xfermode:
1)AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
2)PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。
3)PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则
在Android SDK自带的ApiDemo里没有前两者的案例。可能是因为 PorterDuffXfermode太强大了,这里也就只介绍 PorterDuffXfermode了。

所有的 PorterDuffXfermode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
     private  static  final Xfermode[] sModes = {
         new PorterDuffXfermode(PorterDuff.Mode.CLEAR),       //清空所有,要闭硬件加速,否则无效
         new PorterDuffXfermode(PorterDuff.Mode.SRC),         //显示前都图像,不显示后者
         new PorterDuffXfermode(PorterDuff.Mode.DST),         //显示后者图像,不显示前者
         new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),    //后者叠于前者
         new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),    //前者叠于后者
         new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),      //显示相交的区域,但图像为后者
         new PorterDuffXfermode(PorterDuff.Mode.DST_IN),      //显示相交的区域,但图像为前者
         new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),     //显示后者不重叠的图像
         new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),    / /显示前者不重叠的图像
         new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),    //显示前者图像,与后者重合的图像
         new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),    //显示后者图像,与前者重合的图像
         new PorterDuffXfermode(PorterDuff.Mode.XOR),         //显示持有不重合的图像
         new PorterDuffXfermode(PorterDuff.Mode.DARKEN),      //后者叠于前者上,后者与前者重叠的部份透明。要闭硬件加速,否则无效
         new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),     //前者叠于前者,前者与后者重叠部份透明。要闭硬件加速,否则无效
         new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),    //显示重合的图像,且颜色会合拼
         new PorterDuffXfermode(PorterDuff.Mode.SCREEN) };    //显示持有图像,重合的会变白
如果把第二层透明度设为160后效果如下

Paint类setMaskFilter函数的使用
setMaskFilter的参数 MaskFilter 有两个子类: EmbossMaskFilter和 BlurMaskFilter
BlurMaskFilter   指定了一个模糊的样式和半径来处理Paint的边缘。
EmbossMaskFilter  指定了光源的方向和环境光强度来添加浮雕效果。
1
2
3
4
5
6
7
8
9
10
11
// 设置光源的方向
float[] direction =  new  float[] {  111 };
//设置环境光亮度
float light =  0.4f;
// 选择要应用的反射等级
float specular =  6;
// 向mask应用一定级别的模糊
float blur =  3.5f;
EmbossMaskFilter emboss =  new EmbossMaskFilter(direction, light, specular, blur);
// 应用mask
myPaint.setMaskFilter(emboss);

1
2
mBlur =  new BlurMaskFilter( 10, BlurMaskFilter.Blur.SOLID);
mPaint.setMaskFilter(mBlur);
             

颜色渐变setShader的使用
LinearGradient设置颜色没变的属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 
* LinearGradient shader = new LinearGradient(0, 0, endX, endY, new 
* int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f, 
* 1.0f}, TileMode.MIRROR); 
* 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点 
* 其中参数new int[]{startColor, midleColor,endColor}是参与渐变效果的颜色集合,  
* 其中参数new float[]{0 , 0.5f, 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布 
*/
  
Shader mShader =  new LinearGradient( 00100100new  int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null, Shader.TileMode.REPEAT);  
paint.setShadowLayer( 20, - 2010, Color.BLACK);   //设置阴影

// Shader.TileMode三种模式  
// REPEAT:沿着渐变方向循环重复  
// CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色  
// MIRROR:与REPEAT一样都是循环重复,但这个会对称重复  
paint.setShader(mShader); // 用Shader中定义定义的颜色来话  


PathEffect 类的使用:

1
2
3
4
5
6
7
8
9
e[ 0] = null;      // no effect
// CornerPathEffect(角度)
e[ 1] =  new CornerPathEffect( 10);   //线带角度的地方会变成弧形
//( {线长度,间隔大小}, 与上一次的偏移量)
e[ 2] =  new DashPathEffect( new  float[] { 10555}, phase);
e[ 3] =  new PathDashPathEffect(makePathDash(),  12, phase, PathDashPathEffect.Style.ROTATE);
//两种效果全拼,先使用第一种,再使用第二种
e[ 4] =  new ComposePathEffect(e[ 2], e[ 1]);
e[ 5] =  new ComposePathEffect(e[ 3], e[ 1]);


参考文章: http://wpf814533631.iteye.com/blog/1847661
  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封面 1 序 2 捐助说明 5 目 录 7 第一章 View的绘图流程 12 1.1、概述 12 1.2、Activity的组成结构 13 1.3、View树的绘图流程 15 1.3.1 测量组件大小 16 1.3.2 确定子组件的位置 17 1.3.3 绘制组件 18 1.4、说点别的 22 1.5 练习作业 22 第二章 Graphics2D API 23 2.1、概述 23 2.2、Point类和PointF类 23 2.3、Rect类和RectF类 25 2.4、Bitmap类和BitmapDrawable类 32 2.5、Canvas类与Paint类 34 2.5.1 绘图概述 34 2.5.2 Paint类 34 2.5.3 Canvas类 39 2.6 练习作业 63 第三章 使用Graphics2D实现动态效果 64 3.1 概述 64 3.2 invalidate()方法 65 3.3 坐标转换 69 3.4 剪切区(Clip) 73 3.5 案例:指针走动的手表 82 3.6 练习作业 88 第四章 双缓存技术 89 4.1 双缓存 89 4.2 在屏幕上绘制曲线 90 4.3 在屏幕上绘制矩形 99 4.4 案例:绘图App 104 4.4.1 绘图属性 106 4.4.2 软件参数 108 4.4.3 绘图缓冲区 109 4.4.4 撤消操作 111 4.4.5 图形绘制 113 4.4.6 绘图区 118 4.4.7 主界面 119 4.5 练习作业 122 第五章 阴影、渐变和位图运算 123 5.1 概述 123 5.2 阴影 123 5.3 渐变 125 5.3.1 线性渐变(LinearGradient) 126 5.3.2 径向渐变(RadialGradient) 130 5.3.3 扫描渐变(SweepGradient) 135 5.3.4 位图渐变(BitmapShader) 138 5.3.5 混合渐变(ComposeShader) 140 5.3.6 渐变与Matrix 142 5.4 位图运算 143 5.4.1 PorterDuffXfermode 143 5.4.2 图层(Layer) 146 5.4.3 位图运算技巧 148 5.5 案例1:圆形头像 152 5.6 案例2:刮刮乐 156 5.7 练习作业 161 第六章 自定义组件 163 6.1 概述 163 6.2 自定义组件的基本结构 164 6.3 重写onMeasure方法 166 6.4 组件属性 175 6.4.1 属性的基本定义 175 6.4.2 读取来自style和theme中的属性 181 6.5 案例1:圆形ImageView组件 186 6.6 案例2:验证码组件CodeView 190 6.7 练习作业 202 第七章 自定义容器 204 7.1 概述 204 7.2 ViewGroup类 205 7.2.1 ViewGroup常用方法 205 7.2.2 ViewGroup的工作原理 208 7.2.3 重写onLayout()方法 213 7.3 CornerLayout布局 217 7.3.1 基本实现 217 7.3.2 内边距padding 224 7.3.3 外边距margin 228 7.3.4 自定义LayoutParams 238 7.4 案例:流式布局(FlowLayout) 246 7.5 练习作业 256 第八章 Scroller与平滑滚动 257 8.1 概述 257 8.2 认识scrollTo()和scrollBy()方法 258 8.3 Scroller类 264 8.4 平滑滚动的工作原理 271 8.5 案例:触摸滑屏 272 8.5.1 触摸滑屏的技术分析 272 8.5.2 速度跟踪器VelocityTracker 273 8.5.3 触摸滑屏的分步实现 274 8.6 练习作业 285 第九章 侧边栏 287 9.1 概述 287 9.2 使用二进制保存标识数据 289 9.2.1 位运算符 289 9.2.2 位运算的常用功能 292 9.3 继承自ViewGroup的侧边栏 293 9.4 继承自HorizontalScrollView的侧边栏 304 9.5 练习作业 312 第十章 加强版ListView 313 10.1 概述 313 10.2 ListView的基本使用 314 10.3 ListItem随手指左右滑动 318 10.4 向右滑动删除ListItem 326 10.5 滑动ListItem出现删除按钮 336 10.5.1 列表项专用容器ExtendLayout 337 10.5.2 列表项能滑出删除按钮的ListView 342 10.5.3 定义布局文件 350 10.5.4 显示ListView 351 10.6练习作业 353 案例代码说明 354
Android倒车轨迹线的实现方法可以分为两种,一种是使用Camera2 API获取摄像头预览画面并在上面绘制轨迹线,另一种是使用第三方库实现。 1. 使用Camera2 API获取摄像头预览画面并在上面绘制轨迹线 首先需要在AndroidManifest.xml文件中添加摄像头权限: ```xml <uses-permission android:name="android.permission.CAMERA" /> ``` 然后在布局文件中添加TextureView控件用于预览摄像头画面: ```xml <TextureView android:id="@+id/textureView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 接下来,在Activity中获取TextureView控件并打开后置摄像头: ```java private TextureView textureView; private CameraDevice cameraDevice; private CameraCaptureSession cameraCaptureSession; private CaptureRequest.Builder captureRequestBuilder; private HandlerThread backgroundThread; private Handler backgroundHandler; private Size imageDimension; private void openCamera() { CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { String cameraId = manager.getCameraIdList()[0]; CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); imageDimension = map.getOutputSizes(SurfaceTexture.class)[0]; manager.openCamera(cameraId, stateCallback, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private final CameraDevice.StateCallback stateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice camera) { cameraDevice = camera; createCameraPreview(); } @Override public void onDisconnected(@NonNull CameraDevice camera) { cameraDevice.close(); } @Override public void onError(@NonNull CameraDevice camera, int error) { cameraDevice.close(); cameraDevice = null; } }; private void createCameraPreview() { SurfaceTexture texture = textureView.getSurfaceTexture(); texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight()); Surface surface = new Surface(texture); try { captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); captureRequestBuilder.addTarget(surface); cameraDevice.createCaptureSession(Collections.singletonList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { if (cameraDevice == null) return; cameraCaptureSession = session; updatePreview(); } @Override public void onConfigureFailed(@NonNull CameraCaptureSession session) { } }, null); } catch (CameraAccessException e) { e.printStackTrace(); } } private void updatePreview() { if (cameraDevice == null) return; captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); try { cameraCaptureSession.setRepeatingRequest(captureRequestBuilder.build(), null, backgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 以上代码中,首先通过CameraManager获取后置摄像头的ID,然后获取该摄像头的特性和输出尺寸,在onOpened()方法中创建CameraCaptureSession并设置预览画面,最后在updatePreview()方法中更新预览画面。 接下来,可以在预览画面上绘制倒车轨迹线。通过TextureView控件获取画布并绘制轨迹线: ```java private void drawPath() { Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setColor(Color.RED); Bitmap bitmap = textureView.getBitmap(); Canvas canvas = textureView.lockCanvas(); canvas.drawBitmap(bitmap, 0, 0, null); Path path = new Path(); path.moveTo(0, textureView.getHeight() / 2); path.lineTo(textureView.getWidth(), textureView.getHeight() / 2); canvas.drawPath(path, paint); textureView.unlockCanvasAndPost(canvas); } ``` 以上代码中,首先获取TextureView控件的Bitmap对象,然后获取画布并绘制预览画面,最后绘制轨迹线并释放画布。 2. 使用第三方库实现 除了使用Camera2 API自行实现倒车轨迹线外,也可以使用第三方库实现。常用的第三方库有CameraView和CameraKit-Android。 以CameraView为例,首先需要在build.gradle文件中添加依赖: ```groovy implementation 'com.otaliastudios:cameraview:2.7.2' ``` 然后在布局文件中添加CameraView控件: ```xml <com.otaliastudios.cameraview.CameraView android:id="@+id/cameraView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 接下来,在Activity中获取CameraView控件并设置预览画面: ```java private CameraView cameraView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cameraView = findViewById(R.id.cameraView); cameraView.setLifecycleOwner(this); cameraView.addFrameProcessor(frame -> drawPath()); } ``` 以上代码中,首先获取CameraView控件并设置生命周期,然后添加FrameProcessor用于在预览画面上绘制倒车轨迹线。 最后,实现drawPath()方法绘制倒车轨迹线: ```java private void drawPath() { Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5); paint.setColor(Color.RED); Bitmap bitmap = cameraView.getBitmap(); Canvas canvas = cameraView.getPreviewCanvas(); Path path = new Path(); path.moveTo(0, cameraView.getHeight() / 2); path.lineTo(cameraView.getWidth(), cameraView.getHeight() / 2); canvas.drawPath(path, paint); } ``` 以上代码中,首先获取CameraView控件的Bitmap对象,然后获取预览画面的画布并绘制轨迹线。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值