导航:首页 > 操作系统 > android绘制多边形

android绘制多边形

发布时间:2023-01-12 00:06:29

⑴ 如何绘制放手多边形的谷歌地图V2在android

我觉着可以让那个按钮在鼠标或是手指碰触的时候,显示相应的信息或是功能,不适用的时候(也就是不碰触的时候)让他变成透明的按钮,在成寻中用代码控制就可以了.... 查看原帖>>

⑵ 如何用android 画出三角形

1、设置View,重写protected void onDraw(Canvas canvas)方法
2、使用onDraw中的canvas,通过Path设置三角形的三个顶点,通过drawPath方式绘制三角形
示例:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawText("画三角形:", 10, 200, p);
// 绘制这个三角形,你可以绘制任意多边形
Path path = new Path();
path.moveTo(80, 200);// 此点为多边形的起点
path.lineTo(120, 250);
path.lineTo(80, 250);
path.close(); // 使这些点构成封闭的多边形
canvas.drawPath(path, p);
}

⑶ 怎么给android 设置边框

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑。Android在开发过程中,很多情况下需要我们在TextView上面添加一个边框,但是TextView本身不支持边框,这里介绍几种设置边框的方法,可以供大家参考:

⑷ android怎么移动canvas

我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。也就是说在这种方式下我们已经能一笔一划或者使用

Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。前面一种适合处理量比较小,帧率比较小的动画,比如说象棋游戏之类的;而后一种主要用在游戏,高品质动画方面的画图。

Paint 代表了Canvas上的画笔、画刷、颜料等等;
Paint类常用方法:
setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
setAlpha(int a) // 设置alpha不透明度,范围为0~255
setAntiAlias(boolean aa) // 是否抗锯齿
setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
setTextSize(float textSize) // 设置字体大小
setUnderlineText(booleanunderlineText) // 设置下划线

// 1、将会以颜色ARBG填充整个控件的Canvas背景
//mCanvas.drawARGB(122, 10, 159, 163) ;
// 2、将会以颜色ARBG填充整个控件的Canvas背景
//mCanvas.drawColor(Color.BLUE) ;
// 3、绘制颜色,但是要制定一个mode
//mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ;
// 4、画背景,跟2等效
//mCanvas.drawPaint(mPaint) ;
// 5、画一个点
//mCanvas.drawPoint(23, 23, mPaint) ;
// 6、画很多点这里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....}
//mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ;
// 7、画线
//mCanvas.drawLine(...) ;
// 8、画长方形 Rect 和RectF的区别?
//精度不一样,Rect是使用int类型作为数值,RectF是使用float类型作为数值
//Rect r = new Rect(10,10,50,50) ;
//mCanvas.drawRect(r, mPaint) ;
//RectF rf = new RectF(10,10,50,50) ;
//mCanvas.drawRect(rf, mPaint) ;
//mCanvas.drawRect(10, 10, 50, 50, mPaint) ;
// 9、画椭圆 初始化RectF的参数是(left,top,right,bottom)
//RectF rf = new RectF(100,100 ,200 ,250) ;
//mCanvas.drawOval(rf, mPaint) ;
// 10、画圆 (圆心x0,圆心y0,半径,paint)
//mCanvas.drawCircle(100, 100, 50, mPaint) ;
// 11、画圆弧 RectF对象表明内切矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 参数(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否显示圆弧三角形 angle画多少度
//mCanvas.drawArc(rf, 60, 30, true, mPaint) ;
// 12、绘制圆角矩形 RectF是矩形的(left,top,right,bottom)
//RectF rf = new RectF(100 ,100 ,200 ,200) ;
// 50表明x方向的半径,20表示y方向的半径
//mCanvas.drawRoundRect(rf, 50, 20, mPaint) ;
// 13、画任意多边形
//Path path = new Path() ;
//path.moveTo(100, 100) ;
//path.lineTo(200, 200) ;
//path.lineTo(300, 200) ;
//mCanvas.drawPath(path, mPaint) ;
// 14、通过Path对象,也可以画其他的图形
//Path path = new Path() ;
//path.addCircle(100, 100, 20, Path.Direction.CCW) ;
//mCanvas.drawPath(path ,mPaint);

/*drawBitmap
drawText
drawPicture*/

/*Rect r = new Rect(100,100,200,200) ;
ByteArrayOutputStream out = new ByteArrayOutputStream();
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ;
InputStream in = new ByteArrayInputStream(out.toByteArray()) ;
*/
/*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ;
mCanvas.drawPicture(picture) ;*/

// 15、画bitmap对象
//mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ;

