[Android UI] graphics

Android Graphics专题(1)--- Canvas基础 Canvas是Android UI框架的基础,在Android的控件体系中,所有容器类、控件类在实现上都依赖于Canvas,界面的绘制实质上都是Canvas绘制的。本文将讨论Canvs的由来,并通过实例展示Canvas的基础用法。 阅读详情

本文对Android graphics API 做些整理。

一、颜色 Color类

颜色由一个int型表示,共四个字节。从高位到低位四个字节分别为透明度、红色、绿色、蓝色。
相关API:

1.给定颜色获取相关属性

int alpha(int color)//返回给定颜色的透明度值,也就是高位第一个字节。   
int red(int color)  //返回给定颜色的红色色值
int green(int color) 
int blue(int color)

2.色调、饱和度、亮度。(下面三个返回值均为 0.0f~1.0f)

float hue(int color)//色调
float saturation(int color)//饱和度
float brightness(int color)//亮度

3.组成颜色

int rgb(int red, int green, int blue) //返回不透明的rgb
int argb(int alpha, int red, int green, int blue)
int parseColor(String colorString)//解析颜色,支持"#xxx...",预定义的几个字符串如"red"、"blue"等

4.颜色转化(hsb: hue色调,saturation饱和度,brghtness亮度
转换后alpha为0xff)

int HSBtoColor(float[] hsb)
int HSBtoColor(float h, float s, float b) 
void RGBToHSV(int red, int green, int blue, float hsv[]) 
void colorToHSV(int color, float hsv[]) 
int HSVToColor(int alpha, float hsv[]) 
二、画笔 Paint类

参考文章:
Android Paint和Color类
反锯齿办法
android paint cap join 理解 图示

//设置颜色
void setColor(int color);
//抗锯齿
void setAntiAlias(boolean aa);
//设定是否使用图像抖动处理
//会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
void setDither(boolean dither);
//如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作
//加快显示速度,本设置项依赖于dither和xfermode的设置 
void setFilterBitmap(boolean filter)
//当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度
void setStrokeWidth(float width);
//这个需要关闭硬件加速才有效果,这个是根据Alpha通道来计算的。
setMaskFilter(MaskFilter maskfilter) 
//在图形下面设置阴影层,产生阴影效果radius为阴影的角度
//dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色 
setShadowLayer(float radius ,float dx,float dy,int color); 
//画笔的空心与实心,比如画一个圆圈,如果画笔为空心的
//则画出来是空心圆,如果画笔是实心的,画出来是一个实心圆。
void setStyle(Style style);

paint.setStyle(Paint.Style.STROKE);//画笔为空心的
android ui
paint.setStyle(Paint.Style.FILL); //画笔为实心的
android ui


//当画笔样式为STROKE或FILL_OR_STROKE时,用来控制我们的画笔在离开
//画板时候留下的最后一点图形,竖线处即为画笔结束处
void setStrokeCap(Cap cap);

这里写图片描述 BUTT
这里写图片描述 ROUND
这里写图片描述 SQUARE


paint.setStrokeJoin(Paint.Join.ROUND)

这里写图片描述 MITER
这里写图片描述 ROUND
这里写图片描述 BEVEL


setARGB(int a, int r, int g, int b);//设置画笔颜色
paint.setARGB(128,255,0,0);
canvas.drawCircle(centerX,centerY,200,paint);
paint.setARGB(255,255,0,0);
canvas.drawCircle(centerX+100,centerY,200,paint);

这里写图片描述


setcolorFilter 

参考
自定义控件其实很简单1/6
Paint、Canvas、Matrix使用讲解(一、Paint)

1.ColorMatrix
它定义了一个 4*5 的float[]类型的矩阵,矩阵中每一行表示 RGBA 中的一个参数。
颜色矩阵M是以一维数组m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方式进行存储的;
颜色矩阵:这里写图片描述
5x4 matrix for transforming the color+alpha components of a Bitmap. The matrix is stored in a single array, and its treated as follows: [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t ] When applied to a color [r, g, b, a], the resulting color is computed as (after clamping)
R’ = a*R + b*G + c*B + d*A + e;
G’ = f*R + g*G + h*B + i*A + j;
B’ = k*R + l*G + m*B + n*A + o;
A’ = p*R + q*G + r*B + s*A + t;

