android自定义View的实现原理

如果说要按类型来划分的话,自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件。那么下面我们就来依次学习一下,每种方式分别是如何自定义View的。

一、自绘控件

自绘控件的意思就是,这个View上所展现的内容全部都是我们自己绘制出来的。绘制的代码是写在onDraw()方法中的,而这部分内容我们已经在 Android视图绘制流程完全解析,带你一步步深入了解View(二) 中学习过了。

下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次。新建一个CounterView继承自View,代码如下所示:

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
<?xml version= "1.0"  encoding= "utf-8" ?>  
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"  
     android:layout_width= "match_parent"  
     android:layout_height= "50dp"  
     android:background= "#ffcb05"  >  
   
     <Button  
         android:id= "@+id/button_left"  
         android:layout_width= "60dp"  
         android:layout_height= "40dp"  
         android:layout_centerVertical= "true"  
         android:layout_marginLeft= "5dp"  
         android:background= "@drawable/back_button"  
         android:text= "Back"  
         android:textColor= "#fff"  />  
   
     <TextView  
         android:id= "@+id/title_text"  
         android:layout_width= "wrap_content"  
         android:layout_height= "wrap_content"  
         android:layout_centerInParent= "true"  
         android:text= "This is Title"  
         android:textColor= "#fff"  
         android:textSize= "20sp"  />  
   
</RelativeLayout>

在这个布局文件中,我们首先定义了一个RelativeLayout作为背景布局,然后在这个布局里定义了一个Button和一个TextView,Button就是标题栏中的返回按钮,TextView就是标题栏中的显示的文字。

接下来创建一个TitleView继承自FrameLayout,代码如下所示:

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
public  class  TitleView  extends  FrameLayout {  
   
     private  Button leftButton;  
   
     private  TextView titleText;  
   
     public  TitleView(Context context, AttributeSet attrs) {  
         super (context, attrs);  
         LayoutInflater.from(context).inflate(R.layout.title,  this );  
         titleText = (TextView) findViewById(R.id.title_text);  
         leftButton = (Button) findViewById(R.id.button_left);  
         leftButton.setOnClickListener( new  OnClickListener() {  
             @Override  
             public  void  onClick(View v) {  
                 ((Activity) getContext()).finish();  
             }  
         });  
     }  
   
     public  void  setTitleText( String  text) {  
         titleText.setText(text);  
     }  
   
     public  void  setLeftButtonText( String  text) {  
         leftButton.setText(text);  
     }  
   
     public  void  setLeftButtonListener(OnClickListener l) {  
         leftButton.setOnClickListener(l);  
     }  
   
}

TitleView中的代码非常简单,在TitleView的构建方法中,我们调用了LayoutInflater的inflate()方法来加载刚刚定义的title.xml布局,这部分内容我们已经在 Android LayoutInflater原理分析,带你一步步深入了解View(一) 这篇文章中学习过了。

接下来调用findViewById()方法获取到了返回按钮的实例,然后在它的onClick事件中调用finish()方法来关闭当前的Activity,也就相当于实现返回功能了。

另外,为了让TitleView有更强地扩展性,我们还提供了setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法,分别用于设置标题栏上的文字、返回按钮上的文字、以及返回按钮的点击事件。

到了这里,一个自定义的标题栏就完成了,那么下面又到了如何引用这个自定义View的部分,其实方法基本都是相同的,在布局文件中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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"  >  
   
     <com.example.customview.TitleView  
         android:id= "@+id/title_view"  
         android:layout_width= "match_parent"  
         android:layout_height= "wrap_content"  >  
     </com.example.customview.TitleView>  
   
</RelativeLayout> 
 
这样就成功将一个标题栏控件引入到布局文件中了,运行一下程序。
 
现在点击一下Back按钮,就可以关闭当前的Activity了。如果你想要修改标题栏上显示的内容,或者返回按钮的默认事件,只需要在Activity中通过findViewById()方法得到TitleView的实例,然后调用setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法进行设置就OK了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值