文档章节

android开发笔记之多媒体—Canvas的相关方法

Mr_Nice
 Mr_Nice
发布于 2016/05/22 20:01
字数 773
阅读 1
收藏 0

——Canvas相关方法

   ——画线:canvas.drawLine(20, 20, 200, 200, paint)

   ——画矩形:canvas.drawRect(20, 20, 200, 200, paint)

   ——画圆:canvas.drawCircle(250, 250, 250, paint);

   ——画扇形:canvas.drawArc(rectF, 0, 90, true, paint)

   ——画三角形:Path path = new Path();
               path.moveTo(250, 0);
            path.lineTo(150, 300);
               path.arcTo(new RectF(150, 200, 350, 400), 0, 180);
                path.lineTo(350, 300);
            path.lineTo(250, 0);
               path.close();
               canvas.drawPath(path, paint);

效果图:

这里写图片描述

核心代码:

public class MainActivity extends Activity {

    private ImageView iv;
    private Bitmap bitmap;//画纸
    private Canvas canvas;//画布
    private Paint paint;//画笔
    private float radius = 60;
    private final static float DEGREE = 36; //五角星角度 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.iv);
    }
    //画一条线
    public void drawLine(View view){
        init();
        //第一二参数表示直线的起始点坐标
        //第三四参数表示直线的终点坐标
        canvas.drawLine(20, 20, 200, 200, paint);
        iv.setImageBitmap(bitmap);
    }
    //画一个矩形
    public void drawRect(View view) {
        init();
        //第一个参数表示矩形左边距离画布左边的距离
        //第二个参数表示矩形上边距离画布上边的距离
        //第三个参数表示矩形右边距离画布左边的距离
        //第四个参数表示矩形下边距离画布上边的距离
        canvas.drawRect(20, 20, 300, 200, paint);
        iv.setImageBitmap(bitmap);
    }
    //画一个圆
    public void drawCircle(View view) {
        init();
        //第一二参数表示圆心的坐标
        //第三个参数表示圆的半径
        canvas.drawCircle(250, 250, 250, paint);
        iv.setImageBitmap(bitmap);
    }
    //画一个扇形
    public void drawArc(View view) {
        init();
        RectF rectF = new RectF(20, 20, 500, 500);
        //第一个参数表示矩形
        //第二个参数为起始角度
        //第三参数表示扫过的角度
        //第四个参数表示扇形是否含有矩形的中线
        canvas.drawArc(rectF, -90, 180, true, paint);
        iv.setImageBitmap(bitmap);
    }
    //画一个多边形
    public void drawPath(View view) {
        init();
        Path path = new Path();
        //先移动到三角形的第一个点
        path.moveTo(250, 10);
        //再连线到第二个点
        path.lineTo(100, 300);
        //在第二、三个点之间画了一个扇形(以二三点之间连线为轴)
        RectF rectF = new RectF(100, 250, 400, 350);
        path.arcTo(rectF, 0, 180);
        //连线到第三个点
        path.lineTo(400, 300);
        //最后连线回第一个点
        path.lineTo(250, 10);

        canvas.drawPath(path, paint);
        iv.setImageBitmap(bitmap);
    }
    //画一个五角星
    public void drawStar(View view) {
        init();
        paint.setAntiAlias(true);
        Path path = new Path(); 
        float radian = degree2Radian(DEGREE);
        float radius_in = (float) (radius * Math.sin(radian / 2) / Math.cos(radian)); //中间五边形的半径

        path.moveTo((float) (radius * Math.cos(radian / 2)), 0);
        path.lineTo((float) (radius * Math.cos(radian / 2) + radius_in * Math.sin(radian)), (float) (radius - radius * Math.sin(radian / 2)));
        path.lineTo((float) (radius * Math.cos(radian / 2) * 2), (float) (radius - radius * Math.sin(radian / 2)));
        path.lineTo((float) (radius * Math.cos(radian / 2) + radius_in * Math.cos( radian /2)),(float) (radius + radius_in * Math.sin( radian /2)));
        path.lineTo((float) (radius * Math.cos(radian / 2) + radius * Math.sin(radian)), (float) (radius + radius * Math.cos(radian)));
        path.lineTo((float) (radius * Math.cos(radian / 2)), (float) (radius + radius_in));
        path.lineTo((float) (radius * Math.cos(radian / 2) - radius * Math.sin(radian)), (float) (radius + radius * Math.cos(radian)));
        path.lineTo((float) (radius * Math.cos(radian / 2) - radius_in * Math.cos( radian /2)), (float) (radius + radius_in * Math.sin(radian / 2)));
        path.lineTo(0, (float) (radius - radius * Math.sin(radian /2)));
        path.lineTo((float) (radius * Math.cos(radian / 2) - radius_in * Math.sin(radian)) , (float) (radius - radius * Math.sin(radian /2)));

        path.close();
        canvas.drawPath(path, paint); 
        iv.setImageBitmap(bitmap);
    }
    //初始化画布和画布的一些设置
    private void init() {
        bitmap = bitmap.createBitmap(500, 500, Config.ARGB_8888);
        canvas = new Canvas(bitmap);
        //设置画板的颜色
        canvas.drawColor(Color.BLACK);
        paint = new Paint();
// paint.setStyle(Style.STROKE); //设置画笔风格为空心
        paint.setColor(Color.RED); //设置画笔的颜色
        paint.setStrokeWidth(5);    //设置画笔的粗细
        paint.setAntiAlias(true);   //抗锯齿
    }
    /** * 角度转弧度 * @param degree * @return */
    private float degree2Radian(float degree){
        return (float) (Math.PI * degree / 180);
    }
}

