首页 > 代码库 > 第二章 吸引你的眼球—UI编程(6)

第二章 吸引你的眼球—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方法

 

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

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