2.LightingColorFilter
LightingColorFilter(int mul, int add)//色彩倍增与偏移,这两个值都是16进制的色彩值0xAARRGGBB。最终颜色的计算方式为:(MUL_COLOR * 原色值 + ADD_COLOR )% 255

3.PorterDuffColorFilter
参考文章:
Porter-Duff 的由来

PorterDuffColorFilter(int color, PorterDuff.Mode mode)

其实就是用一个色值和要绘制的色值进行叠加,然后可以选择叠加的模式(PorterDuff.Mode),PorterDuff.Mode 以枚举的形式定义。
下面的表格中,S:源颜色,D:目标颜色,a:透明度。上面的构造函数参数color,对应下表中的 S,而下表中的D对应画笔要画上去的画布中的像素点的颜色。
这里写图片描述

PorterDuff的规则不仅用于图像的色彩混合,也用于图形混合。如果用于图像的色彩混合,个人理解,因为是在一个像素点的矩形区域进行,Src和Dst均为大小一样的矩形,像下图中的各种裁剪效果要么变成透明要么色彩叠加,裁剪效果是看不到的。

这里写图片描述

注意,这张图给人的第一感觉就是两个图形之间的集合之间的交集、并集等的处理,实际上完全不是这么一回事!
要根据上面表格中的计算公式来!

//PorterDuffXfermode  非常强大的图像混合器
//参考上面的PorterDuff.Mode,注意不要用图形集合的方式去理解它
//网上一堆例子抄来抄去,容易误导人,完全不对!按上面的计算公式来!
setXfermode(Xfermode xfermode)

setPathEffect

参考文章 自定义控件其实很简单1/4

setShader

参考文章 Paint的setShader(Shader shader)


文本绘制

//模拟实现粗体文字,设置在小字体上效果会非常差  
setFakeBoldText(boolean fakeBoldText);
//设置该项为true,将有助于文本在LCD屏幕上的显示效果  
setSubpixelText(boolean subpixelText);
//设置绘制文字的对齐方向 
setTextAlign(Paint.Align align); 
//设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果  
setTextScaleX(float scaleX);
//设置绘制文字的字号大小
setTextSize(float textSize);  
//设置斜体文字,skewX为倾斜弧度
setTextSkewX(float skewX);  
//设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等
setTypeface(Typeface typeface);  
//设置带有下划线的文字效果  
setUnderlineText(boolean underlineText);
//设置带有删除线的效果 
setStrikeThruText(boolean strikeThruText);
三、画布 Canvas类

1.Rect、RectF
Rect 用left、top、right、bottom代表一个矩形区域。
RectF,也就是用 float类型表示的Rect区域。

2.画点

void drawPoints(float[] pts, int offset, int count, Paint paint)
void drawPoints(float[] pts, Paint paint)
void drawPoint(float x, float y, Paint paint);

3.画线

void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 
void drawLines(float[] pts, int offset, int count, Paint paint);
void drawLines(float[] pts, Paint paint) 

4.画矩形

void drawRect(RectF rect, Paint paint)
void drawRect(Rect r, Paint paint)
void drawRect(float left, float top, float right, float bottom, Paint paint)

5.画圆角矩形

drawRoundRect(RectF rect, float rx, float ry, Paint paint) 

这里写图片描述

6.画圆

void drawCircle(float cx, float cy, float radius, Paint paint) 

7.画椭圆

drawOval(RectF oval, Paint paint);//根据矩形区域的宽高画椭圆

8.画弧

void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint)

宽高比为1:2的矩形区域画的圆弧,第四个参数代表是否使用中心点
这里写图片描述

9.画颜色

drawColor(int color)//把画布用颜色填满
drawColor(int color, PorterDuff.Mode mode)

10.画路径

void drawPath(Path path, Paint paint) 

Path类,代表一路径,支持直线、二阶贝塞尔曲线、三阶贝塞尔曲线,非常强大。

1.线

void lineTo(float x, float y) 
rLineTo(float dx, float dy) 

2.贝塞尔曲线
参考 贝塞尔曲线 总结、 贝塞尔曲线

二阶贝塞尔曲线

quadTo(float x1, float y1, float x2, float y2)
rQuadTo(float dx1, float dy1, float dx2, float dy2)

二阶贝塞尔曲线的用法,比较形象的例子参考 HTML5 canvas quadraticCurveTo() 方法
二次贝塞尔曲线需要两个点。第一个点是用于二次贝塞尔计算中的控制点,第二个点是曲线的结束点。曲线的开始点是当前路径中最后一个点。