© 著作权归作者所有

共有 人打赏支持
Mr_Nice
粉丝 0
博文 47
码字总数 39947
作品 0
广州
Android学习笔记09:Paint及Canvas的简单应用

Android学习笔记09:Paint及Canvas的简单应用   在Android中需要通过graphics类来显示2D图形。   graphics中包括了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)等常用...

Carl_
2015/01/07
0
0
10个关于Android开发的实用教程

注:本文转载自iteye 本文为致力于Android应用的开发人员精选了几个不错的实用教程,无论是初学者还是专业开发人员都应该能够从中获益。这些教程中有不少是关于绘图和地址服务运用的,另外一...

随影求是
2012/03/15
0
0
【Android游戏开发之二】剖析游戏开发用view还是surfaceView ?!

李华明Himi 原创,转载务必在明显处注明: 转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/295.html 很多童鞋说我的代码运行后,点击home或者back后会程序异常,...

迷途d书童
2012/03/19
0
0
android自学笔记《四》——应用程序结构分析

昨天在帖子里看到的一个分析方法,很简单,给大家分享下! 呵呵,由于我也是刚开始学习Android,还没有学到下面这些知识,这里就直接截图了。 看完他这个分析之后,我对Android程序有了一个简...

郭子
2012/02/03
0
1
Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho
06/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions)

转发 TypeScript基础入门之高级类型的可辨识联合(Discriminated Unions) 高级类型 可辨识联合(Discriminated Unions) 你可以合并单例类型,联合类型,类型保护和类型别名来创建一个叫做 ...

durban
19分钟前
1
0
画图工具

目标是不要让我自己摆放,那样会打断我的思路。要自己会摆放,我写字就好。 纠结对齐的我在也不会因为一个像素的问题小心翼翼的移动鼠标了。因为它对不齐你也管不了。 Graphviz https://www...

郭大鹏
19分钟前
1
0
在Visual Studio中使用GitHub(使用篇)

上一篇中已经介绍了如何在windows下安装和配置Git,并且详细说明了如何和GitHub连接。 这里就详细的说明下如何在Visual Studio中使用GitHub。这里也是一个简单的Git教程。 注:非常非常简单的...

Jokeny
19分钟前
1
0
tomcat 在liunx系统中shutdown后进程仍然存在解决办法

这个在windows下没有碰到过,因为此前跑Tomcat都是以服务而不是命令脚本的形式跑的,而且已经换了一个项目,所以暂时不考察windows下是否存在该问题。 难道是Tomcat版本问题?或者用带内存泄...

乱舞
21分钟前
1
0
区块链10年了,还未落地,它失败了吗?

几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 有人说,比特币是建...

linux-tao
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部