安卓 canvas

【转】http://blog.sina.com.cn/s/blog_61ef49250100qw9x.html(easy)

【转】http://blog.csdn.net/rhljiayou/article/details/7212620

画了个Android

今晚瞎折腾,闲着没事画了个机器人——android,浪费了一个晚上的时间。画这丫还真不容易,为那些坐标,差点砸了键盘,好在最后画出个有模有样的,心稍安。

下面来看看画这么个机器人需要些什么东西:主要是Canvas类(android.graphics.Canvas)。Canvas类就是表示一块画布,你可以在上面画你想画的东西。当然,你还可以设置画布的属性,如画布的颜色/尺寸等。Canvas提供了如下一些方法:

Canvas():创建一个空的画布,可以使用setBitmap()方法来设置绘制的具体画布;

Canvas(Bitmap bitmap):以bitmap对象创建一个画布,则将内容都绘制在bitmap上,bitmap不得为null;

Canvas(GL gl):在绘制3D效果时使用,与OpenGL有关;

drawColor:设置画布的背景色;

setBitmap:设置具体的画布;

clipRect:设置显示区域,即设置裁剪区;

isOpaque:检测是否支持透明;

rotate:旋转画布;

下面我们就用Canvas来画一个机器人——android,oh my love!一看就知道,机器人的外形是由矩形/圆/圆弧/线条组成的,因此要知道怎么用Canvas画矩形/圆/圆弧和线条。可惜阿,上面几个方法基本都没用上。

canvas.drawRect(RectF,Paint)方法用于画矩形,第一个参数为图形显示区域,第二个参数为画笔,设置好图形显示区域Rect和画笔Paint后,即可画图;

canvas.drawRoundRect(RectF, float, float, Paint) 方法用于画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。

canvas.drawLine(startX, startY, stopX, stopY, paint):前四个参数的类型均为float,最后一个参数类型为Paint。表示用画笔paint从点(startX,startY)到点(stopX,stopY)画一条直线;

canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint):第一个参数oval为RectF类型,即圆弧显示区域,startAngle和sweepAngle均为float类型,分别表示圆弧起始角度和圆弧度数,3点钟方向为0度,useCenter设置是否显示圆心,boolean类型,paint为画笔;

canvas.drawCircle(float,float, float, Paint)方法用于画圆,前两个参数代表圆心坐标,第三个参数为圆半径,第四个参数是画笔;

清楚这些函数的用法之后,我们是否就噼里啪啦地敲代码了呢?别急,我们来搞个设计。既然这些函数都是用来画图的,也就是说它们有共性——画。所有我们应该设计一个接口interface,对于这次任务,只需要一个成员方法就足够了。对于每一个图形,是只用一个方法画,还是将画图封装成类呢?我建议是封装成类。因为说不定你明天就会嫌弃它不会动,想它动起来,或者你过两天又希望在机器人的每个部位加点什么。所以我将每一个图形封装成类,都实现一个名叫drawGraphics的接口。最后,要记得给UI创建一个线程哦。

就这样我开始动手做了,但是很快就发现问题了。什么问题?在定位的时候,也就是设置每个图形的显示区域时,我自以为这里的Rect跟Java的Rectangle是一样的,但我错了。原来这厮跟MFC中的RECT结构才是一家人,害我折腾了许久。

Rect(int left,int top,int right,int bottom)

left

矩形左上角X坐标值

top

矩形左上角Y坐标值

right

矩形右下角X坐标值

bottom

矩形右下角Y坐标值

下面借用一张图说明(忘了哪个博客找来的(*^__^*) 嘻嘻……),如Rect(150, 75, 260, 120) 一目了然吧。

还有一点非常重要的是,屏幕最上方的状态栏和标题栏总占去来50的高度,同时坐标原点下移到标题栏下方,即如果你的手机屏幕分辨率为(320X480),编程时如果没有设置去除状态栏和标题栏,你只能操控的范围只有(320X430),而且坐标原点下移。记住咯。

//drawGraphics.java

package  com.scgm.android.drawable;

import android.graphics.Canvas;

public interface  drawGraphics {

public void  draw(Canvas canvas);

}

package  com.scgm.android.drawable;

import android.content.Context;

import  android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.view.View;

public classGameView  extends View  implements  Runnable{

//声明Paint对象

       private  Paint mPaint= null;

       privatedrawGraphics drawGraphics= null;

       public GameView(Context context) {

            super(context);

// TODOAuto-generated constructor stub

//构建对象

mPaint= new Paint();

//开启线程

           new  Thread(this).start();

}

       public void  onDraw(Canvas canvas) {

           super.onDraw(canvas);

//设置画布为黑色背景

//canvas.drawColor(Color.BLACK);

//消除锯齿

mPaint.setAntiAlias(true);

//设置图形为空心

mPaint.setStyle(Paint.Style.STROKE);

//绘制空心几何图形

drawGraphics=  new  DrawCircle();

drawGraphics.draw(canvas);

drawGraphics=  new  DrawLine();

drawGraphics.draw(canvas);

drawGraphics= newDrawRect();

drawGraphics.draw(canvas);

}

@Override

          public void run() {

// TODOAuto-generated method stub

               while(!Thread.currentThread().isInterrupted()) {

                    try{

Thread.sleep(1000);

catch(InterruptedException e) {

// TODO: handle exception

Thread.currentThread().interrupt();

}

//使用postInvalidate 可以直接在线程中更新界面

postInvalidate();

}

}

}

//DrawRect.java

package com.scgm.android.drawable;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.RectF;

public class DrawRect  implements  drawGraphics{

       private  Paint paint=  null;

       public DrawRect(){

paint= new  Paint();

}

@Override

         public void  draw(Canvas canvas) {

// TODOAuto-generated method stub

//定义圆角矩形对象

RectF rectF1 = newRectF(120,170,370,500);

RectF rectF2 = newRectF(40,150,90,400);

RectF rectF3 = newRectF(390,150,440,400);

RectF rectF4 = newRectF(140,520,200,650);

RectF rectF5 = newRectF(290,520,350,650);

paint.setAntiAlias(true);

//设置画笔颜色为BLUE

paint.setColor(Color.GREEN);

//在画布上绘制圆角矩形/圆弧/直线

canvas.drawRoundRect(rectF1, 20, 20, paint);

canvas.drawRoundRect(rectF2, 20, 20, paint);

canvas.drawRoundRect(rectF3, 20, 20, paint);

canvas.drawRoundRect(rectF4, 20, 20, paint);

canvas.drawRoundRect(rectF5, 20, 20, paint);

}

}

//DrawLine.java

package  com.scgm.android.drawable;

import android.graphics.Canvas;

import  android.graphics.Color;

import android.graphics.Paint;

public class DrawLine  implements  drawGraphics{

       private Paint paint=  null;

       public  DrawLine(){

paint=  new  Paint();

}

@Override

        publicvoiddraw(Canvas canvas) {

// TODOAuto-generated method stub

paint.setAntiAlias(true);

//绘制直线

paint.setColor(Color.GREEN);

//设置线条粗细

paint.setStrokeWidth(12);

canvas.drawLine(120,40,170,90, paint);

canvas.drawLine(320,90,370,40, paint);

}

}

//DrawCircle.java

package com.scgm.android.drawable;

import android.graphics.Canvas;

import  android.graphics.Color;

import  android.graphics.Paint;

import android.graphics.RectF;

public class DrawCircle  implements  drawGraphics{

        private  Paint paint=  null;

        private  Paint paint_eye=  null;

        public  DrawCircle(){

paint= new  Paint();

paint_eye= new  Paint();

}

@Override

        public  void draw(Canvas canvas) {

// TODOAuto-generated method stub

//绘制圆形(圆心x,圆心y,半径r,画笔p)

paint_eye.setAntiAlias(true);

paint.setAntiAlias(true);

RectF rectF = newRectF(120,60,370,240);

paint_eye.setColor(Color.WHITE);

paint.setColor(Color.GREEN);

canvas.drawCircle(190, 110, 18, paint_eye);

canvas.drawCircle(300, 110, 18, paint_eye);

canvas.drawArc(rectF, 180, 180,true, paint);

}

}

//GameStart.java

package  com.scgm.android.drawable;

import  android.app.Activity;

import android.os.Bundle;

public class GameStart  extends  Activity {

      private  GameView mGameView=  null;

@Override

      public  void  onCreate(Bundle  savedInstanceState) {

          super.onCreate(savedInstanceState);

          this.mGameView= newGameView(this);

setContentView(mGameView);

}

}

运行效果图:

还可以吧?:-)

