自定义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  PaintmPaint= 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  Paintpaint=  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  Paintpaint=  null;

     private  Paintpaint_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  GameViewmGameView=  null;

@Override

    public  void  onCreate(Bundle  savedInstanceState) {

      super.onCreate(savedInstanceState);

      this.mGameView= newGameView(this);

setContentView(mGameView);

}

}

运行效果图:

还可以吧?:-)

时间: 2024-08-03 04:10:09

自定义android 机器人的相关文章

自定义 Android Preference——SpinnerPreference的私人定制

因客户需求SpinnerPreference,网上各种搜索不到,无奈只能重写组件,现将过程分享大家. 自定义SpinnerPreference 一:首先从扩展preference开始:类文件必须继承自Preference并实现构造函数,如下 public MySpinnerPreference(Context context) { super(context); } public MySpinnerPreference(Context context, AttributeSet attrs) {

自定义Android组件之组合方式创建密码框组件

Android中所有控件(也称组件)都继承自adnroid.view.View类,android.view.ViewGroup是View类的重要子类,绝大多书的布局类就继承自ViewGroup类. 附上一张基于Android Api21的View和Widget类图 自定义Android组件基本可以从2个入口着手,一是继承Viewe类拿起画笔和画布绘制组件,而是通过继承View的子类和组合已有的组件的方式构造自定义的组件. 本文通过自定义一个PassWordView组件来实现密码能够通过点击点选框

自定义Android Dialog

private void showDialog() { mDialog = new Dialog(this); mDialog.setCanceledOnTouchOutside(true); Window dialogWindow = mDialog.getWindow(); dialogWindow.setBackgroundDrawable(new ColorDrawable(0)); dialogWindow.setContentView(R.layout.set_public_clie

自定义android 4.0以上的对话框风格

做个笔记.在styles.xml的写法: <style name="DialogWindowTitle"> <item name="android:textSize">22sp</item> <item name="android:textColor">@color/font_green</item> </style> <style name="DialogW

自定义Android拨号盘

该源码属于Demo级别,主要包含以下功能: 自定义Android拨号盘: 支持联系人过滤: 拼音-汉字转化. 下载地址:http://www.devstore.cn/code/info/648.html 运行截图:  

Android -- 自定义View小Demo,关于Rect绘制Android机器人(一)

1,关于Rect和RectF类的区别以前一直没有去关注它,刚刚了解了一下才知道都是用来确定矩形的区域,不过Rect是int类型的坐标而RectF是float类型的坐标,所以说RectF要更加精确.现在是要使用paint画出一个机器人的图片,如下图机器人的图片: 2,  看一下我们做出来的效果 再看看代码,基本上都是使用的RectF这个类来操作 package com.wangjitao.myview.view; import android.content.Context; import and

Android 自定义Android带图片和文字的ImageButton

经过分析,上述按钮效果实际上就是一个布局,一个最简单不过的垂直线性布局,上部分是一个ImageView,下部分是一个TextView,这个布局可点击.可设置监听. 我们首先要编写自己的ImageButton类,然后在主布局文件中为我们自定义的Button编写布局,最后在Activity中调用我们自定义ImageButton即可. 首先,我们编写一个MyImageButton类,继承自LinearLayout package com.billhoo.study; import android.co

自定义Android标题栏TitleBar布局

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.main); //软件activity的布局 getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar为自己标题栏的布局 Layout下建立titlebar.xml: <?xml version="1.0" encodi

自定义Android进度条ProgressBar样式

进度条在Android应用中随处或见,都是为用户提供一个提示,用来增加用户的体验度!进度条样式多种多样,有圆形的,有条形的,有垂直方向的,也有水平方向的.Android系统也是我们提供了好几种默认的样式,今天我们来讲讲自定义样式的ProgressBar. 下面用个很小(又是很小)的例子: -------------------------xml布局-------------------------------------------- <ProgressBar android:id="@+