这里写图片描述

这里写图片描述

这里写图片描述

原理:由 P0 至 P1 的连续点 Q0,描述一条线段。
由 P1 至 P2 的连续点 Q1,描述一条线段。
由 Q0 至 Q1 的连续点 B(t),描述一条二次贝塞尔曲线。
经验:P1-P0为曲线在P0处的切线。
3.三阶贝塞尔曲线
三阶贝塞尔曲线比二阶贝塞尔曲线多了一个控制点,参考HTML5 canvas bezierCurveTo() 方法

cubicTo(float x1, float y1, float x2, float y2,float x3, float y3) 
rCubicTo(float x1, float y1, float x2, float y2,float x3, float y3) 

这里写图片描述

这里写图片描述

这里写图片描述

通用公式:
这里写图片描述


11.弧形路径

void arcTo(RectF oval, float startAngle, float sweepAngle,boolean forceMoveTo)//弧形路径
void arcTo(RectF oval, float startAngle, float sweepAngle) 

这里写图片描述

12.画文字

void drawText(char[] text, int index, int count, float x, float y, Paint paint) 
void drawText(String text, float x, float y, Paint paint) 
void drawText(String text, int start, int end, float x, float y, Paint paint)
void drawText(CharSequence text, int start, int end, float x, float y, Paint paint)

13.在指定路径上画文字

void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)

这里写图片描述

14.平移、旋转、缩放、错切

void translate(float dx, float dy)
void rotate(float degrees)
void scale(float sx, float sy);
public final void scale(float sx, float sy, float px, float py) {
    translate(px, py);    //先平移
    scale(sx, sy);        //再缩放
    translate(-px, -py);  //在缩放的基础上平移,不会回到刚开始平移之前那个点!
}

————平移、旋转的例子—————-

int radius = 300;
int textSize = 50;
canvas.translate(centerX,centerY);//平移到中心
canvas.save();
canvas.drawCircle(0, 0, radius, paint);
paint.setTextSize(textSize);
paint.setTextAlign(Paint.Align.CENTER);
canvas.rotate(30);
for(int i = 1;i<=12;i++){
    canvas.drawText(""+i,0,-radius+textSize,paint);
canvas.drawLine(0,-radius+textSize+10,0,-radius+textSize*2,paint);
canvas.rotate(30);
}
canvas.restore();

这里写图片描述

————平移、缩放、旋转的例子—————-

int radius = 300;
int textSize = 50;
canvas.translate(centerX,centerY);
canvas.save();
canvas.drawCircle(0, 0, radius, paint);
paint.setTextSize(textSize);
paint.setTextAlign(Paint.Align.CENTER);
canvas.rotate(30);
for(int i = 1;i<=12;i++){
    canvas.drawText(""+i,0,-radius+textSize,paint);
canvas.drawLine(0,-radius+textSize+10,0,-radius+textSize*2,paint);
canvas.rotate(30);
}
canvas.restore();
canvas.scale(0.5f,0.5f);
canvas.rotate(30);
for(int i = 1;i<=12;i++){
    canvas.drawText(""+i,0,-radius+textSize,paint);
canvas.drawLine(0,-radius+textSize+10,0,-radius+textSize*2,paint);
canvas.rotate(30);
}

这里写图片描述

————错切—————-

void skew(float sx, float sy);//理解两个参数sx为在x轴方向的tan值,sy为在y轴方向的tan值,错切后面积不变。

比如原图:
这里写图片描述

x轴方向错切45°:canvas.skew(1, 0);
这里写图片描述

y轴方向错切45°:canvas.skew(0, 1);
这里写图片描述


15.Matrix变换
这个就非常牛逼了,上面提到的什么平移、旋转、缩放、错切,本质上,就是把一个坐标(x0,y0)通过一个矩阵变换为(x1,y1)
而通过Matrix转换上面例子中的平移、缩放、旋转、错切统统不在话下。
比如把一个矩形旋转45°:

matrix.setRotate(45);
canvas.concat(matrix);
canvas.drawRect(rectF1, paint);

这里写图片描述

Matrix相关数学知识可以参考 Android Matrix理论与应用详解
Android matrix偏移(平移),旋转,缩放,倾斜的原理

Matrix相关的api:

void setTranslate(float dx, float dy)
void setScale(float sx, float sy, float px, float py)   
void setScale(float sx, float sy) 
void setRotate(float degrees, float px, float py)     
void setRotate(float degrees) 
void setSinCos(float sinValue, float cosValue, float px, float py) 
void setSinCos(float sinValue, float cosValue)
void setSkew(float kx, float ky, float px, float py)
void setSkew(float kx, float ky)
boolean setConcat(Matrix a, Matrix b)

注意,对于translate,scale,rotate,skew,concat均有preXXX和postXXX两种类型,而setXXX会清除掉preXXX和postXXX的设置。preXXX相当于矩阵的左乘法,postXXX相当于矩阵的右乘。

还有许多没列出来,以后继续研究。

16.画布状态的保存与恢复

//保存当前的matrix和clip到栈里
int save()
//同上,但是可以指定保留哪些操作
int save(int saveFlags)
//新建一层入栈,后续的draw操作都在这一层画,出栈的时候会把这一层的
//东西画到前一层的上面。而这一层的区域大小,由RectF指定的bounds确定。
int saveLayer(RectF bounds, Paint paint, int saveFlags)
int saveLayer(float left, float top, float right, float bottom, Paint paint,int saveFlags) 
//新建一个带透明度的层,alpha值从0~255。
int saveLayerAlpha(RectF bounds, int alpha, int saveFlags) 
int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, int saveFlags) 
void restore()
int getSaveCount()
void restoreToCount(int saveCount)

例子:
在矩形区域上新建一个半透明的层,并画一个圆。

canvas.translate(centerX, centerY);//移动到中心
RectF rectF1 = new RectF(0,0,200,200);
canvas.drawRect(rectF1, paint);
canvas.saveLayerAlpha(rectF1, 128, Canvas.ALL_SAVE_FLAG);
Paint paint2 = new Paint();
paint2.setColor(Color.RED);
canvas.drawCircle(0,0,100,paint2);
canvas.restore();

这里写图片描述

可以看见新建的层中,画的圆形的可视区域被限制在层的矩形区域bounds中了。

17.画布的裁剪
画布的裁剪就是把当前层裁剪出一块区域出来,之后的绘画只能在这块区域里画,区域范围外是不可视的。
比如裁剪一块矩形区域,然后画个圆:

canvas.drawColor(Color.BLACK);
canvas.clipRect(100,100,200,200);
canvas.drawCircle(100,100,100,paint)

这里写图片描述

可以看见圆形的可视区域被限制在裁剪区了。

裁剪的区域是非常灵活的,支持Path。
例如裁剪两个个三角形区域,然后在里面画个圆,可以看见圆形可视区域被限制在两个三角形的路径里了。

canvas.translate(centerX, centerX);
Path path = new Path();
path.lineTo(100,0);
path.lineTo(50, 100);
path.close();
path.moveTo(50,100);
path.lineTo(100,200);
path.lineTo(0,200);
path.close();
canvas.clipPath(path);
canvas.drawColor(Color.RED);
canvas.drawCircle(50,100,50,paint);

这里写图片描述

裁剪Region
注意clipRegion与clipRect和clipPath不同,canvas的Matrix对clipRegion没有影响,clipRegion不会对Matrix进行转换。
看下面的例子:

canvas.scale(0.5f, 0.5f);
canvas.save();
canvas.clipRect(new Rect(100,100,200,200));//裁剪区域实际大小为50*50
canvas.drawColor(Color.RED);
canvas.restore();
canvas.drawRect(new Rect(0,0,100,100), paint);//矩形实际大小为50*50
canvas.clipRegion(new Region(new Rect(300,300,400,400)));//裁剪区域实际大小为100*100
canvas.drawColor(Color.BLUE);

这里写图片描述

Region类
参考
Android 2D Graphics学习(二)、Canvas篇2、Canvas裁剪和Region、RegionIterator

Region类似PS中的选区,可以用矩形或者路径来构成选区。

 //构造方法
 public Region();//创建一个空的区域
 public Region(Region region); //拷贝一个region的范围
 public Region(Rect r);  //创建一个矩形的区域
 public Region(int left, int top, int right, int bottom); //创建一个矩形的区域

