您的位置:首页 > 移动开发 > Android开发

Android 自定义View

2014-01-15 18:11 351 查看
想要了解android自定义View,去设计和实现自己想要的View,这里从最基础的知识透析安卓自定义控件实现机理。

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

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

       1、Canvas--画板
              Canvas是一个大大的画板,这个画板有多大,所有的View及实现的图形都在这个Canvas上实现。

Canvas类提供了三个构造方法:

Public Canvas();构造一个默认无参的Canvas对象

Public Canvas(Bitmap bitmap);根据一个Bitmap构造一个Canvas对象

Public Canvas(GL gl);根据一个GL来构造一个对象

       2、Paint--画笔
              有画板没有画笔怎么能行了,没错Paint就是画笔。掌管Android王国中的所有画笔。

Paint类有三个构造方法:

Public Paint()构造一个缺省的Paint对象

Public  Paint(int flags);根据指定的flags来构造一个Paint对象,创建之后可以用

setFlags()方法来更改

Public Paint(Paint paint)根据指定的paint对象来构造一个Paint对象

 
       3、Color--颜色
              Color.parseColor(String str);函数这个函数太强大了,解析Alpha颜色和普通的颜色。
颜色被表示为封装的数值,这个数值由四个字节组成,分别是:alpha、red、green、blue,这些值是非自左乘的,也就是说任何透明性只存储在alpha部分,而不是在颜色组成部分。每一部分按照如下的顺序保存:(alpha<<24)|(red<<16)|<green<<8)|blue.每一部分的取值范围在0-255之间,0意味着这部分不起作用,255表示100%的起作用。因此不透明的黑色应该是0xFF000000,不透明的白色应该是0xFFFFFFFF


       4、Bitmap--位图
              这个类可以掌管天下的png和jpg图片。我们会使用三种方法获得Drawable文件夹下的图片
 5、Typeface类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

public class MyView extends View {
 

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

@Override  

    protected void onDraw(Canvas canvas) {  

        super.onDraw(canvas);  

          

        /** 

         * 画最外层的大圆环 

         */  

        int centre = getWidth()/2; //获取圆心的x坐标  

        int radius = (int) (centre - roundWidth/2); //圆环的半径  

        paint.setColor(roundColor); //设置圆环的颜色  

        paint.setStyle(Paint.Style.STROKE); //设置空心  

        paint.setStrokeWidth(roundWidth); //设置圆环的宽度  

        paint.setAntiAlias(true);  //消除锯齿   

        canvas.drawCircle(centre, centre, radius, paint); //画出圆环  

          

        Log.e("log", centre + "");  

}

          

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: