Android 自定义View

想要了解android自定义View,去设计和实现自己想要的View,这里从最基础的知识透析安卓自定义控件实现机理。

首先我们来了解下做自定义View,必须知道的基础知识

android.graphics包是核心渲染包,它提供了一些初级图形工具,诸如画布、颜色过滤器、画笔等,可以让你直接在屏幕上进行图像处理。这个包中提供了很多类。

       1Canvas--画板
              Canvas是一个大大的画板,这个画板有多大,所有的View及实现的图形都在这个Canvas上实现。
Canvas类提供了三个构造方法:
Public Canvas();构造一个默认无参的Canvas对象
Public Canvas(Bitmap bitmap);根据一个Bitmap构造一个Canvas对象
Public Canvas(GL gl);根据一个GL来构造一个对象

       2Paint--画笔
              有画板没有画笔怎么能行了,没错Paint就是画笔。掌管Android王国中的所有画笔。
Paint类有三个构造方法:
Public Paint()构造一个缺省的Paint对象
Public  Paint(int flags);根据指定的flags来构造一个Paint对象,创建之后可以用
setFlags()方法来更改
Public Paint(Paint paint)根据指定的paint对象来构造一个Paint对象

 
       3Color--颜色
              Color.parseColor(String str);函数这个函数太强大了,解析Alpha颜色和普通的颜色。
颜色被表示为封装的数值,这个数值由四个字节组成,分别是:alpha、red、green、blue,这些值是非自左乘的,也就是说任何透明性只存储在alpha部分,而不是在颜色组成部分。每一部分按照如下的顺序保存:(alpha<<24)|(red<<16)|<green<<8)|blue.每一部分的取值范围在0-255之间,0意味着这部分不起作用,255表示100%的起作用。因此不透明的黑色应该是0xFF000000,不透明的白色应该是0xFFFFFFFF 。
       4Bitmap--位图
              这个类可以掌管天下的png和jpg图片。我们会使用三种方法获得Drawable文件夹下的图片
 5Typeface类android.graphics.Typeface
ypeface类定义字体和字体内在的类型。这个类被用在画笔Paint设置的时候,比如用textSize,textSkewX和textScale设置来指定text在画的时候如何来显示和测量。
Typeface提供了一些常量值来表示自身的一些属性,比如BOLD,BOLD_ITALIC,ITALIC等
      6、Path类android.graphics.Path
Path类(一组区域)的描画,类囊括多种几何图形比如直线线段、二次曲线、三次曲线等,
调用Canvas.drawPath()方法可以将Path以所定义的paint的方式来画到画板上或者填出图形,也可以用paint所指定方式来画图形。

       7、RectF类android.graphics.RectF和Rect类android.graphics.Rect
RectF这个类包含一个矩形的四个单精度浮点坐标。矩形通过上下左右4个边的坐标来表示一个矩形。这些坐标值属性可以被直接访问,用width()和height()方法可以获取矩形的宽和高。注意:大多数方法不会检查这些坐标分类是否错误(也就是left<=right和top<=bottom).
RectF一共有四个构造方法:
RectF()构造一个无参的矩形
RectF(float left,float top,float right,float bottom)构造一个指定了4个参数的矩形
RectF(Rect F r)根据指定的RectF对象来构造一个RectF对象(对象的左边坐标不变)
RectF(Rect r)根据给定的Rect对象来构造一个RectF对象
RectF提供了很多方法,下面介绍几个方法:
Public Boolean contain(RectF r);判断一个矩形是否在此矩形内,如果在这个矩形内或者和这个矩形等价则返回true,同样类似的方法还有public Boolean contain(float left,float top,float right,float bottom)和public Boolean contain(float x,float y)。
Public void union(float x,float y)更新这个矩形,使它包含矩形自己和(x,y)这个点。
RectF类提供的方法都比较简单,容易理解,再此就不再一一赘述
Android.graphics.Rect类,这个类同android.graphics.RectF很相似,不同的地方是Rect类的坐标是用整形表示的,而RectF的坐标是用单精度浮点型表示的。

实现一个自定义View,需要实现以下步骤:

1,继承View

  1. public class MyView extends View {  

2,重写父类View的一些方法,例如onDraw;

  1. @Override  
  2.     protected void onDraw(Canvas canvas) {  
  3.         super.onDraw(canvas);  
  4.           
  5.         /** 
  6.          * 画最外层的大圆环 
  7.          */  
  8.         int centre = getWidth()/2//获取圆心的x坐标  
  9.         int radius = (int) (centre - roundWidth/2); //圆环的半径  
  10.         paint.setColor(roundColor); //设置圆环的颜色  
  11.         paint.setStyle(Paint.Style.STROKE); //设置空心  
  12.         paint.setStrokeWidth(roundWidth); //设置圆环的宽度  
  13.         paint.setAntiAlias(true);  //消除锯齿   
  14.         canvas.drawCircle(centre, centre, radius, paint); //画出圆环  
  15.           
  16.         Log.e("log", centre + "");  
  17. }
  18.           

3,根据onDraw需要到的属性,可以自定义View属性(values下建立attrs.xml文件);

<?xml version="1.0" encoding="UTF-8"?>  
<resources>  
    <declare-styleable name="RoundProgressBar">    
        <attr name="roundColor" format="color"/>  
        <attr name="roundProgressColor" format="color"/>  
        <attr name="roundWidth" format="dimension"></attr>  
        <attr name="textColor" format="color" />    
        <attr name="textSize" format="dimension" />   
        <attr name="max" format="integer"></attr>   
        <attr name="textIsDisplayable" format="boolean"></attr>  
        <attr name="style">  
            <enum name="STROKE" value="0"></enum>  
            <enum name="FILL" value="1"></enum>  
        </attr>  
    </declare-styleable>   
</resources>  


4,布局中或是代码中应用自定义View,如:

<net.changxing.test.MyView    
        android:id="@+id/roundProgressBar2"    
        android:layout_width="80dip"    
        android:layout_height="80dip"    
        android:layout_alignLeft="@+id/roundProgressBar1"    
        android:layout_alignParentBottom="true"    
        android:layout_marginBottom="78dp"    
            
            
        app:roundColor="#D1D1D1"    
       />    

5、在activity中实例化,修改相应属性成功现实出设计的自定义View;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。