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 stub
10                 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             @Override
21             public void onClick(View v) {
22                 // TODO Auto-generated method stub
23                 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);

时间: 2024-10-24 14:28:47

2.1安卓视图组件的相关文章

7. Laravel5学习笔记:如何定义自己的视图组件

视图组件 视图组件就是在视图被渲染前,会调用的闭包或类方法.如果你想在每次渲染某些视图时绑定数据,视图组件可以把这样的程序逻辑组织在同一个地方. 对上面的话,理解如下: 这个php代码运行的时间是在渲染视图之前 使用这个组件应该用于每次渲染时,都要绑定数据的视图上.这样子就可以从控制器分离出数据绑定逻辑. 它很好的提现了 单一职责 ,对它的概念阐述 请看这里 使用 在laravel5的文档中已经说明了如何构建自己的视图组件.这里在重复一下. 先构建一个视图组件: <?php namespace

安卓高级组件-----进度条

进度条组件是安卓重要组件之一.当后台某个程序执行时,前台进度条动态显示了程序执行进度的百分比.是耗时较长的程序让用户觉得在自己的掌控之中,提高程序的友好型. 安卓支支持几种风格的进度条,能通过style属性呢设置进度条风格,该属性如下: @android:style/Widget.ProgressBar.Horizontal    水平进度条 @android:style/Widget.ProgressBar.Inverse        普通环形进度条 @android:style/Widge

QT开发(八)——QT单元视图组件

QT开发(八)--QT单元视图组件 QT中有四种单元视图组件,分别为列表视图QListView.树形视图QTreeView.表格视图QTableView.列视图QColumnView. 一.QListView列表视图 1.QListView组件简介 QListView列表视图,继承自QAbstractItemView.QListView是基于模型的列表/图标视图,不显示表头和表框,为Qt的模型/视图结构提供了更灵活的方式. 2.QListView组件属性 QListView组件属性设置: A.n

Android系列 -- 2、视图组件View

1.视图组件View android 绝大部分的UI组件都放在android.widget包以及其子包.android.view包以及其子包中,android应用所有组件都继承了View类 View有一个非常重要的类:ViewGroup,但ViewGroup通常作为其他组件的容器使用

视图组件

视图组件 作者: Rick Anderson翻译: 娄宇(Lyrics)校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图组件 视图组件是 ASP.NET Core MVC 中的新特性,与局部视图相似,但是它们更加的强大.视图组件不使用模型绑定,只取决于调用它时所提供的数据.视图组件有以下特点: 渲染一个块,而不是整个响应 在控制器和视图之间同样包含了关注点分离和可测试性带来的好处 可以拥有参数和业务逻辑 通常从

Butter Knife:一个安卓视图注入框架

2014年5月8日 星期四 14:52 官网: http://jakewharton.github.io/butterknife/ GitHub地址: https://github.com/JakeWharton/butterknife JavaDocs地址: http://jakewharton.github.io/butterknife/javadoc/ 注:本随笔翻译自官网,做了一些整理和注释.来自我的OneNote笔记 大纲: @InjectView (Activity,Fragment

用 php 实现一个视图组件和模板引擎——基础

只要不是做后端接口开发和一些作为守护进程之类的服务器脚本,大多数时候都是在和浏览器打交道,因此合理组织并展现 html 标签是最为常见的工作.一般大家使用框架时,都会自带有一套视图组件和模板引擎. 我们不讨论这些组件和引擎的好坏.因为这些东西已经经过考验,可以在生产环境下使用.我们现在只是为了学习一些东西,这时候了解一些原理上的可能对以后的帮助更大,如果一些人真的很有时间,利用这些基础知识完全可以写一个自己的组件,即可当做练习,也可以拿去自用. 好了,说这么多,我还是希望很多人明白,视图和模板引

Box(视图组件)如何在多个页面不同视觉规范下的复用

本文来自 网易云社区 . 问题描述 Android App中的页面元素,都是由一个个Box(可以理解成一个个自定义View组件和Widget同级)组成,这些Box可以在不同的页面.不同的模块达到复用的效果.但是,现在遇到了一个对于开发复用棘手的问题, A页面的组件间距和B页面的组件间距可能不同. A页面的Box1与Box1间距,和Box1与Box2的间距不一样. Box和Box之间的分割线,有粗有细,有的有左边距. 等等还有许多需要动态调整的地方. 然后做这些Box组件,就是为了复用它们,但现在

ASP.NET Core Razor 视图组件

视图组件简介 在新的ASP.NET Core MVC中,视图组件类似于局部视图,但它们更强大.视图组件不使用模型绑定,仅依赖于您在调用时提供的数据. 视图组件特性: 呈现页面响应的某一部分而不是整个响应 包括在控制器和视图之间发现的关注分离和可测试性优势 可以具有参数和业务逻辑 通常在页面布局中调用 视图组件是在任何地方可重用的呈现逻辑,对于局部视图来说相对复杂,例如: 动态导航菜单 标签云(查询数据库) 登录面板 购物车 最近发表的文章 典型博客上的侧边栏内容 将在每个页面上呈现的登录面板,并