画了个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.…

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

提高机器学习质量的想法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集群是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部…

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.当您在高中学习代数时,您可能没有意识到有一天需要创建一个散点图…

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(二)启用注…

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

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

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在某些方面令人困…

2018年阿里云NoSQL数据库大事盘点

2019独角兽企业重金招聘Python工程师标准>>> NoSQL一词最早出现在1998年。2009年Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL概念,这时的NoSQL主要是指非关系型、分布式、不提供…

cayenne:用于随机模拟的Python包

TL;DR; We just released v1.0 of cayenne, our Python package for stochastic simulations! Read on to find out if you should model your system as a stochastic process, and why you should try out cayenne.TL; DR; 我们刚刚发布了 cayenne v1.0 ,这是我们…

java 如何将word 转换为ftl_使用 freemarker导出word文档

近日需要将人员的基本信息导出,存储为word文档,查阅了很多资料,最后选择了使用freemarker,网上一共有四种方式,效果都一样,选择它呢是因为使用简单,再次记录一下,一个简单的demo,仅供…

DotNetBar office2007效果

1.DataGridView 格式化显示cell里的数据日期等。 进入编辑列,选择要设置的列,DefaultCellStyle里->行为->formart设置 2.tabstrip和mdi窗口的结合使用给MDI窗口加上TabPage。拖动个tabstrip到MDI窗口上tabstrip里选择到主窗口名就加上TABPAGE了。d…

spotify 数据分析_没有数据? 没问题! 如何从Wikipedia和Spotify收集重金属数据

spotify 数据分析For many data science students, collecting data is seen as a solved problem. It’s just there in Kaggle or UCI. However, that’s not how data is available daily for working Data Scientists. Also, many of the datasets used for learning have …

IS环境下配置PHP5+MySql+PHPMyAdmin

IIS环境下配置PHP5MySqlPHPMyAdmin Posted on 2009-08-07 15:18 谢启祥 阅读(1385)评论(18) 编辑 收藏 虽然主要是做.net开发的,但是,时不时的还要搞一下php,但是,php在windows下的配置,总是走很多弯路,正好…

kaggle数据集_Kaggle上有170万份ArXiv文章的数据集

kaggle数据集“arXiv is a free distribution service and an open-access archive for 1.7 million scholarly articles in the fields of physics, mathematics, computer science, quantitative biology, quantitative finance, statistics, electrical engineering and sys…

深度学习数据集中数据差异大_使用差异隐私来利用大数据并保留隐私

深度学习数据集中数据差异大The modern world runs on “big data,” the massive data sets used by governments, firms, and academic researchers to conduct analyses, unearth patterns, and drive decision-making. When it comes to data analysis, bigger can be bett…

C#图片处理基本应用(裁剪,缩放,清晰度,水印)

前言 需求源自项目中的一些应用,比如相册功能,通常用户上传相片后我们都会针对该相片再生成一张缩略图,用于其它页面上的列表显示。随便看一下,大部分网站基本都是将原图等比缩放来生成缩略图。但完美主义者会发现一些问题&#…

Java客户端访问HBase集群解决方案(优化)

测试环境&#xff1a;IdeaWindows10 准备工作&#xff1a; <1>、打开本地 C:\Windows\System32\drivers\etc&#xff08;系统默认&#xff09;下名为hosts的系统文件&#xff0c;如果提示当前用户没有权限打开文件&#xff1b;第一种方法是将hosts文件拖到桌面进行配置后…

WPF布局系统

WPF之路——WPF布局系统 前言 前段时间忙了一阵子Google Earth&#xff0c;这周又忙了一阵子架构师论文开题报告&#xff0c;现在终于有时间继续<WPF之路>了。先回忆一下上篇的内容&#xff0c;在《从HelloWorld到WPF World》中&#xff0c;我们对WPF有了个大概的了解&am…