新书内容连载(1):自定义Android组件之带图像的TextView

简介:

本文为原创,如需转载,请注明作者和出处,谢谢!

本文为新书《Android/OPhone 开发完全讲义》的内容连载。《Android/OPhone开发完全讲义》一书现已出版,敬请关注。

购 买: 互动网

《Android/OPhone 开发完全讲义》目录

源代码下载


    在本例中要实现一个可以在文本前方添加一个 图像(可以是任何Android系统支持的图像格式)的TextView组件。在编写代码之前,先看一下Android组件的配置代码。

< TextView  android:id ="@+id/textview1"  android:layout_width ="fill_parent"
        android:layout_height
="wrap_content"  android:text ="textview1"  />

     在构造方法中可以通过AttributeSet接口的相应getter方法来读取指定的属性值,如果 在配置属性时指定了命名空间,需要在使用getter方法获得属性值时指定这个命名空间,如果未指定命名空间,则将命名空间设为null即可。

    IconTextView是本例要编写的组件类,该类从TextView继承,在onDraw方法中将TextView中的文本后移,并在文本的前方添加了一个图像,该图像的资源ID通过mobile:iconSrc属性来指定。IconTextView类的代码如下:

package net.blogjava.mobile.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;

public  class IconTextView  extends TextView
{
     //   命名空间的值
     private  final String namespace = "http://net.blogjava.mobile";
     //   保存图像资源ID的变量
     private  int resourceId = 0;
     private Bitmap bitmap;
     public IconTextView(Context context, AttributeSet attrs)
    {
         super(context, attrs);
         //   getAttributeResourceValue方法用来获得组件属性的值,在 本例中需要通过该方法的第1个参数指
         
//   定命名空间的值。该方法的第2个参数表示组件属性名(不包括命名空间名称),第3个 参数表示默
         
//   认值,也就是如果该属性不存在,则返回第3个参数指定的值
        resourceId = attrs.getAttributeResourceValue(namespace, "iconSrc", 0);
         if (resourceId > 0)
               //   如果成功获得图像资源的ID,装载这个图像资源,并创建Bitmap对象
            bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
    }
    @Override
     protected  void onDraw(Canvas canvas)
    {
         if (bitmap !=  null)
        {
             //   从原图上截取图像的区域,在本例中为整个图像
            Rect src =  new Rect();
             //   将截取的图像复制到bitmap上的目标区域,在本例中与复制区域相同
            Rect target =  new Rect();
            src.left = 0;
            src.top = 0;
            src.right = bitmap.getWidth();
            src.bottom = bitmap.getHeight();
             int textHeight = ( int) getTextSize();
            target.left = 0;
             //   计算图像复制到目标区域的纵坐标。由于TextView组件的文本内容并不是
              
//   从最顶端开始绘制的,因此,需要重新计算绘制图像的纵坐标
            target.top = ( int) ((getMeasuredHeight() - getTextSize()) / 2) + 1;
            target.bottom = target.top + textHeight;
             //   为了保证图像不变形,需要根据图像高度重新计算图像的宽度
            target.right = ( int) (textHeight * (bitmap.getWidth() / ( float) bitmap.getHeight()));
             //   开始绘制图像
            canvas.drawBitmap(bitmap, src, target, getPaint());
             //   将TextView中的文本向右移动一定的距离(在本例中移动了图像宽度加2个象素 点的位置)
            canvas.translate(target.right + 2, 0);
        }
         super.onDraw(canvas);
    }
}

 

在编写上面代码时需要注意如下3点:
1.  需要指定命名空间的值。该值将在<LinearLayout>标签的xmlns:mobile属性中定义。
2.  如果在配置组件的属性时指定了命名空间,需要在AttributeSet 接口的相应getter方法中的第1个参数指定命名空间的值,而第2个参数只需指定不带命名空间的属性名即可。
3.  TextView类中的onDraw方法一定要在translate方法后面执行,否则系统不会移动TextView中的文本。

运行本实例后,将显示如图 1 所示的效果。

    注意:虽然很多人认为组件的属性必须以android命名空间开头,该命名空间的值必须是http://schemas.android.com/apk/res/android。实际上,只是命名空间的值必须是http://schemas.android.com/apk/res/android而已,命名空间的名称可以是任何值,如下面的代码所示:

<? xml version="1.0" encoding="utf-8" ?>
<!--   将android换成了abcd   -->
< LinearLayout  xmlns:abcd ="http://schemas.android.com/apk/res/android"
    abcd:orientation
="vertical"  abcd:layout_width ="fill_parent"
    abcd:layout_height
="fill_parent" >
      
</ LinearLayout >

 
下一篇:新书内容连载(2):Android Activity的生命周期

本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2010/04/29/1723497.html如需转载请自行联系原作者


银河使者

相关文章
|
29天前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
1月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
66 0
|
7天前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
9天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
21 5
|
1月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
Android开发 Java 数据格式
Android组件系列(1):自动完成输入内容的组件(AutoCompleteTextView )
本文为原创,如需转载,请注明作者和出处,谢谢!     AutoCompleteTextView 和 EditText 组件类似,都可以输入文本。
1114 0
|
Android开发 Java 数据格式
Android 组件系列(1):自动完成输入内容的组件(AutoCompleteTextView )
本文为原创,如需转载,请注明作者和出处,谢谢!     AutoCompleteTextView和EditText组件类似,都可以输入文本。但AutoCompleteTextView组件可以和一个字符串数组或List对象绑定,当用户输入两个及以上字符时,系统将在AutoCompleteTextView组 件下方列出字符串数组中所有以输入字符开头的字符串,这一点和www.Google.com的搜索框非常相似,当输入某一个要查找的字符串时,Google搜索框就会列出以这个字符串开头 的最热门的搜索字符串列表。
860 0
|
2天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
1天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
10 2
|
2天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
下一篇
无影云桌面