Android群英传笔记系列二view的绘制(一)

三 .view的绘制
1.  使用方法:通过继承view并重写它的onDraw()方法来完成绘图。
2.  具体实现:
a.先定义一个Canvas对象,这个对象类似于一个花板,定义方法如下:Canvas canvas=new Canvas(bitmap);
b.我们可以看到在定义Canvas对象时,我们传入了一个bitmap对象,那么这个bitmap的作用是什么呢?其实bitmap的作用是存储所有绘制在Canvas上的像素信息。比如:
canvas.drawBitmap(bitmap1,0,0,null);
canvas.drawBitmap(bitmap2,0,0,null);
Canvas mCanvas=new Canvas(bitmap2);
mCanvas.drawXXX();
上面这段代码的含义是,将bitmap2,装载到另一个Canvas对象中,然后在其他地方使用Canvas对象对装载bitmap2的Canvas对象进行绘图。
c.实际上我们绘图,并不是直接绘制在onDraw()方法指定的那块布上,而是通过改变bitmap,然后让view重绘,从而显示改变之后的bitmap。
3.自定义view的常用函数:
onFinishInflate():从xml加载组件后回调
onSizeChanged():组件大小改变时回调
onMeasure():回调该方法来进行测量
onLayout():回调该方法来确定显示的位置
onTouchEvent();监听到触摸事件时回调
4.常见的实现自定义控件的方法:
a.  对现有控件进行扩展
b.  通过组合来实现新的控件
c.  重写view来实现全新的控件
5.对现有控件进行扩展:扩展textview,对textview加入多重颜色背景;
a.  定义一个类继承至TextView,并添加其构造函数:要注意的一点就是,添加构造函数时,一定要添加到含有Attributset参数的的构造函数,否则程序会报错,因为Attributset参数的作用是:外部通过它来获取到自定义view的属性。
public class DrawTextView extends TextView{
    public DrawTextView(Context context) {
        super(context);
    }
    public DrawTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}

b.定义两个画笔,并对画笔进行初始化内容:

private Paint mPaint1,mPaint2;
//初始化画笔内容:颜色和风格
mPaint1=new Paint();
mPaint2=new Paint();
mPaint1.setColor(getResources().getColor(R.color.colorPrimary));
mPaint1.setStyle(Paint.Style.FILL);
mPaint2.setColor(getResources().getColor(R.color.colorAccent));
mPaint2.setStyle(Paint.Style.FILL);

c.重写onDraw函数:这里要注意下save函数和restore函数之间的区别,前者是保存画布的状态,然后经过onDraw函数后,会对画布进行一些操作,比如旋转之类,这里是添加文字,而后者是对操作后的画布进行保存。

protected void onDraw(Canvas canvas) {
    //绘制内矩阵
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint1);
    //绘制外矩阵
    canvas.drawRect(10,10,getMeasuredWidth()-10,getMeasuredHeight()-10,mPaint2);
    //保存画布的状态
    canvas.save();
    //添加文字
    super.onDraw(canvas);
    //保存画布被操作后的状态
    canvas.restore();
}

d.在布局中引用自定义textview:

<main.view.com.drawmyview.DrawTextView
    android:layout_width="200dp"
    android:layout_height="50dp"
    android:textSize="20sp"
    android:gravity="center"
    android:text="@string/mytextview"/>

e.实现效果:

3.实现textview文字闪烁:

a.实现效果:

b.实现原理:使用Android中Paint对象的Shander渲染器,通过设置一个不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。

c.具体实现过程:

(1) 在onSizeChanged()方法中进行一些对象的初始化,并根据view的宽带设置一个LinearGradient渐变渲染器:

protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    if (mViewWidth==0){//一开始初始化为0了,所以会进入这个if判断语句
        mViewWidth=getMeasuredWidth();//获取到当前宽度
        if (mViewWidth>0){
            mPaint=getPaint();//获取当前绘制textview的Paint对象
            /*
            * 设置一个LinearGradient渐变器渲染器
            * 第一二个参数是设置渐变的起点,这里设置的是矩形的左上角为起点
            * 第三四个参数为设置渐变的终点,这里设置的是矩阵的右上角为终点
            * 第五个参数为一个int数组,表示渐变的颜色,这里选择的是蓝-白-蓝
            * 第六个参数为设置梯度颜色变化,设置方法为new float[]{0.25f,0.5f,0.75f},
            * 如果设置为空,表示颜色均匀分布,但一定要注意的是要保证颜色数组和位置数组大小一样
            * 第七个参数为平铺方式,CLMP为重复最后一个颜色至最后,其他的两个自己体验一下
            * */
            mLinearGradient=new LinearGradient(0,0,mViewWidth,0,new int[]{Color.BLUE,Color.WHITE,Color.BLUE}
                    ,new float[]{0.25f,0.5f,0.75f}, Shader.TileMode.CLAMP);
        //给paint对象添加渲染器
            mPaint.setShader(mLinearGradient);
            mGradientMatrix=new Matrix();
        }
    }

(2) 紧接着我们在onDraw()函数中,通过矩阵的方式来不断平移渐变效果,从而在绘制文字时,产生动态的闪动效果:

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (mGradientMatrix!=null){
        //设置矩阵的移动距离
        mTranslate+=mViewWidth/5;
        //移动到末尾后,将回到最初的位置,重新移动
        if (mTranslate>2*mViewWidth){
            mTranslate=-mViewWidth;
        }
        //设置矩阵的移动
        mGradientMatrix.setTranslate(mTranslate,0);
        //给矩阵添加渲染器
        mLinearGradient.setLocalMatrix(mGradientMatrix);
        //延迟100ms
        postInvalidateDelayed(100);
    }
}