// 16、Matrix中包含了对Bitmap的处理操作
/*Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/

// 17、画带Matrix参数的bitmap,经过Matrix对象可以对bitmap做相关的处理,比如旋转,缩放,移动等《关于Matrix的使用另行总结》
/*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ;
Matrix m = new Matrix() ;
m.postScale(2, 2) ;
m.postRotate(60) ;
m.postTranslate(300, 300) ;
mCanvas.drawBitmap(bitmap, m, mPaint) ;*/
//mCanvas.drawBitmap(....) ; 暂不总结
// 18、画文字
//mCanvas.drawText(123, 10, 10, mPaint) ;

//mCanvas.drawText(....)

⑸ android绘图之Paint(1)

Paint 讲解开篇

android中绘制特定图案类似显示中的绘画需要画笔和画纸,为此android提供了Paint和Canvas。
Paint和Canvas分别代表画笔和画布。
The Paint class holds the style and color information about how to draw geometries, text and bitmaps.
Paint类似画笔,保存着绘制文本,图形,图片的样式和颜色信息。(颜色,宽度,粗细,透明度,字体样式,字体大小)。

提供了三种初始化方法:
Paint(),
Paint(int flags),
Paint(Paint paint)。

第二种构造函数传入了flag,相当于无参构造之后调用了setFlags(int),有很多种flag,这里举个例子UNDERLINE_TEXT_FLAG(其他的flag见developers文档),绘制文字时会有下划线,多个flag或可以达到设置多个flag的目的。

Paint常用的设置函数:
setAlpha()透明度
setAntiAlias()抗锯齿
setColor(),setARGB()设置颜色
setStyle(Paint.Style style) 设置填充样式
setStrokeCap(Paint.Cap cap) 画笔的样式(落笔,收笔时)
setStrokeJoin(Paint.Join join)连接点的样式
setStrokeWidth(float width)设置画笔宽度
setShadowLayer(float radius, float dx, float dy, int shadowColor) 设置阴影
setTextSize(float textSize) 字体大小
setTextAlign(Paint.Align.RIGHT)设置字体对齐方式

后期讲解:
setColorFilter(ColorFilter filter) 设置颜色过滤
setUnderlineText(true) 下划线
setPathEffect() 设置路径效果
setTypeface() 设置字体风格
setFilterBitmap() 设置图片过滤
setXfermode(Xfermode xfermode) xfermode设置图像混合模式
setShader(Shader shader) 设置shader包括渐变shader,图片shader
。。。。。。。。

setAlpha(int a) 设置透明度,a 值得范围 [0..255],仅仅改变setColor()的颜色的透明度,不改变颜色值,0是完全透明,255完全不透明。
注意:需要先调用setColor(),再调用setAlpha才会生效,否则将会被覆盖,因为setColor中包含了alpha。

setStyle设置填充样式,所谓填充的样式指只绘制线或者绘制同时填充:
Paint.Style.FILL 填充内部,会把闭合区域填充颜色
Paint.Style.FILL_AND_STROKE 填充内部和描边
Paint.Style.STROKE 仅描边,仅仅绘制边界
默认FILL 填充内部,

STROKE样式

FILL_AND_STROKE样式和FILL 类似但当画笔宽度很宽时会产生不同

setColor,setARGB设置颜色,设置画笔的颜色,setARGB()参数范围0-255。
setAntiAlias(boolean) 抗锯齿,使边界更顺滑(有些屏幕分辨率不高,导致像素点比较大,绘制边界可能会有颗粒感,打开抗锯齿边界颗粒感会减少)。

setTextSize(float textSize) 字体大小,单位是px,如果是dp要注意转换。
setTextAlign(Paint.Align.RIGHT)设置字体对齐方式,根据下面的实例可以,对齐方式基于开始绘制的点。
一起讲解:

mPaint.setTextSize(50);
mPaint.setTextAlign(Paint.Align.LEFT);
canvas.drawText("android Paint 学习 LEFT",300,300,mPaint);
mPaint.setTextAlign(Paint.Align.CENTER);
canvas.drawText("android Paint 学习 CENTER",300,400,mPaint);
mPaint.setTextAlign(Paint.Align.RIGHT);
canvas.drawText("android Paint 学习 RIGHT",300,500,mPaint);

setTextAlign对齐是相对于开始绘制的坐标点。

setShadowLayer(float radius, float dx, float dy, int shadowColor) 设置阴影

mPaint.setShadowLayer(10,-20,30,Color.GRAY);
canvas.drawText("android Paint 学习 CENTER",getWidth()/2,450,mPaint);

setShadowLayer(float radius, float dx, float dy, int shadowColor)
Radius设置角度,dx,dy控制字体的上下左右出现,有正负之分,dx的正负代表右左,dy的正负代表下上。

setStrokeCap(Paint.Cap.ROUND)
设置绘制起始点和结尾点的样式,
三种样式ROUND,BUTT,SQUARE
Cap.ROUND(圆形)、Cap.SQUARE(方形)、Paint.Cap.BUTT(无)
ROUND:

