Android-自定义控件之绘图基础
画圆形,效果图:

布局中去指定自定义View:
<view.custom.androidcustomviewbook.a_draw_base.BaseView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在代码中去绘制圆形:
public class BaseView extends View {
    public BaseView(Context context) {
        super(context);
    }
    public BaseView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 设置画笔的基本属性
        Paint paint = new Paint();
        // 设置画笔的颜色
        paint.setColor(Color.BLUE);
        // 设置画笔填充的样式
        paint.setStyle(Paint.Style.FILL);
        // 设置画笔的宽度
        paint.setStrokeWidth(60);
        // 设置画布,把画笔画上去,画布是圆形
        canvas.drawCircle(300,300,160, paint);
    }
}
圆形并填充内部,效果图:

下面是绘制的代码:
public class BaseView extends View {
    public BaseView(Context context) {
        super(context);
    }
    public BaseView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(0xFFFF0000);
        paint.setStyle(Paint.Style.FILL); // 仅填充内部
        // paint.setStyle(Paint.Style.FILL_AND_STROKE); // 填充内部和描边
        // paint.setStyle(Paint.Style.STROKE); // 仅描边
        paint.setStrokeWidth(80); // 单位是px,需要设置为FILL_AND_STROKE才有效
        canvas.drawCircle(300, 800, 160, paint);
        paint.setColor(0x7EFFFF00);
        canvas.drawCircle(300, 800, 130, paint);
    }
}
画一条线,画一个点,Rect,RectF相关知识:
public class BaseView extends View{
    public BaseView(Context context) {
        super(context);
    }
    public BaseView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // canvas.drawColor(0xFFFF00FF);
        // canvas.drawRGB(255, 0, 255);
        // 注意:drawLine与setStyle无关,不管设置什么样式,再设置setStrokeWidth是生效的
        // 画一条直线
        /*Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setStrokeWidth(6);
        canvas.drawLine(200, 200, 400, 200, paint);*/
        /*// 画点 画点和画线一样 与 drawLine与setStyle无关
        Paint mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStrokeWidth(9);
        canvas.drawPoint(200,200, mPaint);*/
        // Rect
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(20);
        // 直接构造
        // canvas.drawRect(10, 10, 100, 100, paint);
        // 使用RectF构造
        RectF  rectF = new RectF(10f, 10f, 100f, 100f);
        canvas.drawRect(rectF, paint);
    }
}
效果图:

路径(Path),区域(Region),配合绘制操作:
public class BaseView4 extends View {
    public BaseView4(Context context) {
        super(context);
    }
    public BaseView4(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BaseView4(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 路径 path
        /*Paint mPaint = new Paint();
        mPaint.setColor(Color.YELLOW);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(6);*/
        /*Path mPath = new Path();
        mPath.moveTo(200, 200); // 设置起始点
        mPath.lineTo(300, 800); // 第一条直线的终点,也是第二条线的起始点
        mPath.lineTo(600, 800); // 画第二条线的起始点
        mPath.close(); // 闭环
        canvas.drawPath(mPath, mPaint);*/
        /*Path mPaht = new Path();
        mPaht.moveTo(10, 10); // 设置起始位置
        RectF rectF = new RectF(100, 10, 200, 100);
        // mPaht.addArc(rectF, 0, 90);
        // mPaht.arcTo(rectF, 0 ,99);
        mPaht.arcTo(rectF, 0 ,99, true);
        canvas.drawPath(mPaht, mPaint);*/
        /*Paint mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setStrokeWidth(6);
        // 区域的意思
        Region region = new Region(new Rect(10, 20, 60, 80));
        // 定义Region迭代器
        RegionIterator regionIterator = new RegionIterator(region);
        Rect rect = new Rect();
        while (regionIterator.next(rect)) {
            canvas.drawRect(rect, mPaint);
        }*/
        /*Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(6);*/
        /*// 构造一条椭圆路径
        Path ovalPaht = new Path();
        RectF rectF = new RectF(50, 50, 200, 500);
        ovalPaht.addOval(rectF, Path.Direction.CCW);
        // 【区域】 在 setPath方法中,传入椭圆区域小的矩形区域,让其区交集
        Region region = new Region();
        region.setPath(ovalPaht, new Region(50, 50, 200, 200));
        // 画出路径
        Rect r = new Rect();
        RegionIterator regionIterator = new RegionIterator(region);
        while (regionIterator.next(r)) {
            canvas.drawRect(r, paint);
        }*/
        // 区域相交
        /*Region region = new Region(10, 10, 200, 100);
        region.union(new Rect(10, 10, 50, 300));
        RegionIterator regionIterator = new RegionIterator(region);
        Rect resultRect = new Rect();
        while(regionIterator.next(resultRect)) {
            canvas.drawRect(resultRect, paint);
        }*/
        /**
         * 区域更加灵活的操作
         */
        // 构建出两个矩形
        Rect rect1 = new Rect(100, 100, 400, 200);
        Rect rect2 = new Rect(200, 0, 300, 300);
        // 需要一个画笔,可以画出矩形的轮廓
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);
        canvas.drawRect(rect1, paint);
        canvas.drawRect(rect2, paint);
        // 然后利用 rect1 rect2 来构造 Region,并在rect1的基础上与rect2来交集
        Region region1 = new Region(rect1);
        Region region2 = new Region(rect2);
        // 进行交集
        // region1.op(region2, Region.Op.INTERSECT);
        region1.op(region2, Region.Op.DIFFERENCE);
        // 在搞个画笔,所选区域用绿色去填充
        Paint paint2 = new Paint();
        paint2.setColor(Color.GREEN);
        paint2.setStyle(Paint.Style.FILL);
        RegionIterator regionIterator = new RegionIterator(region1);
        Rect resultRect = new Rect();
        while (regionIterator.next(resultRect)) {
            canvas.drawRect(resultRect, paint2);
        }
    }
}
效果图:

平移:
public class BaseView5 extends View {
    public BaseView5(Context context) {
        super(context);
    }
    public BaseView5(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BaseView5(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 平移 translate
        /*Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
        canvas.translate(200, 100);
        canvas.drawRect(new Rect(10, 10, 400, 220), paint);*/
        /**
         * 定义两个画笔,一个红色画笔,一个绿色画笔
         */
        Paint paintRed = new Paint();
        paintRed.setColor(Color.RED);
        paintRed.setStyle(Paint.Style.STROKE);
        paintRed.setStrokeWidth(2);
        Paint paintGreen = new Paint();
        paintGreen.setColor(Color.GREEN);
        paintGreen.setStyle(Paint.Style.STROKE);
        paintGreen.setStrokeWidth(2);
        // 构建一个矩形
        Rect rect = new Rect(10, 10, 400, 200);
        canvas.drawRect(rect, paintRed);
        // 进行平移
        canvas.translate(200, 400);
        canvas.drawRect(rect, paintGreen);
    }
}
效果图:

裁剪:
public class BaseView6 extends View {
    public BaseView6(Context context) {
        super(context);
    }
    public BaseView6(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public BaseView6(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.YELLOW);
        // 保存当前画笔大小,整个屏
        canvas.save();
        // 裁剪
        // canvas.drawColor(Color.BLUE);
        canvas.clipRect(new Rect(100, 100, 400, 800));
        canvas.drawColor(Color.RED);
        // 恢复 整个屏 然后设置蓝色
        // canvas.restore();
        // canvas.drawColor(Color.BLUE);
    }
}
效果图:

Android-自定义控件之绘图基础的更多相关文章
- Android中Canvas绘图基础详解(附源码下载) (转)
		Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ... 
- Android自定义控件系列之基础篇
		一.概述 在android开发中很多UI控件往往需要进行定制以满足应用的需要或达到更加的效果,接下来就通过一个系列来介绍自定义控件,这里更多是通过一些案例逐步去学习,本系列有一些典型的应用,掌握好了大 ... 
- Android自定义控件系列之应用篇——圆形进度条
		一.概述 在上一篇博文中,我们给大家介绍了Android自定义控件系列的基础篇.链接:http://www.cnblogs.com/jerehedu/p/4360066.html 这一篇博文中,我们将 ... 
- Android自定义控件:自适应大小的文本控件
		需求 自适应大小的文本: 效果图: 项目开发中,开发人员根据UI人员提供的一套尺寸,布局了一些带文本的页面, 往往会少考虑一些数据极限的问题,造成机型屏幕适配问题. 例如: 文本(或数值)长度可变,如 ... 
- Android自定义控件:图形报表的实现(折线图、曲线图、动态曲线图)(View与SurfaceView分别实现图表控件)
		图形报表很常用,因为展示数据比较直观,常见的形式有很多,如:折线图.柱形图.饼图.雷达图.股票图.还有一些3D效果的图表等. Android中也有不少第三方图表库,但是很难兼容各种各样的需求. 如果第 ... 
- Android自定义控件之自定义组合控件
		前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ... 
- [Xamarin.Android] 自定义控件
		[Xamarin.Android] 自定义控件 前言 软件项目开发的过程中,免不了遇到一些无法使用内建控件就能满足的客户需求,例如:时速表.折线图...等等.这时开发人员可以透过自定义控件的方式,为项 ... 
- android自定义控件实现TextView按下后字体颜色改变
		今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片 第一张是按下后截的图,功能很简单, ... 
- android自定义控件——以滑动开关为例
		0.引言 (1)Android从4.0开始提供了switch的滑动开关效果组件,但是之前版本却没有 (2)很多时候我们写程序,都希望把有用的通用的通用的东西封装起来,以便以后重用. 本文根据组件开发思 ... 
- Android自定义控件之自定义组合控件(三)
		前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ... 
随机推荐
- Keil for ARM与C++
			1. 如果你的程序中使用了C++全局变量,那么*不要*使用MicroLIB,否则Keil会说某某Symbol找不到 2. 不使用MicroLIB带来的一个问题是KEIL会使用semihosting S ... 
- mac下安装wxPython2.8.12.1方法
			搭建robot_framework 环境 找不到 wxPython2.8.12.1的解决方法 1.mac终端pip安装robotframework-ride后 启动ride.py报: wxPython ... 
- 分布式锁实践(二)-ZooKeeper实现总结
			写在最前面 前几周写了篇 利用Redis实现分布式锁 ,今天简单总结下ZooKeeper实现分布式锁的过程.其实生产上我只用过Redis或者数据库的方式,之前还真没了解过ZooKeeper怎么实现分布 ... 
- python一些不错的东西
			1 cmd命令行写代码的加强版 ipython 直接用pip安装就可以 php install Ipython 2 不错的数据分析 机器语言的 Python(x,y)是一个基于python的科 ... 
- CentOS+Tomcat环境搭建
			此次搭建是基于: CentOS release 5.6 (Final) Kernel \r on an \m 搭建准备:http://pan.baidu.com/s/1pLt1lLh apache-t ... 
- ADO 缓存更新
			if (ADOQuery1->UpdateStatus() == usUnmodified) return; ADOQuery1->UpdateBatch(arAll); Update ... 
- maven 统一管理依赖的版本号
- css常用属性总结:背景background下篇
			前言:这段时间天天加班到10:30之后,简直是x了. 在上一篇文章中,分别解析了background各个属性的用法和注意细节.如果我们在项目上使用背景效果,如果使用下面的写法,你可能抓狂. body{ ... 
- Fragment生命周期(转)
			Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且 ... 
- 30-python3 中 bytes 和 string 之间的互相转换
			转自:http://www.jb51.net/article/105064.htm password = b'123456' 等价于: pw = '123456' password = pw.enco ... 
