自定义绘制View

Paint(画笔)

Canvas(画布)

The Canvas class holds the "draw" calls.

To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), anda paint (to describe the colors and styles for the drawing).

  1. rotate(float degrees,float px,float py)//对canvas执行旋转变换
  2. scale(float sx,float sy)//对canvas执行缩放
  3. skew(float sx,float sy)//对canvas执行倾斜变换
  4. translate(float dx,float dy)//移动canvas,向右dx,向下dy
  5. //
  6. setBitmap(Bitmap bitmap)
Path(绘画路径)

预先在View上将N个点连成一条“路径”,然后调用Canvas的drawPath(path,paint)即可沿着路径绘制图形

  1. //Path
  2. moveTo(float x,float y)//Set the beginning of the next contour to the point (x,y).
  3. lineTo(float x,float y)//Add a line from the last point to the specified point (x,y).
  4.  
  5. //canvas
  6. drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)//hOffset水平偏移 vOffset垂直偏移

Android还为路径绘制提供了PathEffect来定义绘制效果,PathEffect包含如下子类:

ComposePathEffect    CornerPathEffect    DashPathEffect    DiscretePathEffect    PathDashPathEffect    SumPathEffect

  1. Paint paint =newPaint();
  2. paint.setPathEffect(PathEffect effect);
  3.  
实例:采用双缓冲实现画图板
  1. publicclassDrawView extends View
  2. {
  3.     // 定义记录前一个拖动事件发生点的坐标
  4.     float preX;
  5.     float preY;
  6.     privatePath path;
  7.     publicPaint paint = null;
  8.     // 定义一个内存中的图片,该图片将作为缓冲区
  9.     Bitmap cacheBitmap = null;
  10.     // 定义cacheBitmap上的Canvas对象
  11.     Canvas cacheCanvas = null;
  12.  
  13.     publicDrawView(Context context,int width ,int height)
  14.     {
  15.         super(context);
  16.         // 创建一个与该View相同大小的缓存区
  17.         cacheBitmap =Bitmap.createBitmap(width, height,
  18.             Bitmap.Config.ARGB_8888);
  19.         cacheCanvas =newCanvas();
  20.         path =newPath();
  21.         // 设置cacheCanvas将会绘制到内存中的cacheBitmap上
  22.         cacheCanvas.setBitmap(cacheBitmap);
  23.  
  24.         // 设置画笔的颜色
  25.         paint =newPaint(Paint.DITHER_FLAG);
  26.         paint.setColor(Color.RED);
  27.         // 设置画笔风格
  28.         paint.setStyle(Paint.Style.STROKE);
  29.         paint.setStrokeWidth(1);
  30.         // 反锯齿
  31.         paint.setAntiAlias(true);
  32.         paint.setDither(true);
  33.     }
  34.  
  35.     @Override
  36.     public boolean onTouchEvent(MotionEvent event)
  37.     {
  38.         // 获取拖动事件的发生位置
  39.         float x = event.getX();
  40.         float y = event.getY();
  41.         switch(event.getAction())
  42.         {
  43.             caseMotionEvent.ACTION_DOWN:
  44.                 // 从前一个点绘制到当前点之后,把当前点定义成下次绘制的前一个点
  45.                 path.moveTo(x, y);
  46.                 preX = x;
  47.                 preY = y;
  48.                 break;
  49.             caseMotionEvent.ACTION_MOVE:
  50.                 // 从前一个点绘制到当前点之后,把当前点定义成下次绘制的前一个点
  51.                 path.quadTo(preX, preY, x, y);
  52.                 preX = x;
  53.                 preY = y;
  54.                 break;
  55.             caseMotionEvent.ACTION_UP:
  56.                 cacheCanvas.drawPath(path, paint);// ①
  57.                 path.reset();
  58.                 break;
  59.         }
  60.         invalidate();
  61.         // 返回true表明处理方法已经处理该事件
  62.         returntrue;
  63.     }
  64.     @Override
  65.     publicvoid onDraw(Canvas canvas)
  66.     {
  67.         Paint bmpPaint =newPaint();
  68.         // 将cacheBitmap绘制到该View组件上
  69.         canvas.drawBitmap(cacheBitmap,0,0, bmpPaint);// ②
  70.         // 沿着path绘制
  71.         canvas.drawPath(path, paint);
  72.     }
  73. }

