自定义控件是Android开发中非常常用的技术,是初级程序员向高级程序员进阶的必经之路。弄清楚Android原生控件是如何做出来的,自己动手去实现我们自定义的控件是非常重要的,今天为大家讲解的是自定义控件的入门的知识,首先要我们弄明白,控件的一些基本知识,和重新认识我们的控件。
Android中控件分为两个部分,我们称之为2+1原则。一个是界面的呈现机制,一个是界面的事件机制。加一就是我们的ViewTree(界面的层级树)。第一种界面的呈现,我们分为两种方式。一个是XML布局我们通过inflate对象转化为类对象添加到我们的界面中。还有一种就是动态编码实现,动态布局,动态化控件。实际上我们的xml后期也是需要转化为类。(万物皆对象,对象都是类)。第二种Android的界面事件机制也分为两个知识点。一个是我们界面事件的分类,分为KeyEvent(按键事件),TouchEvent(手指触摸事件),和TrackballEvent(轨迹事件)。还有一个就是Android界面事件的触发及分发。下面附上一张ViewTree示意图。
下面的代码片段演示了动态编码如何使用一个图像类构建一个ImageView,并将其添加到布局。
package com.example.cdy.customview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
//声明布局,看上边的层技术,一个view必须在一个viewGroup中。
LinearLayout linearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//创建一个添加ImageView的 LinearLayout
linearLayout = new LinearLayout(this);
//实例化一个ImageView并定义其属性
ImageView i = new ImageView(this);
i.setImageResource(R.drawable.ershi);
//设置该属性为真可以在 ImageView 调整边界时保持图片的纵横比例。(译者注:需要与maxWidth、MaxHeight一起使用,否则单独使用没有效果。)
i.setAdjustViewBounds(true);
//Gallery(画廊)扩展了LayoutParams
i.setLayoutParams(new Gallery.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
linearLayout.addView(i);
setContentView(linearLayout);
}
}
运行图如何,和xml布局是一样的。
通过Hierarchy Viewer是随AndroidSDK发布的工具,位置在tools文件夹下,名为hierarchyviewer.bat。查看界面的布局。可以看到我们的界面并不像我们想象一样,实际上系统为我们生成了很多布局。