第二章 吸引你的眼球—UI编程(6)

2.2彰显你的个性—自定义UI组件

很多时候,Android的常用控件并不能满足我们的需求。为了吸引更多的眼球,达到标新立异的效果,我们可以自己来定义各种控件。我们可以通过继承基础控件来重写某些环节,当然我们也可以将多个控件组合成一个新控件来使用。

我们先来看看下面一个例子,在这个例子当中,我们实现了一个带有图片和文字的按钮。

首先,定义一个layout,实现按钮内部的布局。代码如下:


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

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

android:orientation="horizontal"

android:layout_width="wrap_content"

android:layout_height="wrap_content"  >

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/iv"

android:paddingTop="5dip"

android:paddingBottom="5dip"

android:paddingLeft="20dip"

android:layout_gravity="center_vertical"  />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#333"

android:id="@+id/tv"

android:layout_marginLeft="8dip"

android:layout_gravity="center_vertical"  />

</LinearLayout>

这个xml实现了一个左图右字的布局,接下来写一个类MyLayout继承LinearLayout,导入刚刚的布局,并且设置需要的方法,从而使得能在代码中控制这个自定义控件内容的显示。代码如下:


// import略

public class MyLayout extends LinearLayout {

private ImageView iv;

private TextView tv;

public MyLayout(Context context) {

this(context, null);

}

public MyLayout(Context context, AttributeSet attrs) {

super(context, attrs);

// 导入布局

LayoutInflater.from(context).inflate(R.layout.mylayout, this, true);

iv = (ImageView) findViewById(R.id.iv);

tv = (TextView) findViewById(R.id.tv);

}

/**

* 设置图片资源

*/

public void setImageResource(int resId) {

iv.setImageResource(resId);

}

/**

* 设置显示的文字

*/

public void setTextViewText(String text) {

tv.setText(text);

}

}

然后,我们在需要使用这个自定义控件的layout中加入这控件,只需要在xml中加入即可:


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

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

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<com.char2.MyLayout

android:id="@+id/my_button"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:background="@drawable/button_gray"/>

</LinearLayout>

最后,我们在activity中设置该控件的内容,部分代码如下:


MyLayout myLayout = (MyLayout)findViewById(R.id.my_button);

myLayout.setImageResource(R.drawable.close);

myLayout.setTextViewText("关闭");

效果如图2-18所示:

图2-18 多个控件的组合

这样,一个带文字和图片的组合按钮控件就完成了。这样梳理一下,使用还是非常简单的。下面,我们再来看一个例子,自定义一个控件,显示带有边框的字。我们新建一个类继承TextView,然后重写它的onDraw方法,部分代码如下:


private Canvas canvas = new Canvas();

public MyTextView(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

this.canvas = canvas;

Rect rec = canvas.getClipBounds();

Paint paint = new Paint();

paint.setColor(Color.WHITE);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(2);

canvas.drawRect(rec, paint);

}

然后,我们在需要使用这个自定义控件的layout中加入这控件:


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

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

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<com.char2.MyTextView

android:layout_centerInParent="true"

android:id="@+id/my_button"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:text="自定义控件"

android:textSize="24sp"/>

</RelativeLayout>

效果如图2-19所示:

图2-19 重写控件onDraw方法

可以看到,带有边框的字已经实现了。

时间: 2024-08-01 22:45:37

第二章 吸引你的眼球—UI编程(6)的相关文章

第二章 吸引你的眼球—UI编程(1)

第二章 吸引你的眼球-UI编程 学习Android应用程序的开发技术,除了先要熟悉相关工具以外,最直接的,就是学习如何使用各种UI组件.我们开发的应用程序,一般都会包含一组用户可见的界面,而这些界面就是由一个个的AndroidUI组件组成的.我们在学习界面开发技术的过程中,首先就要熟悉这些组件,然后才能将它们有效的组织起来,构成一个美观.合理的界面. 本章会先详细讲解一些常用的UI组件,及如何自定义组件,然后会说明一些其它常用的UI编程技术. 2.1 UI基础-常用UI组件 Android的组件

第二章 吸引你的眼球—UI编程(4)

2.1.6图片拖动-拖动效果(Gallery) 一个应用如果有非常炫的效果相信也可以吸引不少人的眼球.Gallery就是一个非常炫的效果,你可以用手指直接拖动图片进行移动,iPhone刚出现的时候,这个效果就吸引了无数的苹果粉丝为之疯狂,在Android平台上也可以实现这一效果.下面,我们以一个简单的像册例子来加以说明. 1)在布局文件中定义一个Gallery(用来展示图片)和一个TextView(用来监听Gallery点击事件). <Gallery android:id="@+id/my