/**一系列set方法,这些set方法,和上面构造方法形式差不多*/
 public void setEmpty() {
 public boolean set(Region region); 
 public boolean set(Rect r) ;
 public boolean set(int left, int top, int right, int bottom) ;

 //往一个Region中添加一个Path只有这种方法,
 //参数clip代表这个整个Region的区域,在在里面裁剪出path范围的区域
 public boolean setPath(Path path, Region clip) //用指定的Path和裁剪范围构建一个区域

//几个判断方法
public native boolean isEmpty();//判断该区域是否为空
public native boolean isRect(); //是否是一个矩阵
public native boolean isComplex();//是否是多个矩阵组合


//一系列的getBound方法,返回一个Region的边界
public Rect getBounds(); 
public boolean getBounds(Rect r); 
public Path getBoundaryPath(); 
public boolean getBoundaryPath(Path path); 


/**一系列的判断是否包含某点 和是否相交*/
public native boolean contains(int x, int y);//是否包含某点
public boolean quickContains(Rect r)   //是否包含某矩阵
public native boolean quickContains(int left, int top, int right, int bottom) //是否没有包含某矩阵
&nbsp;public boolean quickReject(Rect r) //是否没和该矩阵相交
 public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩阵相交
 public native boolean quickReject(Region rgn);  //是否没和该矩阵相交

/**几个平移变换的方法*/
public void translate(int dx, int dy) 
public native void translate(int dx, int dy, Region dst);
public void scale(float scale) //hide
public native void scale(float scale, Region dst);//hide


/**一系列组合的方法*/
public final boolean union(Rect r) 
public boolean op(Rect r, Op op) {
public boolean op(int left, int top, int right, int bottom, Op op) 
public boolean op(Region region, Op op) 
public boolean op(Rect rect, Region region, Op op) 

选区有一系列的组合操作,
假设用region1  去组合region2 
public enum Op {
        DIFFERENCE(0), //最终区域为region1 与 region2不同的区域
        INTERSECT(1), // 最终区域为region1 与 region2相交的区域
        UNION(2),      //最终区域为region1 与 region2组合一起的区域
        XOR(3),        //最终区域为region1 与 region2相交之外的区域
        REVERSE_DIFFERENCE(4), //最终区域为region2 与 region1不同的区域
        REPLACE(5); //最终区域为为region2的区域
 }
Android `android.graphics.drawable` 包深度解析:架构与设计模式 Drawable是一个抽象类,它代表了一种可以在 Canvas 上绘制的图形或图像。Drawable 可以是一个简单的位图、一个形状、一个图层列表,或者是一个复杂的动画。Drawable 的主要作用是将图形或图像的绘制逻辑封装起来,使得开发者可以方便地在不同的 UI 组件中使用。Drawable 的一个重要特点是它可以与View组件紧密结合。通过方法,开发者可以轻松地将一个 Drawable 设置为 View 的背景。此外,Drawable 还可以通过方法设置为 ImageView 的内容。 阅读详情

相关推荐

Android 14.0 recovery出厂时清理中字体大小的修改

在14.0的系统rom定制化开发中,在recovery模块也是系统中比较重要的模块,比如恢复出厂设置,recovery ota升级, 清理缓存等等,在一些1080p的设备,但是density只是240这样的设备,会在恢复出厂设置的时候,显示的字体有点小, 产品要求需要将正在清理的字体调大点,这就需要从绘制流程中,来分析问题,然后实现功能

安卓兼职framework和app工程师的博客 626

自定义android进度条渐变,Android自定义View实现渐变色进度条

在网上看到一个进度条效果图,非常美观,如下:进行效果分解:1.渐变色,看起来颜色变化并不复杂,使用LinearGradient应该可以实现。2.圆头,无非是画两个圆,外圆使用渐变色的颜色,内圆固定为白色。3.灰底,还没有走到的进度部分为灰色。4.进度值,使用文本来显示;5.弧形的头部,考虑使用直线进行连接,或者使用曲线,例如贝塞尔曲线;我首先初步实现了进度条的模样,发现样子有了,却不太美观。反思了...

weixin_35854529的博客 1099

Android 14.0 recovery竖屏界面旋转为横屏

在14.0系统rom项目定制化开发中,由于平板固定横屏显示,而如果recovery界面竖屏显示就觉得怪怪的,所以需要recovery页面横屏显示的功能, 所以今天就来解决这个问题

安卓兼职framework和app工程师的博客 566

Android 自定义View 绘制一条颜色渐变,粗细渐变的线

自定义View 绘制一条颜色渐变,粗细渐变的线 效果图如下: 自定义View 代码 import android.annotation.SuppressLint import android.content.Context import android.graphics.* import android.util.AttributeSet import android.util.Log import android.view.View public class GradientWidthAndColo

nc_kai的博客 3537

从Canny到深度学习:边缘检测指标进化史(含ODS/OIS/AP的数学推导)

本文系统梳理了边缘检测评估指标的演进历程,从经典的Canny算子到深度学习时代,重点解析了ODS、OIS和AP三大核心指标的设计哲学与数学推导。文章深入探讨了基于PR曲线的评估体系,揭示了不同指标(如ODS与OIS)在阈值优化上的差异,并分析了AP指标在边缘检测任务中的优势与局限,为算法研究和模型评估提供了实用指南。

b9c0d的博客 199

华为/H3C/锐捷交换机配置命令对比表:一张图搞定VLAN划分与端口设置

本文详细对比了华为、H3C、锐捷三大品牌交换机在VLAN划分与端口设置中的配置命令差异,提供从基础配置到高级功能的横向对比表,帮助网络工程师快速掌握多品牌设备混用环境下的配置技巧,提升工作效率。

rust6ferris的博客 698

Android 图形系统(Graphics)

系统绘制的是什么?图形缓冲区,也叫Buffer。应用层的View树最终会转换成Buffer,置于BufferQueue中被绘制。绘制的位置在哪里?应用端会把一切内容渲染到surface上,最终显示到LCD/OLED显示屏如何把图像绘制到屏幕?绘制任务由应用发起,通过跨进程方式把Buffer传到FW层,由FW层中的SurfaceFlinger服务调用Linux 硬件驱动最终绘制到硬件屏幕上。

cmyperson的博客 2195

服务器卡死排查实战:从现象分类到根因定位的完整手册

服务器卡死是运维中最令人头疼的故障之一,从游戏圈吐槽的“土豆服务器”到生产环境中的Linux系统无响应、rsync复制挂起,本质都是系统或进程失去正常响应能力。其原理通常涉及CPU、内存、磁盘IO或网络资源耗尽,以及内核和驱动异常。掌握系统化的排查方法,能够帮助工程师快速定位根因、缩短故障时间,避免盲目重启。本文从资源、层级、场景等多维度分类,结合top、dmesg、strace等工具,梳理一套从现象确认、指标收集、日志分析到进程定位的实战排查流程,并覆盖常见高频场景与预防治理建议。无论你是运维新手还是老手

weixin_33851177的博客 374

Android Graphics - 1 概述

本文翻译自Android官网的内容:https://source.android.com/devices/graphics 概述 Android framework提供了多种2D和3DGraphics渲染API,这些接口API与厂商的Graphics驱动实现交互,所以有必要对这些API的工作原理和进行深入的了解。此页面介绍了Graphics HAL层,HAL层构建于这些驱动之上。 应用...

GuoQun01的专栏 5092

U-Boot 适配新型号 SPI Nor Flash 实战解析

本文详细解析了U-Boot适配新型号SPI Nor Flash的全过程,从JEDEC ID识别错误入手,深入源码分析Flash信息数据库,结合实际手册参数添加新设备支持。重点介绍了设备树同步和验证调试的关键步骤,并总结了常见问题与解决方案,为嵌入式开发者提供实用参考。

weixin_29170327的博客 196

Arduino+L298N电机驱动模块避坑指南:从接线到PWM调速的5个常见错误

本文详细解析了使用Arduino与L298N电机驱动模块时,从电源配置、跳线帽使用到PWM调速的5个常见错误与避坑指南。重点阐述了如何正确分离逻辑与电机电源、拔掉ENA/ENB跳线帽以实现PWM调速、理解H桥接线逻辑以控制直流电机正反转,并提供优化代码与散热建议,帮助开发者稳定驱动电机。

rust6ferris的博客 561

Android入门--android.graphics.Color 颜色设置

android.graphics.Color 包含颜色值 Color.BLACK           黑色 Color.BLUE            蓝色 Color.CYAN            青绿色 Color.DKGRAY          灰黑色 Color.GRAY            灰色 Color.GREEN           绿色 Color.LTGR

眼镜的博客 8718

Android SELinux——neverallow问题处理(十六)

遇到 neverallow 规则问题,千万别急着去注释/剔除里面原有的规则(原生的尽量别动)。增加 allow 规则是常见的解决办法,但是随着 android 版本的升级,系统对 SELinux 的管控越来越严,增加了大量的 neverallow。一般情况下,向默认标签授予权限的做法是错误的,其中许多权限都是 neverallow 规则所不允许的。按照上面方法去添加 SELinux 可能会违反了 neverallow 规则,编译时候会报 neverallow 相关的错误。

小旭的专栏 2654

Android下基于XML的Graphics shape的高级UI设计,定义圆角背景等

大家很多人都用过新浪微博android客户端,感觉它的UI实在做到很精致,昨天晚上熬夜研究了新浪微博的UI相关的代码,于是有了下面这个文章。         以前的UI设计一般有两种方式,首先是UI把图形设计好,分解成UI设计元素后,在代码中直接使用,对于那些简单的图形,如

西涛offbye-移动全栈技术博客 2197

BES2700的PMU

BES2700ZP-BES2700芯片的PMU架构分析摘要:本文档分析了BES2700芯片的电源管理单元(PMU)架构。实际应用中仅需为VBAT引脚供电,其余电源均由芯片内部PMU提供。文档包含架构示意图、问题列表和参考链接,涉及PMU工作原理、外部供电要求等关键技术点。待解决问题包括具体供电参数和内部电源转换机制等。通过添加日志信息和代码片段,为开发人员提供了调试PMU功能的实用方法。

云淡风轻 117

046篇:数据统计:分组、求和、平均值、最大最小值

本文介绍了在RPA中实现数据分组统计的方法。通过字典+循环组合,可以完成按单字段或多字段的分组聚合操作,包括求和、计数、求平均值及最大/最小值等。文章详细讲解了分组统计的原理,并提供了单级分组、多级分组的具体实现步骤,最后通过销售数据按月分组的实战案例,演示了如何从原始数据到生成汇总报表的完整流程。这些方法可以灵活应用于各类数据统计分析场景。

weixin_59649563的博客 213

Android类库介绍

Android类库介绍  android.util 涉及系统底层的辅助类库  android.os 提供了系统服务、消息传输、IPC管道  android.graphics GPhone图形库,包含了文本显示、输入输出、文字样式  android.database 包含底层的API操作数据库(SQLite)  android.content 提供了各种数据传输、服务、资源管

558

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android API核心开发包介绍

摘抄(为了有个大致的了解~~): 下面介绍一下Android SDK编写程序的基石: android.util 包含一些底层辅助类,例如,特定的容器类,XML辅助工具等; android.os 提供基本的操作服务,消息传递和进程间通信IPC(Inter-Process Communication); android.graphics 作为核心渲染包,提供图形渲染功能; android.t...

wang_2011_ying的专栏 323

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )

一、使用 Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线、 二、代码示例 | 绘制效果

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2050

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

anroid API核心包介绍

android.util---------包含一些底层辅助类,如特定的容器类、XML辅助工具类等android.os-----------提供基本的操作服务,如消息传递和进程通信android.graphics-----作为核心渲染包,提供图形渲染功能android.textandroid.text.methodandroid.text.styleandroid.text.util----以上四个

血色残阳的专栏 1072

android开发:android.graphics包的介绍

是 Android 开发中用于处理图形绘制和图像操作的核心包。它提供了丰富的类和接口,用于绘制 2D 图形、处理位图、设置颜色、应用滤镜等。以下是。

qq_39460057的博客 562

android用户界面设计 pdf,androidui开发专题(一)之界面设计.pdf

/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255Android UI 开发专题(一) 之界面设计近期很多网友对Android 用户界面的设计表示很感兴趣,对于Android UI 开发自绘控件和游戏制作而言掌握好绘图基础是必不可少的。本次专题分10 节来讲述,有关OpenGL E...

weixin_36130575的博客 219

Android学习笔记三

<br />    首先有四天没有学习Android了,自我检讨一下。<br />    今天我将学习的是《图形与动画在Android中的实现》,首先看到程序import了很多android的包,这些包到底是用来干嘛的呢?在每个安装了Android SDK的目录,比如说我的是C:/android-sdk-windows/docs/offline.html,会有所有相关的reference,因为也是刚学,在这里描述,只是告诉大家,Android SDK的强大,文档这些都齐全了。以后需要经常查阅!好了, 不废话

christina123y的专栏 2300
上一篇: Java JNI实现原理初探
下一篇: [温故而知新] 《深度探索c++对象模型》——构造函数
小灰马
博客等级 码龄17年 55粉丝 42原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值