canvas教程

Android绘图机制和处理技巧

字号+ 作者:H5之家 来源:H5之家 2017-05-03 17:05 我要评论( )

前言 Android群英传读书笔记 目录 Android绘图机制与处理技巧.png Android屏幕相关知识 了解一些基础名词和参数信息 屏幕尺寸信息屏幕参数系统屏幕密度 密度密度值分辨率 ldpi120240×320 mdpi160320×480 hdpi240480×800 xhdpi320720×1280 xxhdpi4801080

前言

  • Android群英传读书笔记
  • 目录


    Android绘图机制与处理技巧.png

    Android屏幕相关知识
  • 了解一些基础名词和参数信息
  • 屏幕尺寸信息 屏幕参数 系统屏幕密度

    密度 密度值 分辨率

    ldpi 120 240×320

    mdpi 160 320×480

    hdpi 240 480×800

    xhdpi 320 720×1280

    xxhdpi 480 1080×1920

    独立像素密度dp

    Android系统使用mdpi即密度值为160的屏幕作为标准,在这个屏幕上1px = 1dp,其他屏幕可以进行比例换算,例如同样是100dp的长度,在mdpi中为100px,而hdpi中为150px。也就是说在mdpi中1dp = 1px,而hdpi中1dp = 1.5px,在xdpi中1dp = 2px,在xxhpi中1dp = 3px

    各分辨率换算比率
    ldpi :mdpi :hdpi :xhdpi :xxhdpi = 3:4:6:8:12

    单位换算 public class DisplayUtils { /** * 获得屏幕宽度(像素) * * @param activity * @return */ public static int getDisplayWidth(Activity activity) { DisplayMetrics metric = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(metric); int width = metric.widthPixels; // 屏幕宽度(像素) return width; } /** * 获得屏幕高度(像素) * * @param activity * @return */ public static int getDisplayHeight(Activity activity) { DisplayMetrics metric = new DisplayMetrics(); activity.getWindowManager().getDefaultDisplay().getMetrics(metric); int height = metric.heightPixels; // 屏幕高度(像素) return height; } /** * 将px值转换为dip或dp值,保证尺寸大小不变 * * @param context 通过上下文获得显示参数中的屏幕密度 * @param pxValue 需要转换的px值 * @return */ public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } /** * 将dip或dp值转换为px值,保证尺寸大小不变 * * @param context 通过上下文获得显示参数中的屏幕密度 * @param dipValue 需要转换的dp值 * @return */ public static int dip2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } /** * 将px值转换为sp值,保证文字大小不变 * * @param context 通过上下文获得显示参数中的屏幕密度 * @param pxValue 需要转换的px值 * @return */ public static int px2sp(Context context, float pxValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (pxValue / fontScale + 0.5f); } /** * 将sp值转换为px值,保证文字大小不变 * * @param context 通过上下文获得显示参数中的屏幕密度 * @param spValue 需要转换的sp值 * @return */ public static int sp2px(Context context, float spValue) { final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; return (int) (spValue * fontScale + 0.5f); } } Android绘图技巧 2D绘图技巧
  • 系统通过Canvas画布对象来提供绘图方法,它提供了各种绘图API
  • API 绘制(6)

    drawPoint() 点

    drawLine() 线

    drawsLine() 多条线

    drawRect() 矩形

    drawRoundRect() 圆角矩形

    drawVertices() 多边形

    drawArc() 弧、扇

    drawCircle() 圆

    drawOval() 椭圆

    drawText() 绘制文本

    drawPosText() 在指定位置绘制文本

    drawPath() 绘制路径

    drawBitmap() 绘制Bitmap(加载)

    API 设置属性

    setAntiAlias() 设置画笔锯齿效果

    setColor() 设置画笔颜色

    setARGB() 设置画笔A,R,G,B值

    setAlpha() 设置画笔Alpha值

    setTextSize() 设置字体尺寸

    setStyle() 设置画笔风格(空心或实心)

    setStrokeWidth() 设置空心边框的宽度

    reset() 重置

    绘制的实例

  • 需要注意其中画弧和扇形,本质是画一个矩形,以矩形的中心为弧或扇的中心点,以矩形的中心为角度的坐标原点绘制
  • Android XML绘图 Bitmap
  • 将图片直接转换为Bitmap<?xml version="1.0" encoding="utf-8"?> <bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@mipmap/ic_launcher"/> Shape
  • 绘制各种形状,省去了canvas和paint的步骤<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape=["rectangle" | "oval" | "line" | "ring"] > <corners //当shape为rectangle时使用 android:radius="integer" //半径值会被后面的单个半径属性覆盖,默认为1dp android:topLeftRadius="integer" android:topRightRadius="integer" android:bottomLeftRadius="integer" android:bottomRightRadius="integer" /> <gradient //渐变 android:angle="integer" android:centerX="integer" android:centerY="integer" android:centerColor="integer" android:endColor="color" android:gradientRadius="integer" android:startColor="color" android:type=["linear" | "radial" | "sweep"] android:useLevel=["true" | "false"] /> <padding //内边距 android:left="integer" android:top="integer" android:right="integer" android:bottom="integer" /> <size //指定大小,一般用在imageview配合scaleType属性使用 android:width="integer" android:height="integer" /> <solid //填充颜色 android:color="color" /> <stroke //边框 android:width="integer" android:color="color" android:dashWidth="integer" android:dashGap="integer" /> </shape>
  • Layer 层 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/ic_launcher" /> <item android:drawable="@drawable/ic_launcher" android:left="10.0dp" android:top="10.0dp" android:right="10.0dp" android:bottom="10.0dp"/> ...... </layer-list> Selector 选择器
  • Fragment配合RadioGroup实现点击切换内容时RadioGroup的子项就是用选择器作为View的触摸反馈,不过我更喜欢FragmentTabHost做为下方选项卡(跑题了。。。)
  • <?xml version="1.0" encoding="utf-8" ?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 默认时的背景图片--> <item android:drawable="@drawable/X1"/> <!-- 没有焦点时的背景图片 --> <item android:drawable="@drawable/X2" android:state_window_focused="false"/> <!-- 非触摸模式下获得焦点并单击时的背景图片 --> <item android:drawable="@drawable/X3" android:state_focused="true" android:state_pressed="true"/> <!-- 触摸模式下单击时的背景图片--> <item android:drawable="@drawable/X4" android:state_focused="false" android:state_pressed="true"/> <!--选中时的图片背景--> <item android:drawable="@drawable/X5" android:state_selected="true"/> <!--获得焦点时的图片背景--> <item android:drawable="@drawable/X6" android:state_focused="true"/> </selector> Android绘图技巧
  • 简化,优化绘图操作Canvas
  • API 作用

    Canvas.save() 保存画布(类似PS中的图层保存)

    Canvas.restore() 合并画布(类似PS中的合并图层)

    Canvas.translate() 画布所在坐标系平移

    Canvas.rotate() 画布所在坐标系旋转

    Layer 层
  • 类似于PS中图层的概念
  • 基于栈的结构进行管理的
  • API 作用

    saveLayer() 将图层入栈

    saveLayerAlpha() 将图层入栈

    restore() 将图层出栈

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • Canvas与ValueAnimator

      Canvas与ValueAnimator

      2017-04-28 18:00

    • Android Bitmap和Canvas学习笔记(转)

      Android Bitmap和Canvas学习笔记(转)

      2017-04-28 17:00

    • HTML5 Canvas 绘图实例教程

      HTML5 Canvas 绘图实例教程

      2017-04-28 13:09

    • 21天学习android开发教程之SurfaceView与多线程的混搭

      21天学习android开发教程之SurfaceView与多线程的混搭

      2017-04-27 12:00

    网友点评
    /