第二章 吸引你的眼球—UI编程(3)

2.1.4图片显示-图片视图(ImageView) 如果一个界面全是由文字组成的,那这个界面一定是枯燥而乏味的.因此,在合适的位置,放上一些合适的图片,不仅能大大增加界面的美观,还能使你的应用更加吸引人.在Android中,要实现在界面上显示图片有很多种方法,在这里,我们介绍一下最常用的图片视图组件(ImageView).ImageView用来显示任意图像图片,我们可以自己来定义显示的尺寸和颜色等.我们还是举个例子来看看ImageView是怎么使用的. 首先,在布局文件中定义ImageView组

第二章 吸引你的眼球—UI编程(7)

2.3简单明了的消息提示框(Toast)和对话框(Dialog) 2.3.1Toast提示 很多时候,我们需要对用户提供一些提示信息.比如,当用户登入应用程序时,提示用户"应用程序需要更新":当用户在输入框输入文本时,提示用户"最多能输入30个字符".这些需求,Toast轻松就能搞定! Toast是Android提供的"快显讯息"类.Toast使用起来非常简单,只需要简单的代码就能实现. Toast.makeText(Context contex

第二章 吸引你的眼球—UI编程(8)

2.4 Menu键的呼唤-Menu菜单 使用Android手机的朋友应该对手机的"Menu"键都不陌生吧.它使用起来方便.快捷,不需要占用应用的界面,正因为它的这些特性,我们现在有很多的应用都使用了Menu-菜单键. Menu菜单有好几种类型,它们各有各的展现形式,分别使用在不同的场合,以下我们逐一对它们进行介绍. 1)普通的Menu(选项菜单) 这是我们平时使用最多.也是最常见的菜单,它就是当用户单击设备上的菜单按键时弹出的菜单.它最多只能显示6个,超过6个则第六个自动显示"

第二章 吸引你的眼球—UI编程(2)

2.1.3文本编辑-编辑框(EditText) EditText在我们开发中也是经常要用到的组件.比如,要实现一个登录界面,需要用户输入帐号.密码.邮件等信息,这里就需要使用EditText组件来获得用户输入的内容,下面,我们就以一个登录界面为例,来看看EditText是怎么使用的. 1)在布局文件中定义一个TextView(用来响应按钮事件),两个EditText组件(一个用来记录用户名,一个用来记录密码)一个登录按钮和一个取消按钮,代码如下: <?xml version="1.0&qu

第二章 吸引你的眼球—UI编程(5)

2.1.7列表组件(ListView) ListView在Android中也是一个使用比较频繁的组件.它相对于其他的基本组件来说,使用起来稍微复杂一些,需要注意的也比较多,尤其是和其他一些组件组合起来使用的情况. 在Android中,ListView用来显示一个列表的组件,它以列表的形式展示具体的内容,并且能够根据数据的长度自适应显示.用户可以选择并操作这个列表,同时会触发相应的事件:当鼠标滚动时会触发setOnItemSelectedListener事件:当点击列表时会触发setOnItemC

第二章:线程安全性——java并发编程实战

一个对象是否需要是线程安全的取决于它是否被多个线程访问. 当多个线程访问同一个可变状态量时如果没有使用正确的同步规则,就有可能出错.解决办法: 不在线程之间共享该变量 将状态变量修改为不可变的 在访问状态变量时使用同步机制 完全由线程安全类构造的程序也不一定是线程安全的,线程安全类中也可以包含非线程安全的类 一.什么是线程安全性 线程安全是指多个线程在访问一个类时,如果不需要额外的同步,这个类的行为仍然是正确的.(因为线程安全类中封装了必要的同步代码) 一个无状态的类是线程安全的.无状态类是指不

大道至简(第二章)读后感

在读过<大道至简>第一章后给了我学好编程的信心,明白了编程并不是学不会只是自己的态度不对.之后我又开始阅读第二章,第二章的题目一下子吸引了我,因为我正是懒人一枚,看到题目后感觉好亲切(窃喜,懒人还是蛮有价值的嘛). 如同第一章一样,作者还是以典故开篇,引人入胜,开篇为<华阳志>里面的一段话,“樊道有蜀王兵阑,亦有神作大江滩中.其崖斩竣不可破,(冰)乃积薪烧之.”作者通过典故说服了我,原来真的是懒人创造了方法,如果李冰如同愚公一般勤劳,他肯定是不会想到积薪烧之的.我也通过这个故事看到