文档章节

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
广州
私信 提问
J2ME移植到ophone

中国拥有世界最庞大的电信客户群,仅移动用户就达7亿,3G在中国有最大的市场做后盾,无论现在的市场发展如何的困难,3G费用的降低是大势所趋,不久的将来,必然形成巨大的3G浪潮,3G手机会如...

长平狐
2012/08/29
47
0
android自学笔记《四》——应用程序结构分析

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

郭子
2012/02/03
0
1
当 Kotlin 遇上 Android KTX,岂止丝滑?

Kotlin 语言自从得到 Google 的官方认定之后,在 Android 开发这条路上的发展可谓是一马平川。不仅是 Android Studio 3.0 开始默认自动支持 Kotlin 语言,还有一件更为惊喜的事。 Google 于上...

亦枫
10/29
0
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

没有更多内容

加载失败,请刷新页面

加载更多

《激荡三十年》读书笔记的相关感悟3300字

《激荡三十年》读书笔记的相关感悟3300字: 《激荡三十年》是吴晓波以编年体的方式记录的中国1978年改革开放后至2008年的30年的企业史。这套被称为“新货殖列传”的“企业史记”记录了三十年...

原创小博客
21分钟前
1
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
59分钟前
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
1
0
HashTable和Vector为什么逐渐被废弃

HashTable,不允许键值为null,还一个就是put方法使用sychronized方法进行线程同步,单线程无需同步,多线程可用concurren包的类型。 如编程思想里面说的作为工具类,封闭性做的不好没有一个...

noob_chr
昨天
1
0
Win10 下安装Win7双系统

很多人买了预装64位Win8/8.1的电脑后想重装(或者再安装一个)Win7系统,但是折腾半天发现以前的方法根本不奏效。这是因为预装Win8/8.1的电脑统一采用了UEFI+GPT引导模式,传统的BIOS(Legacy...

yaly
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部