Android UI编程之自定义控件初步——ImageButton

我想我们在使用一些App的时候,应该不会出现一些“裸控件”的吧。除非是一些系统中的软件,那是为了保持风格的一致性,做出的一些权衡。我这里并非是在指责Android原生的控件不好看,说实在的,我很喜欢Android的一些原生控件。只是有些时候为了风格的一致性,就不得不去花些功夫在美工上。这于美工这一点,我对某讯的产品的确欣赏。下面就让我们开始一点一点学习Android UI编程中的自定义控件。

 

分析:

自定义控件就点像堆积木,并给它涂上颜色,和功能说明。下面就让我们用一个例子来逐一地简单讨论一下。

 

示例分析:

效果图展示:

本示例将选取ImageButton来做一个简单地分析。下面先来看看运行效果图:

\ \ \

 

搭建基本雏形:

对于雏形,首先要做的是积木的选择。我们选择的是一个ImageView和一个TextView,上下摆放,然后用一个约束将其绑定在一起。如下所示的代码片段:

 

?
1
2
3
4
5
6
7
8
<!--?xml version= 1.0 encoding=utf- 8 ?-->
<linearlayout android:gravity= "center_vertical" android:layout_height= "fill_parent" android:layout_width= "fill_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <imageview android:id= "@+id/imageView1" android:layout_gravity= "center_horizontal" android:layout_height= "wrap_content" android:layout_width= "wrap_content" android:paddingbottom= "5dip" android:paddingtop= "5dip" android:src= "@drawable/right_icon" >
 
     <textview android:id= "@+id/textView1" android:layout_gravity= "center_horizontal" android:layout_height= "wrap_content" android:layout_margintop= "5dp" android:layout_width= "wrap_content" android:text= "确定" android:textcolor= "#000000" >
 
</textview></imageview></linearlayout>

上面的代码只能让我们得到一个如上所示的中间方形图和下方的文本以及紧贴在这两者边缘的一个约束。

 

 

外观设计和功能添加:

外观设计:

现在我们就要进行颜色分配和功能说明了,它被实现在Java代码中了。如下关键代码:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
      * 设置图片资源
      */
     public void setImageResource( int resId) {
         imageView.setImageResource(resId);
     }
 
     /**
      * 设置显示的文字
      */
     public void setTextViewText(String text) {
         textView.setText(text);
     }

 

 

功能添加:

而对于此我们仅仅只是让这个“Button”更好看了一些罢了。于是我们现在还要做另外一件事。例如点击后要有一些指定的、绑定死的、使用这个控件所必然会进行的操作。其实和上面的加外套是一个性质。如下关键代码:

 

?
1
2
3
4
5
6
7
8
9
10
@Override
     public void setOnClickListener(OnClickListener l) {
         auxiliaryFunction();
         
         super .setOnClickListener(l);
     }
     
     protected void auxiliaryFunction() {
         Log.i(TAG, log message.);
     }

上面添加的额外功能,我们可以在Log日志中查看是否有真的完成。

 

既然是自定义,当然这里的ImageButton原始构建不会是Button。如下真相代码:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class ImageButton extends LinearLayout {
 
     private ImageView imageView;
     private TextView textView;
 
     public ImageButton(Context context) {
         super (context);
     }
 
     public ImageButton(Context context, AttributeSet attrs) {
         super (context, attrs);
         LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         inflater.inflate(R.layout.image_button, this );
         imageView = (ImageView) findViewById(R.id.imageView1);
         textView = (TextView) findViewById(R.id.textView1);
     }
 
     /**
      * 设置图片资源
      */
     public void setImageResource( int resId) {
         imageView.setImageResource(resId);
     }
 
     /**
      * 设置显示的文字
      */
     public void setTextViewText(String text) {
         textView.setText(text);
     }
 
     @Override
     public void setOnClickListener(OnClickListener l) {
         auxiliaryFunction();
         
         super .setOnClickListener(l);
     }
     
     protected void auxiliaryFunction() {
         Log.i(TAG, log message.);
     }
}

 

 

使用分析:

 

1.xml代码中的使用

这里只是有一点需要注意,我们要指明自定义控件的完整路径,如下:

 

?
1
<com.demo.customview.imagebutton.widgets.imagebutton android:background= "@drawable/custom_button" android:id= "@+id/btn_right" android:layout_height= "150dp" android:layout_width= "150dp" ></com.demo.customview.imagebutton.widgets.imagebutton>

 

 

2.动作效果配置

对于Button的动作也就是触摸、按下和抬起,对于这三个动作效果的配置需要在res包下的drawable文件夹中去创建(没有这个文件夹就新建一个)。如下代码:

 

?
1
2
3
4
5
6
7
8
<!--?xml version= 1.0 encoding=utf- 8 ?-->
<selector xmlns:android= "http://schemas.android.com/apk/res/android" >
 
     <item android:drawable= "@drawable/button_unpress_background" android:state_focused= "true" android:state_pressed= "false" ></item>
     <item android:drawable= "@drawable/button_pressed_background" android:state_pressed= "true" ></item>
     <item android:drawable= "@drawable/button_unpress_background" android:state_focused= "false" android:state_pressed= "false" ></item>
 
</selector>

 

 

3.Java代码中的使用

在Java代码的使用与Button无异,如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MainActivity extends Activity {
 
     private ImageButton mImageBtn1;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
 
         mImageBtn1 = (ImageButton) this .findViewById(R.id.btn_right);
         mImageBtn1.setTextViewText(确定);
         mImageBtn1.setImageResource(R.drawable.right_icon);
 
         mImageBtn1.setOnClickListener( new View.OnClickListener() {
 
             public void onClick(View v) {
                 Toast.makeText(getApplicationContext(), 点击确定, 0 ).show();
             }
         });
     }
}
 

结伴旅游,一个免费的交友网站:www.jieberu.com

推推族,免费得门票,游景区:www.tuituizu.com

转载于:https://www.cnblogs.com/rabbit-bunny/p/4265300.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值