都是自己随手练习时写的一些小demo

Paint类:

package com.gyz;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;/*** Paint类介绍* * Paint即画笔,在绘图过程中起到了极其重要的作用,画笔主要保存了颜色, 样式等绘制信息,指定了如何绘制文本和图形,画笔对象有很多设置方法,* 大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。* * 1.图形绘制 setARGB(int a,int r,int g,int b); 设置绘制的颜色,a代表透明度,r,g,b代表颜色值。* * setAlpha(int a); 设置绘制图形的透明度。* * setColor(int color); 设置绘制的颜色,使用颜色值来表示,该颜色值包括透明度和RGB颜色。* * setAntiAlias(boolean aa); 设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。* * setDither(boolean dither); 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰* * setFilterBitmap(boolean filter); 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示* 速度,本设置项依赖于dither和xfermode的设置* * setMaskFilter(MaskFilter maskfilter);* 设置MaskFilter,可以用不同的MaskFilter实现滤镜的效果,如滤化,立体等 * setColorFilter(ColorFilter* colorfilter); 设置颜色过滤器,可以在绘制颜色时实现不用颜色的变换效果* * setPathEffect(PathEffect effect); 设置绘制路径的效果,如点画线等* * setShader(Shader shader); 设置图像效果,使用Shader可以绘制出各种渐变效果* * setShadowLayer(float radius ,float dx,float dy,int color);* 在图形下面设置阴影层,产生阴影效果,radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色* * setStyle(Paint.Style style); 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE* * setStrokeCap(Paint.Cap cap); 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式* Cap.ROUND,或方形样式Cap.SQUARE* * setSrokeJoin(Paint.Join join); 设置绘制时各图形的结合方式,如平滑效果等* * setStrokeWidth(float width); 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度* * setXfermode(Xfermode xfermode); 设置图形重叠时的处理方式,如合并,取交集或并集,经常用来制作橡皮的擦除效果,图片圆角也可以* * 2.文本绘制 setFakeBoldText(boolean fakeBoldText); 模拟实现粗体文字,设置在小字体上效果会非常差* * setSubpixelText(boolean subpixelText); 设置该项为true,将有助于文本在LCD屏幕上的显示效果* * setTextAlign(Paint.Align align); 设置绘制文字的对齐方向* * setTextScaleX(float scaleX); 设置绘制文字x轴的缩放比例,可以实现文字的拉伸的效果* * setTextSize(float textSize); 设置绘制文字的字号大小* * setTextSkewX(float skewX); 设置斜体文字,skewX为倾斜弧度* * setTypeface(Typeface typeface); 设置Typeface对象,即字体风格,包括粗体,斜体以及衬线体,非衬线体等* * setUnderlineText(boolean underlineText); 设置带有下划线的文字效果* * setStrikeThruText(boolean strikeThruText); 设置带有删除线的效果** @author gyzboy*/
public class MyCanvasTest extends View {public Paint mPaint;private Path mPath;// 定义一个内存中的图片,该图片将作为缓冲区private Bitmap cacheBitmap = null;// 定义cacheBitmap上的Canvas对象private Canvas cacheCanvas = null;float preX = 0;float preY = 0;/*** 为了实现保存用户之前绘制的内容使用双缓冲技术,程序先不绘制在view上,先绘制在一个内存中的bitmap上,* 当绘制完成后将bitmap绘制在view上* * @param context* @param attrs*/public MyCanvasTest(Context context, AttributeSet attrs) {super(context, attrs);// 父类构造器必须放到最前面mPaint = new Paint();mPath = new Path();cacheBitmap = Bitmap.createBitmap(320, 480, Config.ARGB_8888);cacheCanvas = new Canvas();cacheCanvas.setBitmap(cacheBitmap);// 将图片画到缓存中mPaint = new Paint(Paint.DITHER_FLAG);mPaint.setColor(Color.RED);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(5);mPaint.setAntiAlias(true);// 反锯齿mPaint.setDither(true);// 与DITHER_FLAG对应,相当于开关}// @Override// protected void onDraw(Canvas canvas) {//// // 将整个桌布绘制成白色 canvas还有rotate旋转、scale缩放、skew倾斜、translate平移属性// canvas.drawColor(Color.WHITE);//// Paint paint = new Paint();// paint.setAntiAlias(true);// 去锯齿// paint.setColor(Color.BLUE);// paint.setStyle(Paint.Style.STROKE);// 设置为空心// paint.setStrokeWidth(5);//// /**// * 参数依次为x,y坐标,半径// */// canvas.drawCircle(40, 40, 30, paint);// 画圆// /**// * 同Rect// */// canvas.drawRect(40, 40, 140, 180, paint);// 绘制矩形// canvas.drawRect(10, 50, 60, 100, paint);// 正方形// /**// * 矩形左边的X坐标 150 矩形顶部的Y坐标 75 矩形右边的X坐标 260 矩形底部的Y坐标 120// * 说白了就是左上角的坐标是(150,75),右下角的坐标是(260,120)// */// RectF rf1 = new RectF(150, 20, 200, 120);// rect为整型,rectF为浮点数// /**// * x,y方向的圆化角度// */// canvas.drawRoundRect(rf1, 15, 50, paint);// RectF re11 = new RectF(10, 240, 70, 270);// // 绘制椭圆// canvas.drawOval(re11, paint);// /*// * 最重要的就是movtTo和close,如果是Style.FILL的话,不设置close,也没有区别,可是如果是STROKE模式,// * 如果不设置close,图形不封闭。// *// * 当然,你也可以不设置close,再添加一条线,效果一样。// */// Path path1 = new Path();// path1.moveTo(10, 340); // 路径绘制的开始点// path1.lineTo(70, 340);// path1.lineTo(40, 290);// path1.close();// 绘制完成,形成封闭图形,相当于画了一条连接到开头的直线// canvas.drawPath(path1, paint);//// /**// * 参数一为渐变起初点坐标x位置,参数二为y轴位置,参数三和四分辨对应渐变终点 其中参数new int[]{startColor,// * midleColor,endColor}是参与渐变效果的颜色集合, 其中参数new float[]{0 , 0.5f,// * 1.0f}是定义每个颜色处于的渐变相对位置, 这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布// */// // 为Paint设置渐变器// Shader mShader = new LinearGradient(0, 0, 40, 60, new int[] {// Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW }, null,// Shader.TileMode.REPEAT);// // Shader.TileMode三种模式// // REPEAT:沿着渐变方向循环重复// // CLAMP:如果在预先定义的范围外画的话,就重复边界的颜色// // MIRROR:与REPEAT一样都是循环重复,但这个会对称重复// paint.setShader(mShader);// // 设置阴影// paint.setShadowLayer(45, 10, 10, Color.GRAY);// paint.setStyle(Paint.Style.FILL);// 设置为实心// // 绘制圆形// canvas.drawCircle(200, 40, 30, paint);// // 绘制字体// paint.setTextSize(40);// paint.setShader(mShader);// canvas.drawText("Circle", 100, 200, paint);//// super.onDraw(canvas);// }@Overridepublic boolean onTouchEvent(MotionEvent event) {float x = event.getX();float y = event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mPath.moveTo(x, y);preX = x;preY = y;break;case MotionEvent.ACTION_MOVE:mPath.quadTo(preX, preY, x, y);// 绘制曲线preX = x;preY = y;break;case MotionEvent.ACTION_UP:cacheCanvas.drawPath(mPath, mPaint);// 绘制// mPath.reset();//清空路径break;}invalidate();// 返回true表明处理方法已经处理该事件,否则会继续传递return true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint bitmapPaint = new Paint();bitmapPaint.setColor(Color.BLACK);// 将cacheBitmap绘制到该View组件上canvas.drawBitmap(cacheBitmap, 50, 50, bitmapPaint);// 沿着path绘制canvas.drawPath(mPath, mPaint);}
}

  Path类:

package com.gyz;import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ComposePathEffect;
import android.graphics.CornerPathEffect;
import android.graphics.DashPathEffect;
import android.graphics.DiscretePathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathDashPathEffect;
import android.graphics.PathEffect;
import android.graphics.RectF;
import android.graphics.SumPathEffect;
import android.os.Bundle;
import android.view.View;/*** @author gyzboy*/
public class MyPathTest extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
//      setContentView(new MyView(this));setContentView(new MyTextView(this));}class MyView extends View {float phase;Path path;PathEffect[] effects;Paint paint;int[] colors;public MyView(Context context) {super(context);effects = new PathEffect[7];// 路径效果path = new Path();colors = new int[] {};paint = new Paint();paint.setColor(Color.BLUE);paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);path.moveTo(0, 0);for (int i = 0; i < 15; i++) {// 生成15个点,随机生成它们的Y座标。并将它们连成一条Pathpath.lineTo(i * 20, (float) Math.random() * 60);}// 初始化7个颜色colors = new int[] { Color.BLACK, Color.BLUE, Color.CYAN,Color.GREEN, Color.MAGENTA, Color.RED, Color.YELLOW };// -----------下面开始初始化7中路径效果----------// 不使用路径效果。effects[0] = null;// 使用CornerPathEffect路径效果effects[1] = new CornerPathEffect(10);// 初始化DiscretePathEffecteffects[2] = new DiscretePathEffect(3.0f, 5.0f);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 将背景填充成白色canvas.drawColor(Color.WHITE);// 初始化DashPathEffect,DashPathEffect有动画效果effects[3] = new DashPathEffect(new float[] { 20, 10, 5, 10 },phase);// 初始化PathDashPathEffect,PathDashPathEffect有动画效果Path p = new Path();p.addRect(0, 0, 8, 8, Path.Direction.CCW);effects[4] = new PathDashPathEffect(p, 12, phase,PathDashPathEffect.Style.ROTATE);// 初始化PathDashPathEffecteffects[5] = new ComposePathEffect(effects[2], effects[4]);effects[6] = new SumPathEffect(effects[4], effects[3]);// 对Canvas执行坐标变换:将画布“整体位移”到8、8处开始绘制canvas.translate(8, 8);// 依次使用7中不同路径效果、7种不同的颜色来绘制路径for (int i = 0; i < effects.length; i++) {paint.setPathEffect(effects[i]);paint.setColor(colors[i]);canvas.drawPath(path, paint);canvas.translate(0, 60);// 移动画布为了显示出不同的路径效果}// 改变phase值,形成动画效果,变化速度phase += 1;invalidate();}}class MyTextView extends View {final String DRAW_STR = "来一个测试";Path[] paths = new Path[3];Paint paint;public MyTextView(Context context) {super(context);paths[0] = new Path();paths[0].moveTo(0, 0);for (int i = 1; i <= 7; i++) {// 生成7个点,随机生成它们的Y座标。并将它们连成一条Pathpaths[0].lineTo(i * 30, (float) Math.random() * 30);}paths[1] = new Path();RectF rectF = new RectF(0, 0, 200, 120);paths[1].addOval(rectF, Path.Direction.CCW);//逆时针paths[2] = new Path();paths[2].addArc(rectF, 60, 180);// 初始化画笔paint = new Paint();paint.setAntiAlias(true);paint.setColor(Color.CYAN);paint.setStrokeWidth(1);}@Overrideprotected void onDraw(Canvas canvas) {canvas.drawColor(Color.WHITE);canvas.translate(40, 40);// 设置从右边开始绘制(右对齐)paint.setTextAlign(Paint.Align.RIGHT);paint.setTextSize(20);// 绘制路径paint.setStyle(Paint.Style.STROKE);canvas.drawPath(paths[0], paint);// 沿着路径绘制一段文本。paint.setStyle(Paint.Style.FILL);canvas.drawTextOnPath(DRAW_STR, paths[0], -8, 20, paint);// 对Canvas进行坐标变换:画布下移120canvas.translate(0, 60);// 绘制路径paint.setStyle(Paint.Style.STROKE);canvas.drawPath(paths[1], paint);// 沿着路径绘制一段文本。paint.setStyle(Paint.Style.FILL);canvas.drawTextOnPath(DRAW_STR, paths[1], -20, 20, paint);// 对Canvas进行坐标变换: 画布下移120canvas.translate(0, 120);// 绘制路径paint.setStyle(Paint.Style.STROKE);canvas.drawPath(paths[2], paint);// 沿着路径绘制一段文本。paint.setStyle(Paint.Style.FILL);canvas.drawTextOnPath(DRAW_STR, paths[2], -10, 20, paint);}}
}

  

