培养自己的控制步骤定义:
1、要理解View作品 
2、 分享到继承View子类
3、 要定义自己的View类添加属性 
4、 绘制控件 
5、 响应用户消息 
6 、自己定义回调函数 

一、View结构原理
Android系统的视图结构的设计也採用了组合模式,即View作为全部图形的基类,Viewgroup对View继承扩展为视图容器类。

View定义了画图的基本操作
基本操作由三个函数完毕:measure()、layout()、draw()。其内部又分别包括了onMeasure()、onLayout()、onDraw()三个子方法。详细操作例如以下:
1、measure操作
     measure操作主要用于计算视图的大小。即视图的宽度和长度。在view中定义为final类型。要求子类不能改动。

measure()函数中又会调用以下的函数:

     (1)onMeasure(),视图大小的将在这里终于确定。也就是说measure仅仅是对onMeasure的一个包装,子类能够覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。


2、layout操作
     layout操作用于设置视图在屏幕中显示的位置。在view中定义为final类型,要求子类不能改动。layout()函数中有两个基本操作:
     (1)setFrame(l,t,r,b)。l,t,r,b即子视图在父视图中的详细位置,该函数用于将这些參数保存起来。
     (2)onLayout()。在View中这个函数什么都不会做,提供该函数主要是为viewGroup类型布局子视图用的。

3、draw操作
     draw操作利用前两部得到的參数。将视图显示在屏幕上。到这里也就完毕了整个的视图绘制工作。子类也不应该改动该方法,由于其内部定义了画图的基本操作:
     (1)绘制背景。
     (2)假设要视图显示渐变框。这里会做一些准备工作;
     (3)绘制视图本身,即调用onDraw()函数。在view中onDraw()是个空函数,也就是说详细的视图都要覆写该函数来实现自己的显示(比方TextView在这里实现了绘制文字的过程)。

而对于ViewGroup则不须要实现该函数,由于作为容器是“没有内容“的。其包括了多个子view,而子View已经实现了自己的绘制方法,因此仅仅须要告诉子view绘制自己就能够了。也就是以下的dispatchDraw()方法;

     (4)绘制子视图。即dispatchDraw()函数。在view中这是个空函数。详细的视图不须要实现该方法。它是专门为容器类准备的,也就是容器类必须实现该方法;
     (5)假设须要(应用程序调用了setVerticalFadingEdge或者setHorizontalFadingEdge),開始绘制渐变框;
     (6)绘制滚动栏;
      从上面能够看出自己定义View须要最少覆写onMeasure()和onDraw()两个方法。

二、View类的构造方法

创建自己定义控件的3种主要实现方式:
1)继承已有的控件来实现自己定义控件: 主要是当要实现的控件和已有的控件在非常多方面比較类似, 通过对已有控件的扩展来满足要求。

2)通过继承一个布局文件实现自己定义控件,一般来说做组合控件时能够通过这个方式来实现。
    注意此时不用onDraw方法。在构造广告中通过inflater载入自己定义控件的布局文件。再addView(view)。自己定义控件的图形界面就载入进来了。

3)通过继承view类来实现自己定义控件,使用GDI绘制出组件界面。一般无法通过上述两种方式来实现时用该方式。

View(Context context)

Simple constructor to use when creating a view from code.
View(Context context, AttributeSet attrs)

Constructor that is called when inflating a view from XML.
View(Context context, AttributeSet attrs,
int defStyle)

Perform inflation from XML and apply a class-specific base style.


三、自己定义View添加属性的两种方法:
1)在View类中定义。通过构造函数中引入的AttributeSet 去查找XML布局的属性名称,然后找到它相应引用的资源ID去找值。
案例:实现一个带文字的图片(图片、文字是onDraw方法重绘实现)