整理自:《疯狂Android讲义》

来自为知笔记(Wiz)

时间: 2024-07-28 13:29:24

自定义绘制View的相关文章

自定义绘制android EditText的背景,定义EditText文字的显示样式

EditText可以通过layer-list来绘制背景: <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape android:shape="rectangle" //框为矩形 > &l

Android百度地图之自定义绘制功能

我们可以在地图上绘制各种自定义的图形,包括点.折线.圆.多边形等等,尤其绘制点和折线非常实用,点可以用来标识所处的位置,折线可以用来描述走过的轨迹,结合前面GPS定位功能可以做出一些非常有意思的应用,下面应用百度Demo实现绘制的基本功能,代码如下: Activity: package com.home; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.

【转】Android绘制View的过程研究——计算View的大小

Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/1818272572012102321850385/ 2012-11-23 14:24:59|  分类: Android开发 |  标签:android  view  android开发  |举报|字号 订阅 下载LOFTER客户端 一.android绘制view的过程简单描述           简单描述可以解释为:计算大小(measu

Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)

一.概述 Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的.实现圆角图片的方法其实不少,常见的就是利用Xfermode,Shader.本文直接继承ImageView,使用BitmapShader方法来实现圆形.圆角和椭圆的绘制,等大家看我本文的方法后,其他的类似形状也就都能举一反三来来画出来了. 二.效果图: 三.BitmapShader简介 BitmapShader是Shader的子类,可以通过Paint.setShader(Shader

Android中layout.xml文件中加载自定义的View类

<com.bn.summer.GGView3 android:layout_width="100dip" android:layout_height="114dip" android:layout_marginLeft="11dip" /> View类的实现: package com.bn.summer; import android.content.Context; import android.content.res.Resour

Android中自定义视图View之---进阶篇(Canvas的使用)

更多技术内容请移步:我的个人博客 一.前言 今天是周日,昨天刚刚写完了一篇关于如何搭建LNMP环境,让自己可以DIY有个性的个人主页: http://blog.csdn.net/jiangwei0910410003/article/details/50929955 那么今天,我们继续来看一篇关于Android中的UI篇,如何自定义视图View的进阶篇,关于前奏篇之前已经写过了,还没有了解的同学可以去看看:http://blog.csdn.net/jiangwei0910410003/articl

自定义特效VIew第一弹之竖直TextView

自定义特效VIew第一弹之竖直TextView 别的不说,先给出效果 再给出代码 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.empty.VerticalTextView android:layout_width="wrap_content" android:layout_

Android中自定义视图View之---前奏篇

前言 好长时间没写blog了,心里感觉有点空荡荡的,今天有时间就来写一个关于自定义视图的的blog吧.关于这篇blog,网上已经有很多案例了,其实没什么难度的.但是我们在开发的过程中有时候会用到一些自定义的View以达到我们所需要的效果.其实网上的很多案例我们看完之后,发现这部分没什么难度的,我总结了两点: 1.准备纸和笔,计算坐标 2.在onDraw方法中开始画图,invalidate方法刷新,onTouchEvent方法监听触摸事件 对于绘图相关的知识,之前在弄JavaSE相关的知识的时候,

Android中自定义视图View之---开发案例

自定义视图View的案例 下面我们就是开始正式的进入自定义视图View了 在讲解正式内容之前,我们先来看一下基本知识 1.我们在自定义视图View的时候正确的步骤和方法 1).必须定义有Context/Attrbuite参数的构造方法,并且调用父类的方法 public LabelView(Context context, AttributeSet attrs) 不然会报错: 2).重写onMeasure方法 @Override protected void onMeasure(int width