BUTT和SQUARE差别不大:

setStrokeJoin(Paint.Join join),设置绘制path连接点的样式
mPaint.setStrokeJoin(Paint.Join.ROUND);
// mPaint.setStrokeJoin(Paint.Join.MITER);
// mPaint.setStrokeJoin(Paint.Join.BEVEL);

Join.MITER(结合处为锐角)、
Join.Round(结合处为圆弧)、
Join.BEVEL(结合处为直线)

ROUND样式:

MITER样式:

BEVEL样式:

setXfermode(Xfermode xfermode) xfermode设置图像混合模式
setShader(Shader shader) 设置shader包括渐变shader,图片shader
还有很多其他属性会后续讲解。

android绘图之Paint(1)
android绘图之Canvas基础(2)
Android绘图之Path(3)
Android绘图之drawText绘制文本相关(4)
Android绘图之Canvas概念理解(5)
Android绘图之Canvas变换(6)
Android绘图之Canvas状态保存和恢复(7)
Android绘图之PathEffect (8)
Android绘图之LinearGradient线性渐变(9)
Android绘图之SweepGradient(10)
Android绘图之RadialGradient 放射渐变(11)
Android绘制之BitmapShader(12)
Android绘图之ComposeShader,PorterDuff.mode及Xfermode(13)
Android绘图之drawText,getTextBounds,measureText,FontMetrics,基线(14)
Android绘图之贝塞尔曲线简介(15)
Android绘图之PathMeasure(16)
Android 动态修改渐变 GradientDrawable

⑹ android 多边形怎么定义

shqpe属性的设置说明:
1.rect 定义一个矩形区域,coords属性设置值为矩形的左上角,右下角的坐标,各个坐标值之间用逗号分开;
2.poly 定义一个多边形区域, coords属性设置值为多边形各项顶点的坐标值;
3.circle 定义一格圆形区域,
coords属性设置值为圆心坐标及半径,前两个参数分别为圆心的横,纵坐标,第三个参数为半径.

⑺ Android 绘制与 16ms 不得不说的故事

刷新率:每秒屏幕刷新次数。
帧率:GPU 在一秒内绘制的帧数。
虽然现在有的厂商推出了高刷新率的手机,但是主流的还是 60Hz,即1秒显示60帧,1000ms / 60 frames ≈ 16.67 ms/frames,为了保证 App 的流畅度,我们应该尽量让每帧的绘制时间不超过 16ms。

Android 的显示过程可以简单概括为:应用程序把经过 measure(测量)、layout(布局)、draw(绘制)后的 surface 缓存数据,通过 SurfaceFlinger 把数据渲染到显示屏幕上,通过 Android 的刷新机制来刷新数据。换言之,应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层通过刷新机制把数据更新到屏幕上。

以下是有关概念的解释:

在 Android 中每个 view 都会经过 measure 和 layout 来确定其所在的大小和位置,然后绘制到 surface (缓冲区上),绘制是由 ViewRootImpl 类中 performTraversals() 方法发起的。

Android支持两种绘制方式: 和 。硬件极速从 Android 3.0 开始支持,它在 UI 显示和绘制效率方面远高于软件绘制,但是它的也有缺点:

经过多次绘制后,要显示的 view 相关的数据存储(如大小和位置)在 Surface 的缓冲区中,接下来渲染操作交由系统进程中的 SurfaceFlinger 服务来完成,这是一个 IPC(进程间通信)过程。SurfaceFlinger 的主要工作流程如下:

当 Android 应用层在图形缓冲区中绘制好 View 层次结后,应用层通过 Binder 机制与 SurfaceFlinger 通信并借助一块匿名共享内存把图形缓冲区交给 SurfaceFlinger 服务。由于单纯的匿名共享服务在传递多个窗口数据时缺乏有效的管理,所以匿名共享内存就被抽象为一个更上层的数据结构——SharedClient,在 SharedClient 中,最多有 31 个 SharedBufferStack,每个 SharedBufferStack 都对应一个 Surface 即一个 Window。 这表明一个 Android 应用程序最多可以包含 31 个 window

绘制的过程首先是 CPU 准备数据(measure、layout等),GPU 负责栅格化、渲染。因为图像 API 不允许 CPU 直接与 GPU 通信,所以要通过一个图形驱动的中间层来进行连接。图形驱动里面维护了一个队列,CPU 把 display list(待显示的数据列表)添加到队列中,GPU 从这个队列中取出数据进行绘制,最终在屏幕上显示出来,如下图所示:

Android 系统每隔 16ms 会发出 VSYNC 信号,触发对 UI 进行渲染,如果每次都渲染成功,就能够达到流畅画面所需的 60PS。