public class MyView
extends View {

private String
mtext;

private
int msrc;

public MyView(Context context) {

super(context);

//
TODO Auto-generated constructor stub

}

public MyView(Context context, AttributeSet attrs) {

super(context, attrs);

//
TODO Auto-generated constructor stub

int
resourceId = 0;

int textId = attrs.getAttributeResourceValue(null,
"Text",0);

int srcId = attrs.getAttributeResourceValue(null,
"Src", 0);

mtext = context.getResources().getText(textId).toString();

msrc = srcId;

}

@Override

protected
void onDraw(Canvas canvas) {

//
TODO Auto-generated method stub

Paint paint =
new Paint();

paint.setColor(Color.RED);

InputStream is = getResources().openRawResource(msrc);

Bitmap mBitmap = BitmapFactory.decodeStream(is);

int
bh = mBitmap.getHeight();

int bw = mBitmap.getWidth();

canvas.drawBitmap(mBitmap, 0,0, paint);

//canvas.drawCircle(40, 90, 15, paint);

canvas.drawText(mtext, bw/2, 30, paint);

}

}

布局文件:

<?xml
version="1.0"
encoding="utf-8"?>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"
>

<com.example.myimageview2.MyView

android:id="@+id/myView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

Text="@string/hello_world"

Src="@drawable/xh"/>

</LinearLayout>


属性Text, Src在自己定义View类的构造方法中读取。


2)通过XML为View注冊属性。与Android提供的标准属性写法一样。
案例:  实现一个带文字说明的ImageView (ImageView+TextView组合,文字说明。可在布局文件里设置位置)

public class MyImageView
extends LinearLayout {

public MyImageView(Context context) {

super(context);

//
TODO Auto-generated constructor stub

}

public MyImageView(Context context, AttributeSet attrs) {

super(context, attrs);

//
TODO Auto-generated constructor stub

int resourceId = -1;

TypedArray typedArray = context.obtainStyledAttributes(attrs,

R.styleable.MyImageView);

ImageView iv = new ImageView(context);

TextView tv = new TextView(context);

int N = typedArray.getIndexCount();

for (int i = 0; i < N; i++) {

int attr = typedArray.getIndex(i);

switch (attr) {

case R.styleable.MyImageView_Oriental:

resourceId = typedArray.getInt(

R.styleable.MyImageView_Oriental, 0);

this.setOrientation(resourceId == 1 ? LinearLayout.HORIZONTAL

: LinearLayout.VERTICAL);

break;

case R.styleable.MyImageView_Text:

resourceId = typedArray.getResourceId(

R.styleable.MyImageView_Text, 0);

tv.setText(resourceId > 0 ?

typedArray.getResources().getText(

resourceId) : typedArray

.getString(R.styleable.MyImageView_Text));

break;

case R.styleable.MyImageView_Src:

resourceId = typedArray.getResourceId(

R.styleable.MyImageView_Src, 0);

iv.setImageResource(resourceId > 0 ?resourceId:R.drawable.ic_launcher);

break;

}

}

addView(iv);

addView(tv);

typedArray.recycle();

}

}


attrs.xml进行属性声明。 文件放在values文件夹下

<?

xml
version="1.0"
encoding="utf-8"?

>

<resources>

<declare-styleable
name="MyImageView">

<attr
name="Text"
format="reference|string"></attr>

<attr
name="Oriental"
>

<enum
name="Horizontal"
value="1"></enum>

<enum
name="Vertical"
value="0"></enum>

</attr>

<attr
name="Src"
format="reference|integer"></attr>

</declare-styleable>

</resources>



MainActivity的布局文件:先定义命名空间 xmlns:uview="http://schemas.android.com/apk/res/com.example.myimageview2"
然后能够像使用系统的属性一样使用:uview:Oriental="Vertical"

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:uview="http://schemas.android.com/apk/res/com.example.myimageview2"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity"
>

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/hello_world"
/>

<com.example.myimageview2.MyImageView

android:id="@+id/myImageView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

uview:Text="这是一个图片说明"

uview:Src="@drawable/tw"

uview:Oriental="Vertical">

</com.example.myimageview2.MyImageView>

</LinearLayout>


四、控件绘制 onDraw()

五、


六、自己定义View的方法

onFinishInflate() 回调方法。当应用从XML载入该组件并用它构建界面之后调用的方法
onMeasure() 检測View组件及其子组件的大小
onLayout() 当该组件须要分配其子组件的位置、大小时
onSizeChange() 当该组件的大小被改变时
onDraw() 当组件将要绘&#8;制它的内容时
onKeyDown 当按下某个键盘时
onKeyUp  当松开某个键盘时
onTrackballEvent 当发生轨迹球事件时
onTouchEvent 当发生触屏事件时
onWindowFocusChanged(boolean)  当该组件得到、失去焦点时
onAtrrachedToWindow() 当把该组件放入到某个窗体时
onDetachedFromWindow() 当来自触发分离形式下的组件的方法
onWindowVisibilityChanged(int): 当改变方法包括组件的触发的可见性的形式

