Canvas translate,scale,rotate
下面使用三个小例子作为讲解:
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相关推荐
- Canvas之translate,scale,rotate,skew
Canvas之translate,scale,rotate,skew Canvas大致可以分为三类: save,restore等与层相关的保存和回滚相关方法 scale,rotate,clipXXX等 ...
- HTML5 Canvas translate与rotate应用
Translate:坐标转化 默认Canvas的起启坐标0,0是在右上角,如果让中起启坐标放在中心点就可以这样做 context.translate(centerX,centerY); Rotate: ...
- 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法...
前言:这几天做客户回访,感触很大,用户只要是留反馈信息,总是一种恨铁不成钢的心态,想用你的app,却是因为你的技术问题,让他们不得不放弃,而你一个回访电话却让他们尽释前嫌,当最后把手机号留给他们以便随 ...
- html矩形坐标理解,HTML canvas中translate()与rotate()的理解
首先,当我们在页面上初始化canvas时,相当于在上面放了一块画布,这块画布我们可以理解为上面有一个坐标系(如下图),左上角是原点,往右是X轴的正方向,往下是Y轴的正方向,我们在画布上绘制的内容都是基 ...
- 自定义控件三部曲之动画篇(一)——alpha、scale、translate、rotate、set的xml属性及用法
相关文章: <Android自定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 一.概述 An ...
- android scaleanimation 动画方向,Animation 动画详解(一)——alpha、scale、translate、rotate、set的xml属性及用法...
一.概述 Android的animation由四种类型组成:alpha.scale.translate.rotate,对应android官方文档地址:<Animation Resources&g ...
- Android canvas.translate
为什么80%的码农都做不了架构师?>>> translate作用就是移动原点,默认的原点(0,0)是在屏幕左上角的,你可以通过translate(x,y)把点(x,y)作为原点 ...
- canvas.translate(x,y)
2019独角兽企业重金招聘Python工程师标准>>> 之前对于canvas.translate(x,y)的理解有的错误,之前一直以原点(0,0)为基准点,作用就是移动原点,默认的原 ...
- translate与rotate
今天在做旋转动画时,发现translate与rotate的顺序会对效果产生影响, 在此之前我以为顺序可以随便放的 理想情况是绕球体旋转,效果如下图 但是由于顺序写错了,效果实现如下: 看下代码有哪些地 ...
最新文章
- spark大数据基础概念
- socket io 不使用redis_Redis这么快,线程模型竟然是单线程
- matlab 里try用法,matlab在整个程序(全局)中使用try-catch来报告错误
- 牛客网算法工程师能力评估
- 定时器应用-页面弹出广告
- node静态服务器tudo
- pandas按行、按列合并数据
- 从庆祝动作解读科比和詹姆斯
- 15天深度复习JavaWeb的详细笔记(七)——Request、Response
- 2023年全国最新二级建造师精选真题及答案2
- 账号密码登录和注册业务逻辑
- 前端实现下拉显示更多功能
- 如何构建一个简单的图书推荐系统
- Android官方文档之DataBinding库
- 电脑基础知识-电脑不认新硬盘时该怎么办?
- 【微课制作软件】Focusky教程 | 支持同时打开多个文档并相互复制粘贴
- php 目录类,php目录操作类
- 好的计算机软件专科学校排名,全国最好的大专院校 10大专科大学排名
- 计算ORACLE使用内存方法(on AIX)
- 什么是控制反转(Inversion of Control)
热门文章
- 抓娃娃机按钮按几下_夹娃娃的技巧攻略 抓娃娃的容易中的招数
- c#实现ppt,word,excel,txt,jpg文件转pdf功能
- 解密百度等搜索引擎的工作原理 SEO培训SEO优化课程
- python二级证书含金量排名_计算机二级证书含金量有多高?这些用处很多人都不知道!...
- 胡继晔:中国应建区块链行业准入制度
- JavaScript 三元运算符原理 +案例
- C# 网通短信网关 SGIP
- 如何开直通车,非标品直通车的特征规律,直通车关键词
- 在ubuntu体统中,搜狗输入法乱码的解决办法
- 解决npm run dev失败的问题