Android自定义View高级(四)-Canvas之图片文字
来源:互联网 发布:ly是哪个国家的域名 编辑:程序博客网 时间:2024/04/27 18:33
一.Canvas的常用操作速查表
二.Canvas基本操作详解
1.绘制图片
绘制有两种方法,drawPicture(矢量图) 和 drawBitmap(位图)。
(1)drawPicture
使用Picture前请关闭硬件加速,以免引起不必要的问题!
在AndroidMenifest文件中application节点下添上 android:hardwareAccelerated=”false”以关闭整个应用的硬件加速。 更多请参考这里:Android的硬件加速及可能导致的问题
PS:你可以把Picture看作是一个录制Canvas操作的录像机。
Picture的相关方法:
public CustomView(Context context, AttributeSet attrs) { super(context, attrs); // 调用录制 recording(); }
private void recording() { // 开始录制 Canvas canvas = mPicture.beginRecording(500, 500); // 创建一个画笔 Paint paint = new Paint(); paint.setColor(Color.RED); paint.setStyle(Paint.Style.FILL); // 在Canvas中具体操作 canvas.translate(250,250); // 绘制一个圆 canvas.drawCircle(0,0,100,paint); //结束录制 mPicture.endRecording(); }
@Override protected void onDraw(Canvas canvas) { mPicture.draw(canvas); }
将Picture中的内容绘制出来可以有以下几种方法:
1.使用Picture提供的draw方法绘制:
@Override protected void onDraw(Canvas canvas) { mPicture.draw(canvas); }
PS:这种方法在比较低版本的系统上绘制后可能会影响Canvas状态,所以这种方法一般不会使用。
2.使用Canvas提供的drawPicture方法绘制
drawPicture有三种方法:
public void drawPicture (Picture picture)public void drawPicture (Picture picture, Rect dst)public void drawPicture (Picture picture, RectF dst)
和使用Picture的draw方法不同,Canvas的drawPicture不会影响Canvas状态。
@Override protected void onDraw(Canvas canvas) { canvas.drawPicture(mPicture,new RectF(0,0,mPicture.getWidth(),200)); }
3.将Picture包装成为PictureDrawable,使用PictureDrawable的draw方法绘制。
// 包装成为Drawable PictureDrawable drawable = new PictureDrawable(mPicture); // 设置绘制区域 -- 注意此处所绘制的实际内容不会缩放 drawable.setBounds(0,0,250,mPicture.getHeight()); // 绘制 drawable.draw(canvas);
(2)drawBitmap
获取Bitmap方式:
通过BitmapFactory从不同位置获取Bitmap:
资源文件(drawable/mipmap/ic_launcher):
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.mipmap.ic_launcher);
资源文件(assets):
Bitmap bitmap=null;try { InputStream is = mContext.getAssets().open("bitmap.png"); bitmap = BitmapFactory.decodeStream(is); is.close();} catch (IOException e) { e.printStackTrace();}
内存卡文件:
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png");
网络文件:
Bitmap bitmap = BitmapFactory.decodeStream(is);is.close();
drawBitmap的常用方法:
// 第一种public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)// 第二种public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)// 第三种public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
第一种方法中后两个参数(matrix, paint)是在绘制的时候对图片进行一些改变,如果只是需要将图片内容绘制出来只需要如下操作就可以了:
图片左上角位置默认为坐标原点。
canvas.drawBitmap(bitmap,new Matrix(),new Paint());
第二种方法就是在绘制时指定了图片左上角的坐标(距离坐标原点的距离):
注意:此处指定的是与坐标原点的距离
canvas.drawBitmap(bitmap,300,300,new Paint());
第三种方法,上面多了两个矩形区域(src,dst),这两个矩形选区是干什么用的?
// 将画布坐标系移动到画布中央 canvas.translate(width/2,height/2); // 指定图片绘制区域(左上角的四分之一) Rect src = new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight()/2); // 指定图片在屏幕上显示的区域 Rect dst = new Rect(0,0,200,200); // 绘制图片 canvas.drawBitmap(bitmap,src,dst,null);
2.绘制文字
// 第一类public void drawText (String text, float x, float y, Paint paint)public void drawText (String text, int start, int end, float x, float y, Paint paint)public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)public void drawText (char[] text, int index, int count, float x, float y, Paint paint)// 第二类public void drawPosText (String text, float[] pos, Paint paint)public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)// 第三类public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
绘制文字部分大致可以分为三类:
第一类只能指定文本基线位置
第二类可以分别指定每个文字的位置。
第三类是指定一个路径,根据路径绘制文字。
Paint文本相关常用方法表
为了绘制文本,我们先创建一个文本画笔:
private void initPaint() { // 创建画笔 Paint textPaint = new Paint(); // 设置颜色 textPaint.setColor(Color.BLACK); // 设置样式 textPaint.setStyle(Paint.Style.FILL); textPaint.setTextSize(50); }
第一类(drawText)
// 文本(要绘制的内容) String str = "TEXTTEXT"; // 参数分别为 (文本 基线x 基线y 画笔) canvas.drawText(str,230,600,textPaint);
//参数分别为 (字符串 开始截取位置 结束截取位置 基线x 基线y 画笔) canvas.drawText(str,1,3,300,600,textPaint);
第二类(drawPosText)
可以给每一个字符指定位置(不推荐使用)
String str = "TEXTTEXT"; canvas.drawPosText(str,new float[]{ 100,100, // 第一个字符位置 150,200, // 第二个字符位置 200,300, // ... 250,400, 300,500, 350,600, 400,700, 450,800 },textPaint);
参考文章
@GcsSloop:安卓自定义View进阶-Canvas之图片文字
源码下载
源码下载:https://github.com/zeke123/MyView
- Android自定义View高级(四)-Canvas之图片文字
- 自定义View进阶-Canvas之图片文字
- 安卓自定义View进阶-Canvas之图片文字
- 安卓自定义View进阶-Canvas之图片文字
- 安卓自定义View-Canvas之图片文字
- 安卓自定义View进阶-Canvas之图片文字
- Android自定义View高级(三)-Canvas之画布操作
- 自定义View起步:Canvas之绘制文字
- 自定义View (四): onDraw 之 Canvas画布
- 自定义View——Canvas之图片文字(转载)-7
- Android自定义View(七)_Canvas之图片文字
- 自定义View起步:Canvas之绘制图片
- android开发 之 Canvas绘制文字,图片
- 【Android】自定义View之Canvas的使用
- Android 自定义View之Canvas详解
- Android自定义View高级(二)-Canvas绘制图形
- Android-view自定义-Canvas
- Android 自定义View学习之文字绘制
- Java集合(一)
- Thinkphp3.2.3 No input file specified 的解决方法
- jquery 获得焦点的时候,焦点时文本框清空,失去焦点时又显示默认文字
- oj1024
- hive数据库操作详解,creat,delete,alter,select,load..
- Android自定义View高级(四)-Canvas之图片文字
- less的使用
- 修复TortoiseGit文件夹和文件状态图标不显示问题
- angular.js之 ui-router
- DevOps:从理念到实施
- HTTP深入浅出 http请求
- C++正则表达式匹配
- (译)Xposed Helpers
- zookeeper配置开机启动