双缓冲顾名思义是有两个缓冲区(上文提到的 SharedBufferStack),分别是 FontBuffer(又叫作 FrameBuffer) 和 BackBuffer。UI 总是先在 Back Buffer 中绘制,然后再和 Font Buffer 交换,渲染到显示设备中,即只有当另一个 buffer 的数据准备好后,才会通过系统调用来通知显示设备切换 Buffer。

双缓冲机制在大部分情况下是适用的,但是如果某个环节出现了问题,CPU 资源就有可能存在浪费,如下图所示:

VSYNC 类似与时钟中断。竖线分割的部分代表 16ms 的时间段。正常情况下,在每一时间段内,Display 显示一帧数据(即每秒60帧)。

上图中在第二个 16ms 时间段内,Display 本应显示 B 帧,但是因为 GPU 还在处理 B 帧,导致 A 帧被重复显示。与此同时,在第二个时间段内,处于 CPU 处于空闲状态,造成了浪费。因为 A Buffer 被 Diaplay 在使用(SufaceFlinger 用完后不会释放当前的 Buffer,只会释放旧的 Buffer),B Buffer 被 GPU 在使用,这就是 双缓冲机制的局限性。

Android 4.1 版本中对 Android Display 系统进行了重构,引入了三个核心元素:

在第二个 16ms 时间内,CPU 使用 C Buffer 绘图,虽然还是会多显示 A 帧一次,但是后续的显示相对双缓冲机制就顺滑多了。但是 Buffer 并不是越多越好,从上图可知,在第二个时间内,CPU 绘制的第 C 帧数据要到第四个 16ms 才能显示,这比双 Buffer 多了 16ms 的延迟。由此可见,双缓冲保证低时延,三缓冲保证稳定性。

整个流程简单来说就是 CPU/GPU 会接收到 VSYNC 信号,触发对 UI 进行渲染(每 16ms 显示一帧)。 在 16ms 内需要完成两项任务:将 UI 对象转换为一系列多边形和纹理(栅格化)和 CPU 传递处理数据到 GPU ,更详细的内容可以看这篇文章 Android的16ms和垂直同步以及三重缓存 。

了解 Android 绘制流程后,我们不难反推 Android 应用程序卡顿的原因:

⑻ android 怎么手动绘制几何图形源码

可以参考下面的代码
package cn.m15.xys;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class Geometry extends Activity {
public int mScreenWidth = 0;
public int mScreenHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(new GeometryView(this));
super.onCreate(savedInstanceState);
}
class GeometryView extends View {
Paint mPaint = null;
public GeometryView(Context context) {
super(context);
mPaint = new Paint();
mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置画布颜色 也就是背景颜色
canvas.drawColor(Color.WHITE);
mPaint.setColor(Color.BLACK);
canvas.drawText("绘制无规则几何图形喔!!!", 150, 30, mPaint);
//绘制一条线
mPaint.setColor(Color.BLACK);
mPaint.setStrokeWidth(4);
canvas.drawLine(0, 0, 100, 100, mPaint);
//绘制一个矩形
mPaint.setColor(Color.YELLOW);
canvas.drawRect(0, 120, 100, 200, mPaint);
//绘制一个圆形
mPaint.setColor(Color.BLUE);
canvas.drawCircle(80, 300, 50, mPaint);
//绘制一个椭圆
mPaint.setColor(Color.CYAN);
canvas.drawOval(new RectF(300,370,120,100), mPaint);
//绘制多边形
mPaint.setColor(Color.BLACK);
Path path = new Path();
path.moveTo(150+5 , 400 -50);
path.lineTo(150+45, 400 - 50);
path.lineTo(150+30, 460 - 50);
path.lineTo(150+20, 460 - 50);
path.close();
canvas.drawPath(path, mPaint);
}
}
}

⑼ Android中使用SVG矢量图打造多边形图形框架

int size = Math.min(fg.getWidth(),fg.getHeight());

阅读全文

与android绘制多边形相关的资料

热点内容
usb蓝牙android 浏览:405
服务器显示error1什么意思 浏览:708
python代码精简 浏览:457
文件加密了怎么找到了 浏览:193
jellyfin插件怎么选择主服务器 浏览:836
asp用户注册源码 浏览:48
什么是照片压缩文件 浏览:392
java调用js代码 浏览:979
昆山市民app怎么修改身份信息 浏览:779
php登陆次数 浏览:744
python字符转成数字 浏览:822
海川用的是什么服务器 浏览:376
口才是练出来的pdf 浏览:458
云服务器哪个公司性价比高 浏览:517
源码论坛打包 浏览:558
php怎么做成word 浏览:692
python批量生成密钥 浏览:492
程序员要不要考社区人员 浏览:150
app的钱怎么充q币 浏览:814
android银行卡识别 浏览:756