首页 > 代码库 > 2.1安卓视图组件
2.1安卓视图组件
1视图组件与容器组件
1)绝大部分安卓UI组件都存放与android.widget包及其子包,android.view及其子包
2)安卓所有 UI组件都继承自View类
3)View类有一个非常重要的子类:ViewGroup,但是ViewGroup经常作为其他组件的容器使用,安卓采用组合器模式设计View和ViewGroup
VIewGroup可以当作View使用,但一般都是作为容器使用;但是ViewGroup是抽象类
实际都是用他的子类,如各种布局管理器
/**
* <p>
* A <code>ViewGroup</code> is a special view that can contain other views
* (called children.) The view group is the base class for layouts and views
* containers. This class also defines the
* {@link android.view.ViewGroup.LayoutParams} class which serves as the base
* class for layouts parameters.
×/
public abstract class ViewGroup extends View implements ViewParent, ViewManager {}
2使用xml文件控制UI
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.examples.viewgroup.MainActivity" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" /></RelativeLayout>
src中代码为
1 super.onCreate(savedInstanceState); 2 super.setContentView(R.layout.activity_main); 3 Button b = (Button)findViewById(R.id.button); 4 final TextView text = (TextView)findViewById(R.id.text); 5 b.setOnClickListener(new OnClickListener() { 6 7 @Override 8 public void onClick(View v) { 9 // TODO Auto-generated method stub10 text.setText("当前系统时间"+new Date());11 }12 });
3使用代码完全控制UI
1 super.onCreate(savedInstanceState); 2 //创建一个线性布局 3 LinearLayout layout= new LinearLayout(this); 4 //设置该Activity显示layout 5 setContentView(layout); 6 //垂直列表 7 layout.setOrientation(LinearLayout.VERTICAL); 8 //创建一个TextView 9 final TextView text = new TextView(this);10 Button b = new Button(this);11 //在value文件夹下的string xml文件中添加字符串资源12 b.setText(R.string.button);13 //实际内容大小填充button控件14 b.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT));15 layout.addView(b);16 layout.addView(text);17 //为button添加监听事件18 b.setOnClickListener(new OnClickListener() {19 20 @Override21 public void onClick(View v) {22 // TODO Auto-generated method stub23 text.setText("当前时间"+new java.util.Date());24 }25 });
运行结果
通过上述两种方式均可以实现这个简单的功能,但是使用代码控制UI则显得比较臃肿,使用xml文件配置界面显示体现了MVC的分层思想。可以将界面与逻辑良好的接偶便于后期的维护与修改。
4.使用xml文件与代码混合控制UI界面
1)将图片文件放置到drawable-ldpi文件夹下
2)定义线性布局文件 fistlayout.xml
<?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" >
<ImageView
android:id="@+id/image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:contentDescription="@+id/test"
/></LinearLayout>
3)代码中控制图片变换
super.onCreate(savedInstanceState);
setContentView(R.layout.firstlayout);
final ImageView image = (ImageView)findViewById(R.id.image);
image.setImageResource(images[0]);
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
image.setImageResource(images[++i%images.length]);
}
});
5.开发自定义View
想要实现自定义View,则必须定义一个继承View基类的子类,然后重写View类的一个或者多个方法,通常重写的方法有如下
构造器:重写构造器是定制VIew的最基本方式,当java代码创建一个View实例或者根据xml文件加载并构建界面时将会调用构造方法
onFinishInflate():回调方法,当应用从xml布局文件加载该组件并利用它来构建界面之后该方法会被回调
onMeasure(int,int):调用该方法来检测View组件及它所包含的所有子组件的大小
onLayout(boolean,int,int,int,int):当组件需要分配器子组件的为知/大小时该方法会被回调
onSizeChanged(int,int,int,int):当该组件的大小被改变时回调该方法
onDraw(Canvas):该组件将要绘制他的内容时回调该方法进行绘制
onKeyDown(int,KeyEvent):当某个案件被按下时触发该方法
onKeyUp(int,KeyEvent):当松开某个按键时触发该方法
onTrackballEvent(MotionEvent):当发生轨迹球事件时触发该方法
onTouchEvent(MotionEvent):触摸时触发
onWindowFocusChanged(boolean):当组件得到/失去焦点时触发
onAttachedToWindow():当组件被放入到某个窗口时触发该方法
onDetachedFromWIndow():当组件被从某个窗口分离时触发该方法
onWindowVisibilityChanged(int):当包含该组建的窗口的可见性发生改变时触发该方法
一般我们不会重写所有的方法,而是根据需要重写部分方法即可
下面创建一个跟随手指运动的小球
1)创建DrawViw类继承自View,并重写部分方法
public class DrawView extends View { public DrawView(Context context) { super(context); // TODO Auto-generated constructor stub } public float currX = 50; public float currY = 50; Paint p = new Paint(); //重写onDraw方法 public void onDraw(Canvas canvas) { super.onDraw(canvas); p.setColor(Color.RED); canvas.drawCircle(currX, currY, 15, p); } //重写触摸事件 @Override public boolean onTouchEvent(MotionEvent event){ //修改坐标 currX = event.getX(); currY = event.getY(); //通知当前组件重绘 invalidate(); return true; }}
2)使用java代码将自定义的View添加到布局文件
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RelativeLayout layout = (RelativeLayout)findViewById(R.id.main); final DrawView draw = new DrawView(this); layout.addView(draw);
3)也可以在布局文件中直接引入自定义的DrawView
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.examples.drawview.MainActivity" ><com.examples.drawview.DrawView android:layout_width="match_parent" android:layout_height="match_parent"/></RelativeLayout>
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
2.1安卓视图组件