画了个Android

画了个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) 一目了然吧。


 

画了个Android鈥斺擟anvas类的使用

    还有一点非常重要的是,屏幕最上方的状态栏和标题栏总占去来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);

      }

}

 

 

运行效果图:


                         画了个Android鈥斺擟anvas类的使用

 

 

 

      还可以吧:-)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据治理 主数据 元数据_我们对数据治理的误解

数据治理 主数据 元数据Data governance is top of mind for many of my customers, particularly in light of GDPR, CCPA, COVID-19, and any number of other acronyms that speak to the increasing importance of data management when it comes to protecting user data.…

mysql 选择前4个_mysql从4个表中选择

不要认为GROUP BY是必需的 . 虽然如果一个孩子有2个父记录,你可能想用它来将2个父母分组到一行 - 但不确定这是否是你的要求 . 因为如果一个孩子有2个父母,那么将为该孩子返回的父母是未定义的 .假设所有孩子都有父母,所有父母都会有姓&#…

提高机器学习质量的想法_如何提高机器学习的数据质量?

提高机器学习质量的想法The ultimate goal of every data scientist or Machine Learning evangelist is to create a better model with higher predictive accuracy. However, in the pursuit of fine-tuning hyperparameters or improving modeling algorithms, data might …

mysql 集群实践_MySQL Cluster集群探索与实践

MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术。这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性。MySQL集群是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部…

Python基础:搭建开发环境(1)

1.Python语言简介 2.Python环境 Python环境产品存在多个。 2.1 CPython CPython是Python官方提供的。一般情况下提到的Python就是指CPython,CPython是基于C语言编写的。 CPython实现的解释器将源代码编译为字节码(ByteCode),再由虚…

python数据结构之队列(一)

队列概念队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。…

Android实现图片放大缩小

Android实现图片放大缩小 package com.min.Test_Gallery; import Android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.os.Bun…

matlab散点图折线图_什么是散点图以及何时使用

matlab散点图折线图When you were learning algebra back in high school, you might not have realized that one day you would need to create a scatter plot to demonstrate real-world results.当您在高中学习代数时,您可能没有意识到有一天需要创建一个散点图…

java判断题_【Java判断题】请大神们进来看下、这些判断题你都知道多少~

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼、判断改错题(每题2分,共20分)(正确的打√,错误的打并说明原因)1、 Java系统包提供了很多预定义类,我们可以直接引用它们而不必从头开始编写程序。 ( )2、 程序可以用字符‘*’替代一个TextField中的每个字…

PoPo数据可视化第8期

PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容。不想错过可视化领域的精彩内容, 就快快关注我们吧 :) 微信订阅号:popodv_com谷歌决定关闭云可视化服务 Fusion Tables谷歌宣布即将关闭其 Fusion Tables 云服务&#x…

AC自动机题单

AC自动机题目 真的超级感谢xzy 真的帮到我很多 题单 [X] [luogu3808]【模板】AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808[X] [luogu3796]【模板】AC自动机(加强版)https://www.luogu.org/problemnew/show/P37…

java list用法_Java List 用法详解及实例分析

Java List 用法详解及实例分析Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解。List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以…

python字符串和List:索引值以 0 为开始值,-1 为从末尾的开始位置;值和位置的区别哦...

String(字符串)Python中的字符串用单引号 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符。 字符串的截取的语法格式如下: 变量[头下标:尾下标]索引值以 0 为开始值,-1 为从末尾的开始位置。[一个是值&#x…

逻辑回归 python_深入研究Python的逻辑回归

逻辑回归 pythonClassification techniques are an essential part of machine learning and data science applications. Approximately 70% of problems in machine learning are classification problems. There are lots of classification problems that are available, b…

spring定时任务(@Scheduled注解)

(一)在xml里加入task的命名空间 xmlns:task"http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd(二)启用注…

net user 用户名 密码 /add 建立用户

net user 用户名 密码 /add 建立用户 other: net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映…

JavaScript是如何工作的:与WebAssembly比较及其使用场景

*摘要:** WebAssembly未来可期。 原文:JavaScript是如何工作的:与WebAssembly比较及其使用场景作者:前端小智Fundebug经授权转载,版权归原作者所有。 这是专门探索 JavaScript及其所构建的组件的系列文章的第6篇。 如果…

友元 java_C++ 友元关系详解

在C中,在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问,这是很方便做到的。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符…

Matplotlib中的“ plt”和“ ax”到底是什么?

Indeed, as the most popular and fundamental data visualisation library, Matplotlib is kind of confusing in some perspectives. It is usually to see that someone asking about的确,作为最受欢迎的基础数据可视化库,Matplotlib在某些方面令人困…

【数据库的备份与还原】 .

差异备份,日志备份还原 IF DB_ID(db) IS NOT NULL DROP DATABASE db GO CREATE DATABASE db GO CREATE TABLE db.dbo.T(ID INT PRIMARY KEY IDENTITY(1,1)); GO BACKUP DATABASE db TO DISKd:/1.bak WITH FORMAT GO INSERT INTO db.dbo.T DEFAULT VALUES GO BACKUP DATAB…