下面使用三个小例子作为讲解:
1.translate:将canvas默认的原点(0,0),进行移动


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;public class TranslateDemo extends View {Paint mPaint;// 刻度尺高度private static final int RULE_HEIGHT = 200;private static final int SUM_IN_MM = 30;int mTotalWidth = 0;int mRuleLeftMargin = 20;// 厘米之间的像素数int mLineInterval = 5;public TranslateDemo(Context context) {super(context);initData(context);}private void initData(Context context) {mTotalWidth = mRuleLeftMargin * 2 + mLineInterval * SUM_IN_MM;mPaint = new Paint();mPaint.setARGB(255, 255, 0, 0);}public TranslateDemo(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initData(context);}public TranslateDemo(Context context, AttributeSet attrs) {super(context, attrs);initData(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.setColor(Color.BLACK);canvas.translate(0, RULE_HEIGHT);canvas.drawLine(0, 0, mTotalWidth, 0, mPaint);drawLines(canvas);}private void drawLines(Canvas canvas) {// 刻度线的长度int ruleLength = 0;canvas.save();canvas.translate(mRuleLeftMargin, 0);for (int i = 0; i <= SUM_IN_MM; i++) {if (i % 10 == 0) {ruleLength = 100;} else if (i % 5 == 0) {ruleLength = 50;} else {ruleLength = 10;}canvas.drawLine(0, 0, 0, -ruleLength, mPaint);canvas.translate(mLineInterval, 0);}canvas.restore();}}

2.scale:将canvas进行缩放


import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;public class ScaleDemo extends View {Paint mPaint;final int TOTAL_SQUARE_COUNT = 30;int mHalfWidth = 0;int mHalfHeight = 0;public ScaleDemo(Context context) {super(context);initData(context);}private void initData(Context context) {mPaint = new Paint();mPaint.setARGB(255, 255, 0, 0);mPaint.setStyle(Style.STROKE);mPaint.setStrokeWidth(4);DisplayMetrics metric = new DisplayMetrics();((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);mHalfHeight = metric.heightPixels / 2;mHalfWidth = metric.widthPixels / 2;}public ScaleDemo(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initData(context);}public ScaleDemo(Context context, AttributeSet attrs) {super(context, attrs);initData(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);drawSquare(canvas);}private void drawSquare(Canvas canvas) {canvas.translate(mHalfWidth, mHalfHeight);for (int i = 0; i < TOTAL_SQUARE_COUNT; i++) {// 保存画布canvas.save();float fraction = (float) i / TOTAL_SQUARE_COUNT;// 将画布以正方形中心进行缩放canvas.scale(fraction, fraction, 0, 0);canvas.drawCircle(0, 0, 360, mPaint);// 画布回滚canvas.restore();}}
}

3.rotate进行旋转


import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;public class RotateDemo extends View {Paint mPaint;final int TOTAL_SQUARE_COUNT = 30;int mHalfWidth = 0;int mHalfHeight = 0;public RotateDemo(Context context) {super(context);initData(context);}private void initData(Context context) {mPaint = new Paint();mPaint.setARGB(255, 255, 0, 0);mPaint.setStyle(Style.STROKE);mPaint.setStrokeWidth(4);DisplayMetrics metric = new DisplayMetrics();((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(metric);mHalfHeight = metric.heightPixels / 2;mHalfWidth = metric.widthPixels / 2;}public RotateDemo(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initData(context);}public RotateDemo(Context context, AttributeSet attrs) {super(context, attrs);initData(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawColor(Color.BLUE);canvas.translate(mHalfWidth, mHalfHeight);canvas.drawCircle(0, 0, mHalfWidth, mPaint);drawLines(canvas);}public void drawLines(Canvas canvas) {canvas.save();int lineLength = 0;for (int i = 0; i < 60; i++) {if (i % 5 == 0) {lineLength = 100;} else {lineLength = 10;}canvas.drawLine(-mHalfWidth, 0,-mHalfWidth + lineLength, 0, mPaint);canvas.rotate(6);}canvas.restore();}}

Canvas translate,scale,rotate相关推荐

  1. Canvas之translate,scale,rotate,skew

    Canvas之translate,scale,rotate,skew Canvas大致可以分为三类: save,restore等与层相关的保存和回滚相关方法 scale,rotate,clipXXX等 ...

  2. HTML5 Canvas translate与rotate应用

    Translate:坐标转化 默认Canvas的起启坐标0,0是在右上角,如果让中起启坐标放在中心点就可以这样做 context.translate(centerX,centerY); Rotate: ...

  3. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法...

    前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随 ...

  4. html矩形坐标理解,HTML canvas中translate()与rotate()的理解

    首先,当我们在页面上初始化canvas时,相当于在上面放了一块画布,这块画布我们可以理解为上面有一个坐标系(如下图),左上角是原点,往右是X轴的正方向,往下是Y轴的正方向,我们在画布上绘制的内容都是基 ...

  5. 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法

    相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 一.概述 An ...

  6. android scaleanimation 动画方向,Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法...

    一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resources&g ...

  7. Android canvas.translate

    为什么80%的码农都做不了架构师?>>>    translate作用就是移动原点,默认的原点(0,0)是在屏幕左上角的,你可以通过translate(x,y)把点(x,y)作为原点 ...

  8. canvas.translate(x,y)

    2019独角兽企业重金招聘Python工程师标准>>> 之前对于canvas.translate(x,y)的理解有的错误,之前一直以原点(0,0)为基准点,作用就是移动原点,默认的原 ...

  9. translate与rotate

    今天在做旋转动画时,发现translate与rotate的顺序会对效果产生影响, 在此之前我以为顺序可以随便放的 理想情况是绕球体旋转,效果如下图 但是由于顺序写错了,效果实现如下: 看下代码有哪些地 ...

最新文章

  1. spark大数据基础概念
  2. socket io 不使用redis_Redis这么快,线程模型竟然是单线程
  3. matlab 里try用法,matlab在整个程序(全局)中使用try-catch来报告错误
  4. 牛客网算法工程师能力评估
  5. 定时器应用-页面弹出广告
  6. node静态服务器tudo
  7. pandas按行、按列合并数据
  8. 从庆祝动作解读科比和詹姆斯
  9. 15天深度复习JavaWeb的详细笔记(七)——Request、Response
  10. 2023年全国最新二级建造师精选真题及答案2
  11. 账号密码登录和注册业务逻辑
  12. 前端实现下拉显示更多功能
  13. 如何构建一个简单的图书推荐系统
  14. Android官方文档之DataBinding库
  15. 电脑基础知识-电脑不认新硬盘时该怎么办?
  16. 【微课制作软件】Focusky教程 | 支持同时打开多个文档并相互复制粘贴
  17. php 目录类,php目录操作类
  18. 好的计算机软件专科学校排名,全国最好的大专院校 10大专科大学排名
  19. 计算ORACLE使用内存方法(on AIX)
  20. 什么是控制反转(Inversion of Control)

热门文章

  1. 抓娃娃机按钮按几下_夹娃娃的技巧攻略 抓娃娃的容易中的招数
  2. c#实现ppt,word,excel,txt,jpg文件转pdf功能
  3. 解密百度等搜索引擎的工作原理 SEO培训SEO优化课程
  4. python二级证书含金量排名_计算机二级证书含金量有多高?这些用处很多人都不知道!...
  5. 胡继晔:中国应建区块链行业准入制度
  6. JavaScript 三元运算符原理 +案例
  7. C# 网通短信网关 SGIP
  8. 如何开直通车,非标品直通车的特征规律,直通车关键词
  9. 在ubuntu体统中,搜狗输入法乱码的解决办法
  10. 解决npm run dev失败的问题