Android绘图机制(三)——自定义View的三种实现方式以及实战项目操作


Android绘图机制(一)——自定义View的基础属性和方法

里说过,实现自定义View有三种方式,分别是

1.对现有的控件进行扩展

2.通过组件来实现新的控件

3.重写View来实现全新的控件

所以本节就来带大家把这个流程走一遍,我们用到的项目还是

Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

本节现在就是做一个真正意义上的自定义View的操作了

注意本节的项目来自于《Android群英传》中的几个小例子

一.对现有的控件进行扩展之自定义TextView

我们新建一个Class类TextView继承TextView
package com.lgl.view.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;

/**
 * Created by LGL on 2016/1/10.
 */
public class TextView extends android.widget.TextView {

    private Paint paint1, paint2;

    public TextView(Context context) {
        super(context);
    }

    public TextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        //实例化画笔
        paint1 = new Paint();
        //给画笔1设置颜色
        paint1.setColor(getResources()
                .getColor(android.R.color.holo_blue_light));
        //给画笔1设置Style
        paint1.setStyle(Paint.Style.FILL);

        //实例化画笔
        paint2 = new Paint();
        //给画笔2设置颜色
        paint2.setColor(Color.YELLOW);
        //给画笔2设置Style
        paint2.setStyle(Paint.Style.FILL);

        //绘制外层矩形
        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), paint1);
        //绘制内层矩形
        canvas.drawRect(10, 10, getMeasuredWidth() - 10, getMeasuredHeight() - 10, paint2);
        canvas.save();
        //父类完成的方法,即绘制完成
        super.onDraw(canvas);
    }
}

截图

二.重写View来实现全新的控件

市面上有许许多多的APP,他们之中有很多的控件都不是原生的,而是需要我们自定义View的
package com.lgl.view.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;

/**
 * 半弧圆
 * Created by LGL on 2016/1/10.
 */
public class RCircleView extends View {

    //弧的画笔
    private Paint rpaint;
    //圆的画笔
    private Paint cpaint;
    //文字的画笔
    private Paint tvpaint;
    //屏幕高宽
    private int width, height;
    //文字
    private String text = "绘制半弧圆";

    public RCircleView(Context context) {
        super(context);
        init();
    }

    public RCircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        //获取屏幕的宽高
        //Android绘图机制(一)——自定义View的基础属性和方法里面有讲
        WindowManager wm = (WindowManager) getContext()
                .getSystemService(Context.WINDOW_SERVICE);

        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //实例化画笔,以及设置属性,颜色,文字大小
        rpaint = new Paint();
        rpaint.setStyle(Paint.Style.STROKE);
        cpaint = new Paint();
        tvpaint = new Paint();
        tvpaint.setColor(Color.WHITE);
        tvpaint.setTextSize(20);
        //绘制弧线的区域矩形
        RectF mArcRectF = new RectF((float) (width * 0.1), (float) (width * 0.1), (float) (width * 0.9), (float) (width * 0.9));
        //绘制圆
        canvas.drawCircle(width / 2, width / 2, (float) (width * 0.5 / 3), cpaint);
        //绘制弧线
        canvas.drawArc(mArcRectF, 270, 240, false, rpaint);
        //这样绘制的话,会出现偏差的,文字以圆形的中心开始绘制
        canvas.drawText(text, width / 2, width / 2, tvpaint);
    }
}

截图

这里,你会疑惑,为什么文字不是居中?我们来画个图

这个还是比较基础的,下一节我们就来点新的玩法

Demo下载:本系列最后一节提供

Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件的更多相关文章

  1. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

  2. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  3. Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧

    第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...

  4. Android群英传笔记——第六章:Android绘图机制与处理技巧

    Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...

  5. Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美

    Android绘图机制(四)--使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 这里为什么不继续把自定义View写下去呢,因为最近项目 ...

  6. Android ——利用OnDraw实现自定义View(转)

    自定义View的实现方式大概可以分为三种,自绘控件.组合控件.以及继承控件.本文将介绍自绘控件的用法.自绘控件的意思是,这个控件上的内容是用onDraw函数绘制出来的.关于onDraw函数的介绍可参看 ...

  7. Android特效专辑(三)——自定义不一样的Toast

    Android特效专辑(三)--自定义不一样的Toast 大家都知道,Android的控件有时候很难满足我们的需求,所以我们需要自定义View.自定义的方式很多,有继承原生控件也有直接自定义View的 ...

  8. 【转】Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用

    Android M新控件之AppBarLayout,NavigationView,CoordinatorLayout,CollapsingToolbarLayout的使用 分类: Android UI ...

  9. 【转】Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用

    Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用 分类: Android UI2015-06-15 16: ...

随机推荐

  1. GridView如何适配不同屏幕

    GridView和ListView一样,都是项目中常用的控件之一,那么本篇文章要讲的是GridView如何适应不同大小的屏幕,首先,我们来看一张效果图,如下: 每行为四个item,上下左右间距大概2d ...

  2. [ExtJS5学习笔记]第二十一节 Extjs5中使用config配置给ext.widget或者create方法传递参数

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/39252805 官方例子:http://docs.sencha.com/extjs/5. ...

  3. 安卓AsyncTack详解

    我们知道安卓中的UI线程不是线程安全的,即不能在UI线程中进行耗时操作,所以我们通常的做法是开启一个子线程来进行耗时操作,然后将处理后的结果运用Handler机制传递给UI线程,在UI线程中根据处理后 ...

  4. [django]项目打包构建

    django项目的结构大体上都是类似,打包主要的功能就是把一些不需要部署的文件剔除,把需要部署的文件直接压缩打包. 这里还想集成一个配置文件模板生成配置文件的过程,或者写一个配置文件生成的工具,不用每 ...

  5. UNIX网络编程——基本TCP套接字编程

    一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...

  6. 未完成的IT路停在回车键---2014年末总结篇

    时间都去哪儿了?         一晃而过,越来越能体会到这个词的真实感.特别是过了二十岁,这种感觉越来越深刻,越来越强烈,犹如小编做公交车的时候一直向后排排倒的香樟树,还记得有首歌叫时间都哪儿了,而 ...

  7. SpringMVC返回json是设置编辑等消息头,消息头信息介绍(respone.setHeader,这个从网上获取)

    1.  SpringMVC中设置消息头,例子如下: ? 因为上面的代码没有添加该文件的编码说明 , WEB应用程序在将jsp翻译成class文件时 , 把该字符串的内容按默认的保存方式指定的编码ASC ...

  8. Leetcode_38_count-and-say

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41257397 The count-and-say sequ ...

  9. C#中的泛型化方法的实现

    在一个基本数据类型的方法中求解最大值或者最小值是一件很方便,同时也是很简单的事.但是如果你想复用这个方法,我们就需要使用到泛型编程的概念了.这就好比是C++中的模板函数,或者java中的泛型操作.相比 ...

  10. pig基础知识总结

    Pig Latin UDF语句 REGISTER   在Pig运行时环境中注册一个JAR文件 DEFINE      为UDF.流式脚本或命令规范新建别名 Pig Latin命令类型 kill    ...