最后在xml布局文件中引用:

<main.view.com.drawmyview.MyTextView
    android:layout_marginTop="20dp"
    android:text="@string/textview2"
    android:textSize="30sp"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
 
时间: 2024-10-18 03:08:33

Android群英传笔记系列二view的绘制(一)的相关文章

Android群英传笔记系列一view的介绍

学习完第一行代码后,继续学习Android群英传,希望能坚持下去,好好学习完这本书,并及时做好相关笔记,巩固相关知识: 一. View的介绍: 1`.我们先来看下view树结构: 2.树结构内容: a.viewparent是整棵树的核心,它统一调度和分配所有的交互管理事件. b.控件分为viewgroup和view两种控件,viewgroup作为父控件可以包含多个vie       w控件. c.我们知道在使用控件前都要通过findViewById的方法来实例化控件,那么在树结构中,实际上表现为

Android群英传笔记系列三 view的自定义:实现一个模拟下载

1.实现效果:动态显示进度(分别显示了整个的动态改变的过程,然后完成后,弹出一个对话框)       2.实现过程:可以分为绘制一个圆,圆弧和文本三部分,然后在MainAcitivity中通过线程模拟下载进度. a.定义一个类继承至view,然后添加其构造函数,记得一定要添加含有Attributset参数的构造函数; b.定义和初始化一些数据: private int mCircleXY; private int mWidth; private float mRadius; private Pa

Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 这一章很多,但是很有趣,也是这书的最后一章知识点了,我现在还在考虑要不要写这个拼图和2048的案例,在此之前,我们先来玩玩Android5.X的新特性吧!

Android群英传笔记——摘要,概述,新的出发点,温故而知新,能够为师矣!

Android群英传笔记--摘要.概述,新的出发点,温故而知新.能够为师矣! 当工作的越久,就越感到力不从心了,基础和理解才是最重要的,所以买了两本书,医生的<Android群英传>和主席的<Android开发艺术探索>.主要是再全面点的把自己所学的知识消化,这样也就不枉自己天天熬夜学习了,如今群英传快看完了.准备又一次再看一遍,同一时候把笔记以博客的形式记录下来,这样或许更加的深刻,然后再消磨一下主席的那本书,这本书有视频解说,更加好,所以估计以后应该非常少再写其它的博客,只是工

Android群英传笔记——第四章:ListView使用技巧

Android群英传笔记--第四章:ListView使用技巧 近期也是比較迷茫.可是有一点点还是要坚持的,就是学习了.近期离职了,今天也是继续温习第四章ListView,也拖了事实上也挺久的了,listview可谓是老牌大将了,非常多的应用场景都要使用它,他也是我们用得最多的控件之中的一个了,尽管如今出来了一个RecyclerView,可是ListView的地位一时半会儿还是撼动不了的.这就促使我们更加应该去把他掌握了 一.Listview经常使用优化技巧 我们一步步来把ListView学习好

Android群英传笔记——第九章:Android系统信息和安全机制

Android群英传笔记--第九章:Android系统信息和安全机制 本书也正式的进入尾声了,在android的世界了,不同的软件,硬件信息就像一个国家的经济水平,军事水平,不同的配置参数,代表着一个android帝国的强弱,所以厂商喜欢打配置战,本节就要是讲 Android系统信息的获取 PackageManager的使用 ActivityManager的使用 Android安全机制 一. Android系统信息的获取 由于android手机的开源性,手机的配置各种各样,那些优化大师之类的东西

Android群英传笔记——第七章:Android动画机制和使用技巧

Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中十分重要的一部分,从早期的Android版本中,由于动画机制和绘图机制的不健全,Android的人机交互备受诟病,Android从4.X开始,特别是5.X,动画越来越完善了,Google也开始重视这一方面了,我们本章学习的主要内容有 Android视图动画' Android属性动画 Android动画

Android群英传笔记——第八章:Activity与Activity调用栈分析

Android群英传笔记--第八章:Activity与Activity调用栈分析 开篇,我们陈述一下Activity,Activity是整个应用用户交互的核心组件,了解Activity的工作模式,生命周期和管理方式,是了解Android的基础,本节主讲 Activity的生命周期与工作模式 Activity调用栈管理 一.Activity Activity作为四大组建出现平率最高的组件,我们在哪里都能看到他,就让我们一起先来了解一下他的生命周期 1.起源 Activity是用户交互的第一接口,他

Android群英传笔记——第五章:Android Scroll分析

一.滑动效果是如何产生的 滑动一个View的本质其实就是移动一个View,改变其当钱所在的位置,他的原理和动画效果十分的相似,就是通过不断的改变View的坐标来实现这一效果,动态且不断的改变View的坐标,从而实现View跟随用户触摸滑动而滑动 但是在讲解滑动效果之前,需要先了解一下Android中窗口坐标体系和屏幕的触控事件--MotionEvent 1.Android坐标系 在物理学上,要描述一个物体的运动,就必须选定一个参考系,所谓滑动,正是相对于参考系的运动,在Android,系统将屏幕