转载于:https://www.cnblogs.com/gyzboy/p/4626751.html

Android Paint、Path详解相关推荐

  1. Android之canvas详解

    首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, y ...

  2. Android Text文字详解

    Android Text文字详解 1.绘制文字 1.1 普通绘写文字 1.2 单独指定每个文字的位置 1.3 沿路径绘写文字 2.字体样式 2.1 Paint相关样式 2.2 Typeface字体样式 ...

  3. 《Android游戏开发详解》一2.2 设置开发机器

    本节书摘来异步社区<Android游戏开发详解>一书中的第2章,第2.2节,作者: [美]Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区 ...

  4. Android Studio 安装详解及安装过程中出现的问题解决方案

    Android Studio 安装详解及安装过程中出现的问题解决方案 一,Android Studio安装包下载, 首先到官网下载,就是去Android Studio中文社区官网下载你的平台需要的安装 ...

  5. Android 全局大喇叭——详解广播机制

    Android 全局大喇叭--详解广播机制 一.广播机制简介 1. 标准广播(Normal broadcasts) 2. 有序广播(Ordered broadcasts) 二.接收系统广播 1. 动态 ...

  6. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

  7. JMessage Android 端开发详解

    JMessage Android 端开发详解 目前越来越多的应用会需要集成即时通讯功能,这里就为大家详细讲一下如何通过集成 JMessage 来为你的 App 增加即时通讯功能. 首先,一个最基础的 ...

  8. 《Java和Android开发实战详解》——2.5节良好的Java程序代码编写风格

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第2章,第2.5节良好的Java程序代码编写风格,作者 陈会安,更多章节内容可以访问云栖社区"异步社区&quo ...

  9. Android事件流程详解

    Android事件流程详解 网络上有不少博客讲述了android的事件分发机制和处理流程机制,但是看过千遍,总还是觉得有些迷迷糊糊,因此特地抽出一天事件来亲测下,向像我一样的广大入门程序员详细讲述an ...

  10. Android Studio 插件开发详解二:工具类

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...

最新文章

  1. boost::python模块实现使用原始指针访问数据的示例
  2. 阿里云多账号管控与网络安全集中化管理能力升级发布
  3. Sublime Text3—Code Snippets(自定义代码片段)
  4. 绿得发娇的企业即时通讯软件
  5. 6.3.1遍历二叉树
  6. Initializing Java Tooling 30% 停住不动了
  7. 学习springBoot(8)RabbitMQ
  8. 打造IE6的position:fixed整理篇
  9. 关于多数据源(除自己数据库外,另一部分数据需通过接口调取第三方获取)的查询问题...
  10. Tecplot绘制流体后处理图的问题
  11. TFS2010安装教程
  12. 机器认知、人机交互、边缘计算……在这里,他们谈论了关于AI的关键议题
  13. git diff的简单使用
  14. NR/5G - Timing Advance
  15. fgets() 函数
  16. 详解Windows系统中如何释放C盘空间(转)
  17. 《蛋仔派对》沙漠通关思路
  18. RabbitMq(1)之安装
  19. 民用飞机着陆阶段着陆方法_着陆区第二部分的解剖
  20. 洛谷 P1433 吃奶酪 dfs剪枝

热门文章

  1. linux系统下的mysqlgt;aborted_MySQL令人头疼的Aborted告警案例分析
  2. JZOJ 5662. 【GDOI2018Day1模拟4.17】尺树寸泓
  3. dnd 辅助 android,Easy DND
  4. ps抠头发插件_「福利」PS抠图神级插件——VertusFluid Mask
  5. [CH Round #61] 取数游戏
  6. CVPR 2018 LSART:《Learning Spatial-Aware Regressions for Visual Tracking》论文笔记
  7. poj3074(数独)
  8. HDU 6136 Death Podracing (堆)
  9. mysql1064 at line 6,MySQL错误1064语法,但一切似乎都很好
  10. mysql 10分钟_10分钟入门mysql(含常用的sql语句,mysql常见问题及解决方案)