文档章节

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

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

码上生花,ECharts 作品展示赛正式启动!>>>

——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
69
0
07.Android之多媒体问题

目录介绍 7.0.0.1 加载bitmap图片的时候需要注意什么?为何bitmap容易造成OOM?如何计算Bitmap占用内存? 7.0.0.2 如何理解recycle释放内存问题?图片加载到内存其实有两部分数据,这是为何?...

潇湘剑雨
2019/02/14
13
0
Android 圆形头像 自己动手

圆形头像DIY 现在大部分app使用的都是圆形头像,网上开源的也很多,但是有没有考虑过DIY圆形头像呢?下面就自己实现一个,先看下demo展示 第一步:原理解释(图片很丑,原理很真) 1、画外框...

jlins
2015/01/05
0
0
Android自定义View学习笔记(一)

##绘制基础 参考:HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础 ##Paint详解 参考:HenCoder Android 开发进阶: 自定义 View 1-2 Paint 详解 ###关于颜色的三层设置 直接设置颜色的...

osc_0s8midei
2018/03/05
7
0
android自学笔记《四》——应用程序结构分析

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

郭子
2012/02/03
2.5K
1

没有更多内容

加载失败,请刷新页面

加载更多

BIO、NIO、AIO、Netty面试题

https://juejin.im/post/5e9421836fb9a03c7b3051bb

JaneRoad
12分钟前
19
0
elementui table缩略图滑过放大图片

html中 <el-table-column prop="qr_image" label="缩略图" width="180"> <template slot-scope="scope"> <el-popover trigger="hover" title="" placem......

大换子
21分钟前
16
0
家谱软件中的循环 - Cycles in family tree software

问题: I am the developer of some family tree software (written in C++ and Qt). 我是一些家庭树软件的开发者(用C ++和Qt编写)。 I had no problems until one of my customers mailed......

javail
22分钟前
23
0
MySQL 多表关联一对多查询取最新的一条数据

SQL语句 SELECT SQL_CALC_FOUND_ROWS* FROMtableA aLEFT JOIN (SELECTBC.* FROM( SELECT MAX( id ) AS cid FROM tableB GROUP BY code ) ACLEFT JOIN tableB B...

珞木橘子
30分钟前
16
0
nacos的启动方式以及注意的点

这个单机模式的启动方式 sh startup.sh -m standalone 注意,必须要加参数,如果不加参数启动了,无法正常访问 如果在用这个命令(sh startup.sh -m standalone)之前直接使用sh startup.sh ,...

千年典韦
40分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部