时间: 2024-10-22 15:16:27

安卓 canvas的相关文章

Android自定义View【实战教程】5??---Canvas详解及代码绘制安卓机器人

友情链接: Canvas API Android自定义View[实战教程]3??--Paint类.Path类以及PathEffect类详解 神马是Canvas 基本概念 Canvas:可以理解为是一个为我们提供了各种工具的画布,我们可以在上面尽情的绘制(旋转,平移,缩放等等).可以理解为系统分配给我们一个一个内存空间,然后提供了一些对这个内存空间操作的方法(API), 实际存储是在下面的bitmap. 两种画布 这里canvas可以绘制两种类型的画图,分别是view和surfaceView. V

安卓自己定义View进阶-Canvas之绘制基本形状

Canvas之绘制基本形状 作者微博: @GcsSloop [本系列相关文章] 在上一篇自己定义View分类与流程中我们了解自己定义View相关的基本知识,只是,这些东西依然还是理论,并不能拿来(zhuang)用(B), 这一次我们就了解一些能(zhaung)用(B)的东西. 在本篇文章中,我们先了解Canvas的基本用法,最后用一个小演示样例来结束本次教程. 一.Canvas简单介绍 Canvas我们能够称之为画布,能够在上面绘制各种东西,是安卓平台2D图形绘制的基础,非常强大. **一般来说

解决小程序中 cover-view无法盖住canvas的问题,仅安卓出现这个问题

原因在于系统页面渲染的差异,在安卓中页面dom的渲染并不是完成按照上下顺序来的, 有可能出现写在后面的dom被先渲染出来,因此会随机出现能盖住.不能盖住的情况,很诡异是不是? 开发者工具中并非真机,只是模拟显示,调整时显示正常不代表真机中正常 解决方式很简单: 将cover-view的渲染延迟一些,例如设定500ms后显示 此问题在页面调用echarts时出现,而echarts用的是canvas实现,希望对你有帮助! 原文地址:https://www.cnblogs.com/magicc/p/1

安卓使用Canvas绘制工作日程表

有一个项目要使用工作表,选择使用canvas来绘制,实现显示工作日程的选择,可点击添加和取消. 自定义控件FormView: package com.sun.elderly.comm.widget; import com.sun.elderly.comm.ui.interfaces.IFormListener; import android.annotation.SuppressLint; import android.content.Context; import android.graphi

安卓用canvas画曲线图

1.新建一个常变量类Constant.java package com.rain.db; import android.graphics.Point; public class Constant { public static Point point;//获取屏幕的大小 } 2.新建一个函数ChartView.java 1 package com.rain.kongjian; 2 3 import com.rain.db.Constant; 4 5 import android.content.

安卓开发应该知道的Drawable、Bitmap、Canvas和Paint的关系

首先让我们理解下Android平台中的显示类是View,但是还提供了底层图形类android.graphics,今天所说的这些均为graphics底层图形接口. Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好. Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF.PNG.JPG,当然也支持BMP,当

安卓笔记:Canvas绘图

1.Canvas常用方法: drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域 drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象 drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)  //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(这里是bitmap),参数三是目标区域(应该在canvas的位置和大

用画布canvas画安卓logo

1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compat

Android中使用Canvas和Paint绘制一个安卓机器人

场景 在Android中画笔使用Paint类,画布使用Canvas类来表示. 绘图的基本步骤 首先编写一个继承自View的自定义View类,然后重写其onDraw方法,最后把自定义的view添加到actvity中. 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 首先在要显示的Activity的布局文件中修改为FrameLayout并添加一个id. <?xml vers