Android他们控制的定义(一)的更多相关文章

  1. android实现控制视频播放次数

    android实现控制视频播放次数,实质就是每个视频片段播放完后,通过MediaPlayer设置监听器setOnCompletionListener监听视频播放完毕,用Handler发送消息再次激活视 ...

  2. Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍

    原文 Visual Studio跨平台开发实战(4) - Xamarin Android基本控制项介绍 前言 不同于iOS,Xamarin 在Visual Studio中针对Android,可以直接设 ...

  3. android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)

    依照以下的理解就是handler与ui线程有一定的关联能够由于更新界面仅仅能在主线程中全部更新界面的地方能够在接受消息的handleMessage那里还有更新界面能够在handler.port(new ...

  4. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  5. Android(Linux)控制GPIO方法二

    前文<Android(Linux)控制GPIO的方法及实时性分析>主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受 ...

  6. ionic3 生成android 如何控制versionCode版本号

    ionic 项目中生成 android 如何控制版本号呢. 1.在项目的配置文件下的config.xml 来我们可以看到 <widget id="com.ionicframework. ...

  7. Android中View自己定义XML属性具体解释以及R.attr与R.styleable的差别

    为View加入自己定义XML属性 Android中的各种Widget都提供了非常多XML属性,我们能够利用这些XML属性在layout文件里为Widget的属性赋值. 例如以下所看到的: <Te ...

  8. 玩转OneNET物联网平台之MQTT服务⑦ —— 远程控制LED(数量无限制)+ Android App控制 优化第一版

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  9. Android Audio控制和MediaButton远程控制(音视频控制配合)

    使用过Android系统的朋友应该都知道,Android里面声音是区分好几种情况,每种情况下的音频大小是独立的.也就是说你调节了电话铃声大小不会影响多媒体播放的声音大小.这个涉及了AudioStrea ...

随机推荐

  1. 使MYSQL能被外部访问_xeyuu_新浪博客

    使MYSQL能被外部访问_xeyuu_新浪博客 使MYSQL能被外部访问 (

  2. Infinite scroll has been called autopagerize, unpaginate, endless pages

    http://www.infinite-scroll.com/ Infinite scroll has been called autopagerize, unpaginate, endless pa ...

  3. How to Design Programs, Second Edition

    How to Design Programs, Second Edition How to Design Programs, Second Edition

  4. apk应用的反编译和源代码的生成

    对于反编译一直持有无所谓有或无的态度.经过昨天一下午的尝试,也有了点心得和体会: 先给大家看看编译的过程和我们反编译的过程概图吧: 例如以下是反编译工具的根文件夹结构: 三个目录也实际上是下面三个步骤 ...

  5. VC生成的DLL给QT的EXE调用时lib路径问题小结

    VC生成的DLL给QT调用,有两种方式,一种是隐式调用调用(使用.lib文件方式): ① 在*.pro工程文件中添加VC生成的lib文件路径时,或者使用一个绝对路径,如: LIBS += " ...

  6. [Android学习笔记]页面布局

    线性布局:LinearLayout 1.集成ViewGroup,故可容纳多个View 2.线性布局,可设置水平或者垂直方向 相对布局:RelativeLayout

  7. C语言数据结构----递归的应用(八皇后问题的具体流程)

    本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...

  8. 在WIN7系统的笔记本上建立WIFI热点

        成功与否的关键在于你是否依照顺序运行:       前置条件:右键"我的电脑"--"属性"--"设备管理器"--"网络适配 ...

  9. IE, FireFox, Opera 浏览器支持CSS实现Alpha透明的方法 兼容问题

    一:要解决的问题时:在ie6-ie11下兼容下面透明上传文件button的效果. 实现方式通过滤镜实现. 二:效果图例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  10. 基于Opencv图像处理的时时头像採集试验

    2014 4.20 近期想做一个关于图像处理的软件玩玩,可惜也没有什么特别的想法,就当玩玩好了,准备用Opencv开源库实现下简单的功能吧. Opencv是一个专业的图像处理库,里面有非常多基础函数能 ...